Releases: phaserjs/phaser
Phaser v3.85.0 Beta 1
Version 3.85.0 - Itsuki - in development
New Features
BaseSoundManager.isPlaying
is a new method that will return a boolean if the given sound key is playing. If you don't provide a key, it will return a boolean if any sound is playing (thanks @samme)WebGLRenderer.dispatchContextLost
is a new internal method that is called when the WebGL context is lost. By default this is bound to the propertyWebGLRenderer.contextLostHandler
. If you override the context loss handler, be sure to invoke this method in due course.WebGLRenderer.dispatchContextRestore
is a new internal method that is called when the WebGL context is restored. By default this is bound to the propertyWebGLRenderer.contextRestoreHandler
. If you override the context restore handler, be sure to invoke this method in due course.WebGLRenderer.setContextHandlers
is a new internal method with 2 optional parameters:contextLost
andcontextRestored
. These allow you to overwrite the defaultcontextLostHandler
andcontextRestoreHandler
handlers. (thanks @yaustar)Phaser.Textures.Frame#setCutPosition
is a new internal method with 2 optional parameters:x
andy
. These sets the x and y position within the source image to cut from.Phaser.Textures.Frame#setCutSize
is a new internal method with 2 parameters:width
andheight
. These sets the width, and height of the area in the source image to cut. (thanks @FelipeIzolan)- Introduced new constants in
ORIENTATION_CONST.js
. The constantsLANDSCAPE_SECONDARY
andPORTRAIT_SECONDARY
have been added to thePhaser.Scale.Orientation
object. These constants represent the secondary landscape and portrait orientations respectively. This addition provides more granular control over device orientation handling in Phaser. Fix #6837 (thanks @rexrainbow)
WebGL Rendering Updates
WebGLTextureWrapper.update
expanded:source
parameter is now type?object
, so it can be used for anything that is valid in the constructor.- New
format
parameter can update the texture format.
Updates
- Calling
Timeline.pause
will now pause any currently active Tweens that the Timeline had started (thanks @monteiz) - Calling
Timeline.resume
will now resume any currently paused Tweens that the Timeline had started (thanks @monteiz) - Calling
Timeline.clear
andTimeline.destroy
will now destroy any currently active Tweens that the Timeline had created. Previously, active tweens would continue to play to completion (thanks @monteiz) TimelineEvent
has a new property calledtweenInstance
. If the Timeline event has a tween that has been activated, this will hold a reference to it.- If you create a BitmapText with an invalid key it will now throw a runtime error. Previously it just issued a console warning and then crashed (thanks @samme)
- The console warnings when Audio files are missing/incorrect have been improved (thanks @samme)
- The
requestVideoFrame
polyfill has been updated to the latest release, which should resolve some SSR framework issues. Fix #6776 (thanks @lantictac) ScaleManager
listeners includes checks for thescreen.orientation
object and adds/removes achange
eventListener method to handle screen orientation changes on mobile devices. Theorientationchange
event is still maintained for backwards compatibility. Fix #6837 (thanks @rexrainbow)
Bug Fixes
- The
activePointers
game config option is now the correct amount of touch input pointers set. Fix #6783 (thanks @samme) - The method
TextureManager.checkKey
will now returnfalse
if the key is not a string, which fixes issues where a texture could be created if a key was given that was already in use (thanks Will Macfarlane). - Added all of the missing Loader Config values (such as
imageLoadType
) to LoaderConfig, so they now appear in the TypeScript defs. - The
EXPAND
scale mode had a bug that prevented it from using the world bounds cameras, cutting rendering short. Fix #6767 (thanks @Calcue-dev @rexrainbow) - Calling
getPipelineName()
on a Game Object would cause a runtime error if running under Canvas. It now simply returnsnull
. Fix #6799 (thanks @samme) - Calling the Arcade Body
setPushable(false)
method forcircle
bodies prevents the bodies from being pushed. Fix #5617 (thanks @kainage) - Calling
addDeathZone()
on a particle emitter Game Object had a bug where theDeathZone
used world position coordinates.DeathZone
now uses local position coordinates following the particle emitter position. Fix #6371 (thanks @vforsh) - Updated the
GetLineToLine
method inGetLineToLine.js
to handle the case wheredx1
ordy1
values is zero. This ensures the function correctly returnsnull
in this case to prevent errors in calculations involving line segments. Fix #6579 (thanks @finscn) - Resolved all kerning issues in WebGL bitmap text rendering. This includes adjustments to glyph positioning and spacing, ensuring accurate and visually pleasing text display across all WebGL contexts. Fix #6631 (thanks @monteiz)
- Resolved an issue in
GetBitmapTextSize.js
where an extra empty line was added whensetMaxWidth
was called, and the width of the line was less than a word. Previously,yAdvance
was incorrectly incremented bylineHeight + lineSpacing
for each word, leading to an unintended increase in vertical space. The correction now calculatesyAdvance
based on thecurrentLine
index, ensuring that vertical spacing accurately reflects the number of lines. Fix #6807 (thanks @AlvaroNeuronup)
Input Bug Fixes
- The method
pointer.leftButtonReleased
will now returntrue
when multiple mouse buttons are being pressed. - The method
pointer.rightButtonReleased
will now returntrue
when multiple mouse buttons are being pressed. - The method
pointer.middleButtonReleased
will now returntrue
when multiple mouse buttons are being pressed. - The method
pointer.backButtonReleased
will now returntrue
when multiple mouse buttons are being pressed. - The method
pointer.forwardButtonReleased
will now returntrue
when multiple mouse buttons are being pressed. Fix #6027 (thanks @michalfialadev)
Examples, Documentation, Beta Testing and TypeScript
Thanks to the following for helping with the Phaser Examples, Beta Testing, Docs, and TypeScript definitions, either by reporting errors, fixing them, or helping author the docs:
@lgtome
@samme
@AlbertMontagutCasero
@rexrainbow
Deprecation Warning for the next release
The next release of Phaser will make the following API-breaking changes:
- We are removing
Phaser.Struct.Map
and replacing it with a regular JSMap
instance. This means methods likecontains
andsetAll
will be gone. - We are removing
Phaser.Struct.Set
and replacing it with a regular JSSet
instance. This means methods likeiterateLocal
will be gone. - The
Create.GenerateTexture
, all of the Create Palettes and thecreate
folder will be removed. - The
phaser-ie9.js
entry-point will be removed along with all associated polyfills.
Phaser v3.80.1
Please also see the 3.80 Change Log for details about the major 3.80 release.
Bug Fixes
- Fix
RenderTexture
crashing in the presence of a light. - Fix failure to restore compressed textures after WebGL context loss.
- Fix a single WebGL error, with no visual side-effects, from occurring while calling
Shader.setRenderToTexture()
after the game has started running. Actually, the root cause was leaving new WebGL textures bound after creation. - Ensure that
TextureSource.setFlipY
always updates the texture. - Remove unsynced
flipY
from render textures inShader
andDynamicTexture
. - Reverted a change made in
TouchManager
that would prevent clicks from outside the game window from being registered. Fix #6747 (thanks @ulsoftnaver @jaxtheking)
Updates
- Modified
onMouseUpWindow
andonMouseDownWindow
in theMouseManager
so they now check forsourceCapabilities.firesTouchEvents
and if found, abort registering the event. This new browser event property is designed to prevent you accidentally registering a Mouse Event when a Touch Event has just occurred (see https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceCapabilities/firesTouchEvents)
Phaser v3.80.0
New Features - WebGL Context Loss Handling
- Phaser now performs a WebGL Context Restore to keep the game running after losing WebGL context. This affects many parts of the rendering system, but everything should work just the same unless you're doing something very technical. See the link for more details.
New Feature - Base64 Loader
The Phaser LoaderPlugin and related classes have been updated so that they now work natively with base64 encoded files and Data URIs. This means you can now load a base64 encoded image, audio file or text file directly into the Loader. The Loader will then decode the data and process it as if it was a normal file. This is particularly useful for environments such as Playable Ads where you have to provide a single html file with all assets embedded and no XHR requests.
Loader.File.base64
is a new read-only boolean property that is set if the file contains a Data URI encoded string.Loader.File.onBase64Load
is a new method that is called when the file has finished decoding from a Data URI.- The
ImageFile
will now default to using the Image Load Element if a base64 file is detected, instead of throwing a console warning about unsupported types. - The
XHRLoader
will now return a fake XHR result object containing the decoded base64 data if a base64 file is detected, skipping the creation of a real XML Http Request object.
New Feature - Scale Manager Snap Mode
The Game Config has a new Scale Manager property called snap
. This allows you to set a 'snapping' value for the width and height of your game. This is especially useful for games where you want to keep a fixed dimension: for example, you want the game to always snap to a multiple of 16 pixels for the width. Or, if you want to scale a pixel-art game up by integer values, you can now set the game size as the snap
value and the Scale Manager will ensure the game size is always a multiple of that value.
- A new property is available in the Game Configuration specifically for setting the 'snap' values for the Scale Manager. You can now set
snap: { width, height }
in the game config. This is then passed to the display size by the Scale Manager and used to control the snap values. Fix #6629 (thanks @musjj @samme) ScaleManager.setSnap
is a new method that allows you to set the snap values for the game size, should you need to do it post-boot and not in the game config.Config#snapWidth
andConfig#snapHeight
are new properties in the Game Config that hold the parsedsnap
config values, as used by the Scale Manager.
New Features
- The Scale Manager has a new scale mode called
EXPAND
. This is inspired by the Expand mode in Godot: "Keep aspect ratio when stretching the screen, but keep neither the base width nor height. Depending on the screen aspect ratio, the viewport will either be larger in the horizontal direction (if the screen is wider than the base size) or in the vertical direction (if the screen is taller than the original size)" (thanks @rexrainbow) - The
Tilemap.createFromTiles
method has been updated. It will now copy the following properties, if set in the Tile, to the Sprites it creates:rotation
,flipX
,flipY
,alpha
,visible
andtint
. If these properties are declared in thespriteConfig
passed to the method, those will be used instead, otherwise the Tile values are used. Fix #6711 (thanks @Nerodon) - The
Tilemap.createFromTiles
method has a new property calleduseSpriteSheet
. If this is set totrue
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. Also, if you have not specified anorigin
in the spriteConfig, it will adjust the sprite positions by half the tile size, to position them accurately on the map. Texture#getFrameBounds
is a new method that will return the bounds that all of the frames of a given Texture Source encompass. This is useful for things like calculating the bounds of a Sprite Sheet embedded within a Texture Atlas.Math.RectangleLike
is a new typedef that defines a rectangle-like object with publicx
,y
,width
andheight
properties.
WebGL Renderer Updates
- Fix MIPmap filters being effectively disabled for compressed textures.
WebGLRenderer.getCompressedTextures
can now identify BPTC and RGTC support correctly. These were previously skipped.- PVR compressed texture files now support sRGB color space in S3TCSRGB, ETC, and ASTC formats. Fix #6247 (thanks @dominikhalvonik)
- Compressed texture files which are incompatible with WebGL will now fail to load, and display a console warning explaining why. Previously they might seem to load, but not display properly.
- Add experimental support for BPTC compressed textures in PVR files.
- Change
S3TCRGB
toS3TCSRGB
inWebGLTextureCompression
,CompressedTextureFileConfig
, andFileConfig
typedefs. - Fix generating spritesheets from members of texture atlases based on compressed textures (thanks @vladyslavfolkuian)
- The
BloomFX
andBlurFX
and any custom pipeline that relies on using theUtilityPipeline
full or half frame targets will now correctly draw even after the renderer size changes. Fix #6677 (thanks @Nerodon) - The
PostFXPipeline.postBatch
method will now bind the current Render Target after the pipeline has booted for the first time. This fixes glitch errors on mobile devices where Post FX would appear corrupted for a single frame. Fix #6681 (thanks @moufmouf @tongliang999) - Fix unpredictable text sizes failing to render in WebGL with
mipmapFilter
set. Fix #6721 (thanks @SaintFlow and @rexrainbow) - The
UtilityPipeline
now setsautoResize
totrue
in its Render Target Config, so that the globalfullFrame
andhalfFrame
Render Targets will automatically resize if the renderer changes. WebGLPipeline.resizeUniform
is a new property that is defined in theWebGLPipelineConfig
. This is a string that defines auResolution
property, or similar, within the pipeline shader. If the WebGL Renderer resizes, this uniform will now be updated automatically as part of the pipeline resize method. It has been added to both the Multi and Mobile pipelines as default. This fixes issues where the pipelines were rendering with old resolution values, causing graphical glitches in mostly pixel-art games. Fix #6674 #6678 (thanks @Nerodon @LazeKer)
Spine Updates
- The Spine 3 and 4.1 Plugins will now call
preUpdate
automatically when theplay
method is called. This forces the new animation state to update and apply itself to the skeleton. This fixes an issue where Spine object would show the default frame in the Spine atlas for a single update before the animation started. Fix #5443 (thanks @spayton) SpineGameObject.setSlotAlpha
is a new method that allows you to set the alpha on a specific slot in a Spine skeleton.- The
SpineGameObject.setAlpha
method has had its 2nd parameter removed. This fixes needless slot look-ups during rendering when a Spine Game Object is inside a regular Container. If you need to set slot alpha, use the newsetSlotAlpha
method instead. Fix #6571 (thanks @spayton) - The
SpineFile.onFileComplete
handler was running a regular expression againstfile.src
instead offile.url
, sometimes leading to double paths in the atlas paths on loading. Fix #6642 (thanks @rez23)
Input Updates
The Phaser Input and related classes have been updated to be more consistent with each Game Object.
- If you enable a Game Object for Input Debugging, the debug shape will no longer be rendered if the Game Object itself is not visible. Fix #6364 (thanks @orjandh)
Mesh
based Game Objects now can use an input config with thesetInteractive
method, which supports the optionsdraggable
,dropzone
,cursor
anduserHandCursor
. Fix #6510 #6652 (thanks @Baegus @Neppord)- The touch event handler
onTouchEndWindow
now stops pointer events when clicking through DOM elements to input. Fix #6697 (thanks @laineus) - The
Input.InputPlugin
methoddisable
which is called byGameObjects.GameObject#disableInteractive
keeps its temp hit box value which stops propagation to interactive Game Objects in another scene. Fix #6601 (thanks @UnaiNeuronUp) - Using
setInteractive
andremoveInteractive
methods of a Game Object outside of the game loop would cause an error in whichInput.InputManager#resetCursor
would lose input context. Fix #6387 (thanks @TomorrowToday)
Updates
- The
TweenChainBuilder
was incorrectly setting thepersist
flag on the Chain totrue
, which goes against what the documentation says. It now correctly sets it tofalse
. This means if you previously had a Tween Chain that was persisting, it will no longer do so, so add the property to regain the feature. - The
dropped
argument has now been added to the documentation for theDRAG_END
andGAMEOBJECT_DRAG_END
events. (thanks @samme) Container.onChildDestroyed
is a new internal method used to destroy Container children. Previously, if you destroyed a Game Object in an exclusive Container, the game object would (momentarily) move onto the Scene display list and emit an ADDED_TO_SCENE event. Also, if you added a Sprite to a non-exclusive Container and stopped the Scene, you would get a TypeError (evaluating 'this.anims.destroy'). This happened because the fromChild argument in the DESTROY event was misinterpreted as destroyChild in the Container's remove(), and the Container was calling the Sprite's destroy() again. (thanks @samme)- The
Text
andTileSprite
Game Objects now place their textures into the globalTextureManager
and a_textureKey
private string property has been added which contains a UUID to reference that texture. - The
Tilemaps.Components.WeightedRandomize
method now uses the PhaserMath.RND.frac
method with a seed instead ...
Phaser v3.80.0 Beta 2
Version 3.80.0 - Nino - in dev
New Features
- The Scale Manager has a new scale mode called
EXPAND
. This is inspired by the Expand mode in Godot: "Keep aspect ratio when stretching the screen, but keep neither the base width nor height. Depending on the screen aspect ratio, the viewport will either be larger in the horizontal direction (if the screen is wider than the base size) or in the vertical direction (if the screen is taller than the original size)" (thanks @rexrainbow) - Phaser now performs a WebGL Context Restore to keep the game running after losing WebGL context. This affects many parts of the rendering system, but everything should work just the same unless you're doing something very technical. See the link for more details.
New Features - Base64 Loader
The Phaser LoaderPlugin and related classes have been updated so that they now work natively with base64 encoded files and Data URIs. This means you can now load a base64 encoded image, audio file or text file directly into the Loader. The Loader will then decode the data and process it as if it was a normal file. This is particularly useful for environments such as Playable Ads where you have to provide a single html file with all assets embedded and no XHR requests.
Loader.File.base64
is a new read-only boolean property that is set if the file contains a Data URI encoded string.Loader.File.onBase64Load
is a new method that is called when the file has finished decoding from a Data URI.- The
ImageFile
will now default to using the Image Load Element if a base64 file is detected, instead of throwing a console warning about unsupported types. - The
XHRLoader
will now return a fake XHR result object containing the decoded base64 data if a base64 file is detected, skipping the creation of a real XML Http Request object.
Spine Updates
- The Spine 3 and 4.1 Plugins will now call
preUpdate
automatically when theplay
method is called. This forces the new animation state to update and apply itself to the skeleton. This fixes an issue where Spine object would show the default frame in the Spine atlas for a single update before the animation started. Fix #5443 (thanks @spayton) SpineGameObject.setSlotAlpha
is a new method that allows you to set the alpha on a specific slot in a Spine skeleton.- The
SpineGameObject.setAlpha
method has had its 2nd parameter removed. This fixes needless slot look-ups during rendering when a Spine Game Object is inside a regular Container. If you need to set slot alpha, use the newsetSlotAlpha
method instead. Fix #6571 (thanks @spayton) - The
SpineFile.onFileComplete
handler was running a regular expression againstfile.src
instead offile.url
, sometimes leading to double paths in the atlas paths on loading. Fix #6642 (thanks @rez23)
Updates
- The
TweenChainBuilder
was incorrectly setting thepersist
flag on the Chain totrue
, which goes against what the documentation says. It now correctly sets it tofalse
. This means if you previously had a Tween Chain that was persisting, it will no longer do so, so add the property to regain the feature. - The
dropped
argument has now been adeded to the documentation for theDRAG_END
andGAMEOBJECT_DRAG_END
events. (thanks @samme) Container.onChildDestroyed
is a new internal method used to destroy Container children. Previously, if you destroyed a Game Object in an exclusive Container, the game object would (momentarily) move onto the Scene display list and emit an ADDED_TO_SCENE event. Also, if you added a Sprite to a non-exclusive Container and stopped the Scene, you would get a TypeError (evaluating 'this.anims.destroy'). This happened because the fromChild argument in the DESTROY event was misinterpreted as destroyChild in the Container's remove(), and the Container was calling the Sprite's destroy() again. (thanks @samme)- The
Text
andTileSprite
Game Objects now place their textures into the globalTextureManager
and a_textureKey
private string property has been added which contains a UUID to reference that texture. - The
Tilemaps.Components.WeightedRandomize
method now uses the PhaserMath.RND.frac
method with a seed instead of theMath.Random
static method. (thanks @jorbascrumps) Tilemaps.Components.IsometricCullTiles
does theCheckIsoBounds
method check last when building the outputArray, as to help optimize in situations where the tile would not be visible anyways. (thanks @zegenie)Tilemaps.Components.WeightedRandomize
now uses the PhaserMath.RND.frac
method with a seed instead theMath.Random
static method. (thanks @jorbascrumps)- The
Layer
Game Object has had itsremoveAll
,remove
andadd
methods removed. These methods are all still available via theList
class that Layer inherits, but thedestroyChild
parameters are no longer available. - The
Renderer.Canvas
andRenderer.WebGL
will now only be included in the build file if the corresponding feature flagsCANVAS_RENDERER
and/orWEBGL_RENDERER
are set totrue
. For Canvas only builds this saves a lot of space in the build. (thanks @samme) - You can now specify an
autoResize
boolean in theRenderTargetConfig
which is passed to the Render Targets when they are created by a pipeline. - The
UtilityPipeline
now setsautoResize
totrue
in its Render Target Config, so that the globalfullFrame
andhalfFrame
Render Targets will automatically resize if the renderer changes. Actions.PlaceOnLine
now has an addedease
parameter which accepts a string from the EaseMap or a custom ease function to allow for different distrubutions along a line. (thanks @sB3p)- If you enable a Game Object for Input Debugging, the debug shape will no longer be rendered if the Game Object itself is not visible. Fix #6364 (thanks @orjandh)
- The
XHRLoader
will now listen forontimeout
and if triggered it will hand over to theFile.onError
handler. This prevents the Loader from stalling if a file times out. Fix #6472 (thanks @343dev) LightPipeline.currentNormalMap
was incorrectly documented as being a property ofWebGLRenderer
.Mesh
based Game Objects now can use an input config with thesetInteractive
method, which supports the optionsdraggable
,dropzone
,cursor
anduserHandCursor
. Fix #6510 #6652 (thanks @Baegus @Neppord)
Bug Fixes
- The
InputManager.onTouchMove
function has been fixed so it now correctly handles touch events on pages that have scrolled horizontally or vertically and shifted the viewport. Fix #6489 (thanks @somechris @hyewonjo) Factory.staticBody
had the wrong return type in the docs/TS defs. Fix #6693 (thanks @ddhaiby)- The
Time.Timeline
class didn't show as extending the Event Emitter, or haveconfig
as an optional argument in the docs / TS defs. Fix #6673 (thanks @ghclark2) - The
Animations.AnimationFrame
memberduration
is now the complete duration of the frame, which is a breaking change. Before thisAnimations.AnimationState#msPerFrame
was combined withAnimations.AnimationFrame#duration
which wasn't intuitive. The fix to removeAnimations.AnimationState#msPerFrame
fromAnimations.AnimationFrame#duration
has been removed from theAnimations.AnimationManager
methodcreateFromAseprite
because of this clarification. Fix #6712 (thanks @Nerodon @TomMalitz) - The
NineSlice
Game Object methodsetSize
now recalculates its origin by calling theupdateDisplayOrigin
method. (thanks @dhashvir) - When a
Layer
Game Object is destroyed, i.e. from changing or restarting a Scene, it will no longer cause an error when trying to destroy the children on its display list. Fix #6675 (thanks @crockergd @gm0nk) DynamicTexture
will now automatically callsetSize(width, height)
for both WebGL and Canvas. Previously it only did it for WebGL. This fixes an issue where DynamicTextures in Canvas mode would have a width and height of -1. Fix #6682 (thanks @samme)DynamicTexture.setSize
will now check to see if theglTexture
bound to the current frame is stale, and if so, destroy it before binding the one from the Render Target. This fixes an issue where constantly destroying and creating Dynamic Textures would cause a memory leak in WebGL. Fix #6669 (thanks @DavidTalevski)- The
BloomFX
andBlurFX
and any custom pipeline that relies on using theUtilityPipeline
full or half frame targets will now correctly draw even after the renderer size changes. Fix #6677 (thanks @Nerodon) - The
PostFXPipeline.postBatch
method will now skiponDraw
if the pipeline hasn't booted, introducing an artificial frame skip. This should potentially fix glitch errors on mobile devices where Post FX would appear corrupted for a single frame. Fix #6681 (thanks @moufmouf @tongliang999) - The
Matter.Body
functionscale
has been updated so if the Body originally had aninertia
ofInfinity
this will be restored at the end of the call. This happens if you set a Matter Body to have fixed rotation. Fix #6369 (thanks @sushovande) - Modified the
RandomDataGenerator.weightedPick
method to avoid sampling past the last element. Fix #6701 (thanks @jameskirkwood) - The touch event handler
onTouchEndWindow
now stops pointer events when clicking through DOM elements to input. Fix #6697 (thanks @laineus) - The
Physics.Matter.Factory
methodpointerConstraint
no longer returns an error when it can't find the camera. Fix #6684 (thanks @spritus) - The
Physics.Arcade.StaticBody
methodreset
now re-appliesoffset
values. Fix #6729 (thanks @samme) - The
Input.InputPlugin
methoddisable
which is called byGameObjects.GameObject#disableInteractive
keeps its temp hit box value which stops propagation to interactive Game Objects in another scene. Fix #6601 (thanks @UnaiNeuronUp) - Using
setInteractive
andremoveInteractive
methods of a Game Object outside of the game loop w...
Phaser v3.80.0 Beta 1
Version 3.80.0 - Nino - in dev
New Features
- The Scale Manager has a new scale mode called
EXPAND
. This is inspired by the Expand mode in Godot: "Keep aspect ratio when stretching the screen, but keep neither the base width nor height. Depending on the screen aspect ratio, the viewport will either be larger in the horizontal direction (if the screen is wider than the base size) or in the vertical direction (if the screen is taller than the original size)" (thanks @rexrainbow) - Phaser now performs a WebGL Context Restore to keep the game running after losing WebGL context. This affects many parts of the rendering system, but everything should work just the same unless you're doing something very technical. See the link for more details.
New Features - Base64 Loader
The Phaser LoaderPlugin and related classes have been updated so that they now work natively with base64 encoded files and Data URIs. This means you can now load a base64 encoded image, audio file or text file directly into the Loader. The Loader will then decode the data and process it as if it was a normal file. This is particularly useful for environments such as Playable Ads where you have to provide a single html file with all assets embedded and no XHR requests.
Loader.File.base64
is a new read-only boolean property that is set if the file contains a Data URI encoded string.Loader.File.onBase64Load
is a new method that is called when the file has finished decoding from a Data URI.- The
ImageFile
will now default to using the Image Load Element if a base64 file is detected, instead of throwing a console warning about unsupported types. - The
XHRLoader
will now return a fake XHR result object containing the decoded base64 data if a base64 file is detected, skipping the creation of a real XML Http Request object.
Spine Updates
- The Spine 3 and 4.1 Plugins will now call
preUpdate
automatically when theplay
method is called. This forces the new animation state to update and apply itself to the skeleton. This fixes an issue where Spine object would show the default frame in the Spine atlas for a single update before the animation started. Fix #5443 (thanks @spayton) SpineGameObject.setSlotAlpha
is a new method that allows you to set the alpha on a specific slot in a Spine skeleton.- The
SpineGameObject.setAlpha
method has had its 2nd parameter removed. This fixes needless slot look-ups during rendering when a Spine Game Object is inside a regular Container. If you need to set slot alpha, use the newsetSlotAlpha
method instead. Fix #6571 (thanks @spayton) - The
SpineFile.onFileComplete
handler was running a regular expression againstfile.src
instead offile.url
, sometimes leading to double paths in the atlas paths on loading. Fix #6642 (thanks @rez23)
Updates
- The
TweenChainBuilder
was incorrectly setting thepersist
flag on the Chain totrue
, which goes against what the documentation says. It now correctly sets it tofalse
. This means if you previously had a Tween Chain that was persisting, it will no longer do so, so add the property to regain the feature. - The
dropped
argument has now been adeded to the documentation for theDRAG_END
andGAMEOBJECT_DRAG_END
events. (thanks @samme) Container.onChildDestroyed
is a new internal method used to destroy Container children. Previously, if you destroyed a Game Object in an exclusive Container, the game object would (momentarily) move onto the Scene display list and emit an ADDED_TO_SCENE event. Also, if you added a Sprite to a non-exclusive Container and stopped the Scene, you would get a TypeError (evaluating 'this.anims.destroy'). This happened because the fromChild argument in the DESTROY event was misinterpreted as destroyChild in the Container's remove(), and the Container was calling the Sprite's destroy() again. (thanks @samme)- The
Text
andTileSprite
Game Objects now place their textures into the globalTextureManager
and a_textureKey
private string property has been added which contains a UUID to reference that texture. - The
Tilemaps.Components.WeightedRandomize
method now uses the PhaserMath.RND.frac
method with a seed instead of theMath.Random
static method. (thanks @jorbascrumps) Tilemaps.Components.IsometricCullTiles
does theCheckIsoBounds
method check last when building the outputArray, as to help optimize in situations where the tile would not be visible anyways. (thanks @zegenie)Tilemaps.Components.WeightedRandomize
now uses the PhaserMath.RND.frac
method with a seed instead theMath.Random
static method. (thanks @jorbascrumps)- The
Layer
Game Object has had itsremoveAll
,remove
andadd
methods removed. These methods are all still available via theList
class that Layer inherits, but thedestroyChild
parameters are no longer available. - The
Renderer.Canvas
andRenderer.WebGL
will now only be included in the build file if the corresponding feature flagsCANVAS_RENDERER
and/orWEBGL_RENDERER
are set totrue
. For Canvas only builds this saves a lot of space in the build. (thanks @samme) - You can now specify an
autoResize
boolean in theRenderTargetConfig
which is passed to the Render Targets when they are created by a pipeline. - The
UtilityPipeline
now setsautoResize
totrue
in its Render Target Config, so that the globalfullFrame
andhalfFrame
Render Targets will automatically resize if the renderer changes. Actions.PlaceOnLine
now has an addedease
parameter which accepts a string from the EaseMap or a custom ease function to allow for different distrubutions along a line. (thanks @sB3p)- If you enable a Game Object for Input Debugging, the debug shape will no longer be rendered if the Game Object itself is not visible. Fix #6364 (thanks @orjandh)
- The
XHRLoader
will now listen forontimeout
and if triggered it will hand over to theFile.onError
handler. This prevents the Loader from stalling if a file times out. Fix #6472 (thanks @343dev)
Bug Fixes
- The
InputManager.onTouchMove
function has been fixed so it now correctly handles touch events on pages that have scrolled horizontally or vertically and shifted the viewport. Fix #6489 (thanks @somechris @hyewonjo) Factory.staticBody
had the wrong return type in the docs/TS defs. Fix #6693 (thanks @ddhaiby)- The
Time.Timeline
class didn't show as extending the Event Emitter, or haveconfig
as an optional argument in the docs / TS defs. Fix #6673 (thanks @ghclark2) - The
Animations.AnimationFrame
memberduration
is now the complete duration of the frame, which is a breaking change. Before thisAnimations.AnimationState#msPerFrame
was combined withAnimations.AnimationFrame#duration
which wasn't intuitive. The fix to removeAnimations.AnimationState#msPerFrame
fromAnimations.AnimationFrame#duration
has been removed from theAnimations.AnimationManager
methodcreateFromAseprite
because of this clarification. Fix #6712 (thanks @Nerodon @TomMalitz) - The
NineSlice
Game Object methodsetSize
now recalculates its origin by calling theupdateDisplayOrigin
method. (thanks @dhashvir) - When a
Layer
Game Object is destroyed, i.e. from changing or restarting a Scene, it will no longer cause an error when trying to destroy the children on its display list. Fix #6675 (thanks @crockergd @gm0nk) DynamicTexture
will now automatically callsetSize(width, height)
for both WebGL and Canvas. Previously it only did it for WebGL. This fixes an issue where DynamicTextures in Canvas mode would have a width and height of -1. Fix #6682 (thanks @samme)DynamicTexture.setSize
will now check to see if theglTexture
bound to the current frame is stale, and if so, destroy it before binding the one from the Render Target. This fixes an issue where constantly destroying and creating Dynamic Textures would cause a memory leak in WebGL. Fix #6669 (thanks @DavidTalevski)- The
BloomFX
andBlurFX
and any custom pipeline that relies on using theUtilityPipeline
full or half frame targets will now correctly draw even after the renderer size changes. Fix #6677 (thanks @Nerodon) - The
PostFXPipeline.postBatch
method will now skiponDraw
if the pipeline hasn't booted, introducing an artificial frame skip. This should potentially fix glitch errors on mobile devices where Post FX would appear corrupted for a single frame. Fix #6681 (thanks @moufmouf @tongliang999) - The
Matter.Body
functionscale
has been updated so if the Body originally had aninertia
ofInfinity
this will be restored at the end of the call. This happens if you set a Matter Body to have fixed rotation. Fix #6369 (thanks @sushovande) - Modified the
RandomDataGenerator.weightedPick
method to avoid sampling past the last element. Fix #6701 (thanks @jameskirkwood) - The touch event handler
onTouchEndWindow
now stops pointer events when clicking through DOM elements to input. Fix #6697 (thanks @laineus) - The
Physics.Matter.Factory
methodpointerConstraint
no longer returns an error when it can't find the camera. Fix #6684 (thanks @spritus)
Examples, Documentation, Beta Testing and TypeScript
My thanks to the following for helping with the Phaser 3 Examples, Beta Testing, Docs, and TypeScript definitions, either by reporting errors, fixing them, or helping author the docs:
@AlvaroEstradaDev
@stevenwithaph
@paxperscientiam
@samme
@actionmoon
@rafael-lua
@Byvire
Phaser v3.70.0
Version 3.70.0 - Yotsuba - 10th November 2023
New Features - Round Pixels
All pixel rounding math is now handled on the GPU instead of on the CPU. This feature has now been enabled by default.
- The Game Config
roundPixels
property is nowtrue
by default. This means that all Game Objects will be positioned and rendered with pixel-perfect precision, which is by far the most common use-case for Phaser games. This will prevent sub-pixelation when rendering at non-integer offsets and allows for smoother camera scrolling, especially at higher zoom scales. If you wish to disable this, you can do so by setting theroundPixels
property in the Game Config tofalse
. Note that onlyroundPixels
has been set totrue
. ThepixelArt
property remainsfalse
. So if you're creating a pixel-art style game, please still enable this in your config. - All of the core vertex shaders, including Multi, Single and Mobile now have a new uniform called
uRoundPixels
which is set in all of the corresponding pipelines. This means that all pixel rounding calculations are now done on the GPU instead of the CPU, which can save a lot of math in intensive games. CanvasRenderer.batchSprite
has been updated to correctly use the CameraroundPixels
property and apply it to thedrawImage
call.Camera.preRender
will no longer round the origin, follow coordinates or scrollX/Y coordinates. It will still round the World view.- The
MultiPipeline.batchSprite
method (which is also used by the Single Pipeline and Mobile Pipeline) will no longer useroundPixels
when calculating the quad vertex data. It also won't apply it to any of the sprite values. This is all now handled in the shader directly. TransformMatrix.setQuad
no longer uses an anonymous function forroundPixels
, which will help with performance.- The
TransformMatrix.setQuad
method signature has changed slightly. TheroundPixels
parameter is now optional and defaults tofalse
. Previously, you always had to set it.
New Features - Texture Packer Nine Slice Support
The new version of Texture Packer (v7.1.0) and above will now allow you to export scale9 sprite data in your Phaser 3 Atlas JSON. This allows you to create Nine Slice Sprites directly from the data, without having to specify the border sizes directly in your code. To use this feature, simply edit the sprite in Texture Packer, enable the 'scale9' checkbox and then drag the guides as required. When you export the atlas, the JSON will contain the new scale9
object, which Phaser will parse and use when creating Nine Slice Game Objects.
- You can now create a
NineSlice
Game Object without specifying a width or height for it. If you do this, it will use the size of the texture frame instead. - The
NineSlice
Game Object will now check to see if its associated Frame has any scale9 data set, and if so this is now used automatically to populate all of the border values. - The
NineSlice.setSlices
method has a new optional boolean parameterskipScale9
which will allow you to set the border values of the Nine Slice directly, even if its Frame has associated scale9 data Frame.setScale9
is a new method that allows you to set the scale9 data associated with the given Frame. This is used internally by the Texture Packer parsers, but can also be called directly.Frame.scale9
is a new read-only boolean property that returnstrue
if the Frame has scale9 data associated with it.Frame.is3Slice
is a new read-only boolean property that returnstrue
if the Frame has scale9 data associated with it that is 3-slice instead of 9-slice.- The
JSONHash
texture parser will now check forscale9
data in the JSON and if found, set it via theFrame.setScale9
method. - The
JSONArray
texture parser will now check forscale9
data in the JSON and if found, set it via theFrame.setScale9
method.
New Features - Arcade Physics
- Arcade Physics Bodies have a new method called
setDirectControl
which toggles a new boolean propertydirectControl
. When enabled (it's false by default) it means the Body will calculate its velocity based on its change in position compared to the previous frame. This allows you to directly move a Body around the physics world by just changing its position, without having to use acceleration or velocity. This is useful if you want to move it via a Tween, or follow a Pointer, or a Path. Because its velocity is calculated based on this movement it will still resolve collisions with other bodies, imparting velocity to them as usual. - Arcade Physics Bodies have a new property called
slideFactor
. This is a Vector2 that controls how much velocity is retained by a Body after it has been pushed by another Body. The default value is 1, which means it retains all of its velocity. If set to zero, it will retain none of it. This allows you to create a Body that can be pushed around without imparting any velocity to it. Body.setSlideFactor
is a new method that sets the Body'sslideFactor
property.- The Arcade Physics World has a new method
nextCategory
which will create a new collision category and return it. You can define up to 32 unique collision categories per world. - Arcade Physics Bodies have two new properties:
collisionCategory
andcollisionMask
. These allow you to set a specific collision category and list of categories the body will collide with. This allows for fine-grained control over which bodies collide with which others. The default is that all bodies collide with all others, just like before. setCollisionCategory
is a new method available on Arcade Physics Bodies that allows you to set the collision category of the body. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.setCollidesWith
is a new method available on Arcade Physics Bodies that allows you to set which collision categories the body should collide with. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.resetCollision
is a new method available on Arcade Physics Bodies that allows you to reset the collision category and mask to their defaults. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.
The default is as before: all bodies collide with each other. However, by using the categories you now have much more fine-grained control over which objects collide together, or not. They are filtered out at the top-level, meaning you can have a Sprite set to not collide with a Physics Group and it will skip checking every single child in the Group, potentially saving a lot of processing time.
The new collision categories are used automatically by either directly calling the collide
or overlap
methods, or by creating a Collider object. This allows you to use far less colliders than you may have needed previously and skip needing to filter the pairs in the collision handlers.
New Features - FX Updates and Fixes
You can now set in your game config two new boolean properties that control if the built-in FX are enabled, or not. If you don't need to use the FX then disabling these will help save on texture memory and will compile less shaders, which can help with startup time. These are single-set flags, you cannot toggle them after the game has booted.
disablePreFX
set this totrue
in your game config to disable the creation and use of Pre FX on all Game Objects.disablePostFX
set this totrue
in your game config to disable the creation and use of Post FX on all Game Objects.- The
PipelineManager
will now delay the creation of the FX Pipelines until itsboot
method, using these config values to determine if it should proceed. - The
PipelineManager.renderTargets
array will no longer be pre-populated if you disable Pre FX, saving on texture memory. FX.Circle.backgroundAlpha
is a new property that allows you to set the amount of the alpha of the background color in the Circle FX (thanks @rexrainbow)PostFXPipeline.bootFX
is a new method, which is the previousboot
method but renamed. This is no longer called from the constructor, but instead when the Post FX Pipeline is activated by the Pipeline Manager. This means that the resources the Post FX requires, such as creating Render Targets and shaders, is delayed until the FX is actually used, saving on memory.- The
PostFXPipeline
will now setautoResize
totrue
on all of itsRenderTarget
instances. This fixes an issue where thePostFXPipeline
would not resize the render targets when the game size changed, causing them to become out of sync with the game canvas. Fix #6503 (thanks @Waclaw-I) FX.Blur
didn't set thequality
parameter to its property, meaning it wasn't applied in the shader, causing it to always use a Low Blur quality (unless modified post-creation).- The
BlurFXPipeline
didn't bind the quality of shader specified in the controller, meaning it always used the Low Blur shader, regardless of what the FX controller asked for. - The
FXBlurLow
fragment shader didn't have theoffset
uniform. This is now passed in and applied to the resulting blur, preventing it from creating 45 degree artifacts (thanks Wayfinder) - Fixed an issue in the way the Tilemap WebGL Renderer would call
batchTexture
that meant if you applied a PostFX to a Tilemap Layer it would apply the fx for every single tile in the layer, instead of just once per layer. In a simple map this fix has reduced draw calls from over 12,000 to just 52, and it no longer matters how many tiles are on the layer, the cost of applying the FX is consistent regardless.
New Features
Text.setRTL
is a new method that allows you to set a Text Game Object as being rendered from right-to-left, instead of the default left to right (thanks @rexrainbow)Physics.Arcade.World.singleStep
is a new method that wil...
Phaser 3.61.0 Beta 4
New Features - Arcade Physics
- Arcade Physics Bodies have a new method called
setDirectControl
which toggles a new boolean propertydirectControl
. When enabled (it's false by default) it means the Body will calculate its velocity based on its change in position compared to the previous frame. This allows you to directly move a Body around the physics world by just changing its position, without having to use acceleration or velocity. This is useful if you want to move it via a Tween, or follow a Pointer, or a Path. Because its velocity is calculated based on this movement it will still resolve collisions with other bodies, imparting velocity to them as usual. - Arcade Physics Bodies have a new property called
slideFactor
. This is a Vector2 that controls how much velocity is retained by a Body after it has been pushed by another Body. The default value is 1, which means it retains all of its velocity. If set to zero, it will retain none of it. This allows you to create a Body that can be pushed around without imparting any velocity to it. Body.setSlideFactor
is a new method that sets the Body'sslideFactor
property.- The Arcade Physics World has a new method
nextCategory
which will create a new collision category and return it. You can define up to 32 unique collision categories per world. - Arcade Physics Bodies have two new properties:
collisionCategory
andcollisionMask
. These allow you to set a specific collision category and list of categories the body will collide with. This allows for fine-grained control over which bodies collide with which others. The default is that all bodies collide with all others, just like before. setCollisionCategory
is a new method available on Arcade Physics Bodies that allows you to set the collision category of the body. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.setCollidesWith
is a new method available on Arcade Physics Bodies that allows you to set which collision categories the body should collide with. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.resetCollision
is a new method available on Arcade Physics Bodies that allows you to reset the collision category and mask to their defaults. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.
The default is as before: all bodies collide with each other. However, by using the categories you now have much more fine-grained control over which objects collide together, or not. They are filtered out at the top-level, meaning you can have a Sprite set to not collide with a Physics Group and it will skip checking every single child in the Group, potentially saving a lot of processing time.
The new collision categories are used automatically by either directly calling the collide
or overlap
methods, or by creating a Collider object. This allows you to use far less colliders than you may have needed previously and skip needing to filter the pairs in the collision handlers.
New Features
Text.setRTL
is a new method that allows you to set a Text Game Object as being rendered from right-to-left, instead of the default left to right (thanks @rexrainbow)FX.Circle.backgroundAlpha
is a new property that allows you to set the amount of the alpha of the background color in the Circle FX (thanks @rexrainbow)Physics.Arcade.World.singleStep
is a new method that will advance the Arcade Physics World simulation by exactly 1 step (thanks @monteiz)Tilemaps.ObjectLayer.id
is a new property that returns the ID of the Object Layer, if specified within Tiled, or zero otherwise. You can now access the unique layer ID of Tiled layers if the event a map doesn't have unique layer names (thanks @rui-han-crh)Tilemaps.LayerData.id
is a new property that returns the ID of the Data Layer, if specified within Tiled, or zero otherwise (thanks @rui-han-crh)Text.setLetterSpacing
is a new method andText.lineSpacing
is the related property that allows you to set the spacing between each character of a Text Game Object. The value can be either negative or positive, causing the characters to get closer or further apart. 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 (thanks @Ariorh1337)ParticleEmitter.clearDeathZones
is a new method that will clear all previously created Death Zones from a Particle Emitter (thanks @rexrainbow)ParticleEmitter.clearEmitZones
is a new method that will clear all previously created Emission Zones from a Particle Emitter (thanks @rexrainbow)- The
GameObject.setTexture
method has 2 new optional parameters:updateSize
andupdateOrigin
, which are both passed to thesetFrame
method and allows you to control if the size and origin of the Game Object should be updated when the texture is set (thanks @Trissolo) - Both the Animation Config and the Play Animation Config allow you to set a new boolean property
randomFrame
. This isfalse
by default, but if set, it will pick a random frame from the animation when it starts playback. This allows for much more variety in groups of sprites created at the same time, using the same animation. This is also reflected in the newAnimation.randomFrame
andAnimationState.randomFrame
properties. - You can now use a
Phaser.Types.Animations.PlayAnimationConfig
object in theanims
property of theParticleEmitter
configuration object. This gives you far more control over what happens to the animation when used by particles, including setting random start frames, repeat delays, yoyo, etc. Close #6478 (thanks @michalfialadev) TilemapLayer.setTintFill
is a new method that will apply a fill-based tint to the tiles in the given area, rather than an additive-based tint, which is what thesetTint
method uses.Tile.tintFill
is a new boolean property that controls if the tile tint is additive or fill based. This is used in the TilemapLayerWebGLRenderer function.
Updates
- The
WebAudioSoundManager
will now bind thebody
to theremoveEventListener
method, if it exists, to prevent memory leaks (thanks @wjaykim) - The
AnimationManager.globalTimeScale
property is now applied to all Game Objects using the Animation component, allowing you to globally speed-up or slow down all animating objects (thanks @TJ09) - The
Rope
Game Object now callsinitPostPipeline
allowing you to use Post FX directly on it, such as glow, blur, etc. Fix #6550 (thanks @rexrainbow) - The
Tween.stop
method will now check to see ifTween.parent
is set. If not, it won't try to set a pending removal state or dispatch an event, which should help guard against errors whereTween.stop
is called by mistake on already destroyed tweens (thanks @orcomarcio) - The
Tween.remove
method will now check to see ifTween.parent
exists before trying to remove it from the parent. This should help guard against errors whereTween.remove
is called by mistake on already removed or destroyed tweens. Fix #6539 (thanks @orcomarcio) Particle.alpha
is now clamped to the range 0 to 1 within theupdate
method, preventing it from going out of range. Fix #6551 (thanks @orcomarcio)Math.Wrap
has been reverted to the previous version. Fix #6479 (thanks @EmilSV)- The
Graphics
Game Object will now set a default line and fill style to fully transparent and black. This prevents issues where a Graphics object would render with a color set in other Shape Game Objects if it had been drawn to and no style was previous set (thanks Whitesmith) - The WebGLRenderer will now validate that the
mipmapFilter
property in the Game Config is a valid mipmap before assigning it. - A small amount of unused code has been removed from the
Polygon.setTo
method (thanks @Trissolo) - The
WebGLRenderer.deleteFramebuffer
method has been updated so it now tests for the existence of a COLOR and DEPTH_STENCIL attachments, and if found, removes the bindings and deletes the stencil buffer. The code that previously deleted theRENDERERBUFFER_BINDING
has also been removed to avoid side-effects. - If you make a
Mesh
Game Object interactive, it will now bind to the scope of the Mesh and uses the currentfaces
in the hit area callback, rather than the faces as defined when the Mesh was made interactive. This will help keep the input in sync with a potentially changing Mesh structure (thanks @rexrainbow) - iOS and any browser identifying as
AppleWebKit
will now set theDevice.es2019
flag totrue
. This causes Phaser to use the native array Stable Sort. This fixes an issue where overlapping particles could flicker on iOS. Fix #6483 (thanks @mattkelliher @spayton) - The
Text.dirty
Game Object property has been removed. It wasn't used internally at all, so was just adding confusion and using space. - The Request Video Frame polyfill will now check first to see if the browser supports
HTMLVideoElement
before trying to inspect its prototype. This should help in non-browser environments. Plane.originX
andoriginY
are two new read-only properties that return the origin of the Plane, which is always 0.5 (thanks @rexrainbow)- The
LoaderPlugin
will now callremoveAllListeners()
as part of itsshutdown
method, which will clear any event listeners bound to a Loader instance of the Scene, during the Scene shutdown. Fix #6633 (thanks @samme) SetCollisionObject
is a new function that Arcade Physics bodies use internally to create and reset theirArcadeBodyCollision
data objects.- `DynamicTex...
Phaser 3.61.0 Beta 3
New Features - Arcade Physics
- Arcade Physics Bodies have a new property called
slideFactor
. This is a Vector2 that controls how much velocity is retained by a Body after it has been pushed by another Body. The default value is 1, which means it retains all of its velocity. If set to zero, it will retain none of it. This allows you to create a Body that can be pushed around without imparting any velocity to it. Body.setSlideFactor
is a new method that sets the Body'sslideFactor
property.- The Arcade Physics World has a new method
nextCategory
which will create a new collision category and return it. You can define up to 32 unique collision categories per world. - Arcade Physics Bodies have two new properties:
collisionCategory
andcollisionMask
. These allow you to set a specific collision category and list of categories the body will collide with. This allows for fine-grained control over which bodies collide with which others. The default is that all bodies collide with all others, just like before. setCollisionCategory
is a new method available on Arcade Physics Bodies that allows you to set the collision category of the body. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.setCollidesWith
is a new method available on Arcade Physics Bodies that allows you to set which collision categories the body should collide with. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.resetCollision
is a new method available on Arcade Physics Bodies that allows you to reset the collision category and mask to their defaults. It's also available on Arcade Sprites, Images, Tilemap Layers, Groups and Static Groups directly.
The default is as before: all bodies collide with each other. However, by using the categories you now have much more fine-grained control over which objects collide together, or not. They are filtered out at the top-level, meaning you can have a Sprite set to not collide with a Physics Group and it will skip checking every single child in the Group, potentially saving a lot of processing time.
The new collision categories are used automatically by either directly calling the collide
or overlap
methods, or by creating a Collider object. This allows you to use far less colliders than you may have needed previously and skip needing to filter the pairs in the collision handlers.
New Features
Text.setRTL
is a new method that allows you to set a Text Game Object as being rendered from right-to-left, instead of the default left to right (thanks @rexrainbow)FX.Circle.backgroundAlpha
is a new property that allows you to set the amount of the alpha of the background color in the Circle FX (thanks @rexrainbow)Physics.Arcade.World.singleStep
is a new method that will advance the Arcade Physics World simulation by exactly 1 step (thanks @monteiz)Tilemaps.ObjectLayer.id
is a new property that returns the ID of the Object Layer, if specified within Tiled, or zero otherwise. You can now access the unique layer ID of Tiled layers if the event a map doesn't have unique layer names (thanks @rui-han-crh)Tilemaps.LayerData.id
is a new property that returns the ID of the Data Layer, if specified within Tiled, or zero otherwise (thanks @rui-han-crh)Text.setLetterSpacing
is a new method andText.lineSpacing
is the related property that allows you to set the spacing between each character of a Text Game Object. The value can be either negative or positive, causing the characters to get closer or further apart. 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 (thanks @Ariorh1337)ParticleEmitter.clearDeathZones
is a new method that will clear all previously created Death Zones from a Particle Emitter (thanks @rexrainbow)ParticleEmitter.clearEmitZones
is a new method that will clear all previously created Emission Zones from a Particle Emitter (thanks @rexrainbow)- The
GameObject.setTexture
method has 2 new optional parameters:updateSize
andupdateOrigin
, which are both passed to thesetFrame
method and allows you to control if the size and origin of the Game Object should be updated when the texture is set (thanks @Trissolo) - Both the Animation Config and the Play Animation Config allow you to set a new boolean property
randomFrame
. This isfalse
by default, but if set, it will pick a random frame from the animation when it starts playback. This allows for much more variety in groups of sprites created at the same time, using the same animation. This is also reflected in the newAnimation.randomFrame
andAnimationState.randomFrame
properties. - You can now use a
Phaser.Types.Animations.PlayAnimationConfig
object in theanims
property of theParticleEmitter
configuration object. This gives you far more control over what happens to the animation when used by particles, including setting random start frames, repeat delays, yoyo, etc. Close #6478 (thanks @michalfialadev) TilemapLayer.setTintFill
is a new method that will apply a fill-based tint to the tiles in the given area, rather than an additive-based tint, which is what thesetTint
method uses.Tile.tintFill
is a new boolean property that controls if the tile tint is additive or fill based. This is used in the TilemapLayerWebGLRenderer function.
Updates
- The
WebAudioSoundManager
will now bind thebody
to theremoveEventListener
method, if it exists, to prevent memory leaks (thanks @wjaykim) - The
AnimationManager.globalTimeScale
property is now applied to all Game Objects using the Animation component, allowing you to globally speed-up or slow down all animating objects (thanks @TJ09) - The
Rope
Game Object now callsinitPostPipeline
allowing you to use Post FX directly on it, such as glow, blur, etc. Fix #6550 (thanks @rexrainbow) - The
Tween.stop
method will now check to see ifTween.parent
is set. If not, it won't try to set a pending removal state or dispatch an event, which should help guard against errors whereTween.stop
is called by mistake on already destroyed tweens (thanks @orcomarcio) - The
Tween.remove
method will now check to see ifTween.parent
exists before trying to remove it from the parent. This should help guard against errors whereTween.remove
is called by mistake on already removed or destroyed tweens. Fix #6539 (thanks @orcomarcio) Particle.alpha
is now clamped to the range 0 to 1 within theupdate
method, preventing it from going out of range. Fix #6551 (thanks @orcomarcio)Math.Wrap
has been reverted to the previous version. Fix #6479 (thanks @EmilSV)- The
Graphics
Game Object will now set a default line and fill style to fully transparent and black. This prevents issues where a Graphics object would render with a color set in other Shape Game Objects if it had been drawn to and no style was previous set (thanks Whitesmith) - The WebGLRenderer will now validate that the
mipmapFilter
property in the Game Config is a valid mipmap before assigning it. - A small amount of unused code has been removed from the
Polygon.setTo
method (thanks @Trissolo) - The
WebGLRenderer.deleteFramebuffer
method has been updated so it now tests for the existence of a COLOR and DEPTH_STENCIL attachments, and if found, removes the bindings and deletes the stencil buffer. The code that previously deleted theRENDERERBUFFER_BINDING
has also been removed to avoid side-effects. - If you make a
Mesh
Game Object interactive, it will now bind to the scope of the Mesh and uses the currentfaces
in the hit area callback, rather than the faces as defined when the Mesh was made interactive. This will help keep the input in sync with a potentially changing Mesh structure (thanks @rexrainbow) - iOS and any browser identifying as
AppleWebKit
will now set theDevice.es2019
flag totrue
. This causes Phaser to use the native array Stable Sort. This fixes an issue where overlapping particles could flicker on iOS. Fix #6483 (thanks @mattkelliher @spayton) - The
Text.dirty
Game Object property has been removed. It wasn't used internally at all, so was just adding confusion and using space. - The Request Video Frame polyfill will now check first to see if the browser supports
HTMLVideoElement
before trying to inspect its prototype. This should help in non-browser environments. Plane.originX
andoriginY
are two new read-only properties that return the origin of the Plane, which is always 0.5 (thanks @rexrainbow)- The
LoaderPlugin
will now callremoveAllListeners()
as part of itsshutdown
method, which will clear any event listeners bound to a Loader instance of the Scene, during the Scene shutdown. Fix #6633 (thanks @samme) SetCollisionObject
is a new function that Arcade Physics bodies use internally to create and reset theirArcadeBodyCollision
data objects.DynamicTexture.setFromRenderTarget
is a new method that syncs the internal Frame and TextureSource GL textures with the Render Target GL textures.- When a framebuffer is deleted, it now sets its
renderTexture
property toundefined
to ensure the reference is cleared.
Bug Fixes
- The
PostFXPipeline
will now setautoResize
totrue
on all of itsRenderTarget
instances. This fixes an issue where thePostFXPipeline
would not resize the render targets when the game size changed, causing them to become out of sync with the game canvas. Fix #6503 (thanks @Waclaw-I) Particle.scaleY
would always be set to thescaleX
value, ev...
Phaser 3.61.0 Beta 2
New Features
Text.setRTL
is a new method that allows you to set a Text Game Object as being rendered from right-to-left, instead of the default left to right (thanks @rexrainbow)FX.Circle.backgroundAlpha
is a new property that allows you to set the amount of the alpha of the background color in the Circle FX (thanks @rexrainbow)Physics.Arcade.World.singleStep
is a new method that will advance the Arcade Physics World simulation by exactly 1 step (thanks @monteiz)Tilemaps.ObjectLayer.id
is a new property that returns the ID of the Object Layer, if specified within Tiled, or zero otherwise. You can now access the unique layer ID of Tiled layers if the event a map doesn't have unique layer names (thanks @rui-han-crh)Tilemaps.LayerData.id
is a new property that returns the ID of the Data Layer, if specified within Tiled, or zero otherwise (thanks @rui-han-crh)Text.setLetterSpacing
is a new method andText.lineSpacing
is the related property that allows you to set the spacing between each character of a Text Game Object. The value can be either negative or positive, causing the characters to get closer or further apart. 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 (thanks @Ariorh1337)ParticleEmitter.clearDeathZones
is a new method that will clear all previously created Death Zones from a Particle Emitter (thanks @rexrainbow)ParticleEmitter.clearEmitZones
is a new method that will clear all previously created Emission Zones from a Particle Emitter (thanks @rexrainbow)- The
GameObject.setTexture
method has 2 new optional parameters:updateSize
andupdateOrigin
, which are both passed to thesetFrame
method and allows you to control if the size and origin of the Game Object should be updated when the texture is set (thanks @Trissolo) - Both the Animation Config and the Play Animation Config allow you to set a new boolean property
randomFrame
. This isfalse
by default, but if set, it will pick a random frame from the animation when it starts playback. This allows for much more variety in groups of sprites created at the same time, using the same animation. This is also reflected in the newAnimation.randomFrame
andAnimationState.randomFrame
properties. - You can now use a
Phaser.Types.Animations.PlayAnimationConfig
object in theanims
property of theParticleEmitter
configuration object. This gives you far more control over what happens to the animation when used by particles, including setting random start frames, repeat delays, yoyo, etc. Close #6478 (thanks @michalfialadev)
Updates
- The
WebAudioSoundManager
will now bind thebody
to theremoveEventListener
method, if it exists, to prevent memory leaks (thanks @wjaykim) - The
AnimationManager.globalTimeScale
property is now applied to all Game Objects using the Animation component, allowing you to globally speed-up or slow down all animating objects (thanks @TJ09) - The
Rope
Game Object now callsinitPostPipeline
allowing you to use Post FX directly on it, such as glow, blur, etc. Fix #6550 (thanks @rexrainbow) - The
Tween.stop
method will now check to see ifTween.parent
is set. If not, it won't try to set a pending removal state or dispatch an event, which should help guard against errors whereTween.stop
is called by mistake on already destroyed tweens (thanks @orcomarcio) - The
Tween.remove
method will now check to see ifTween.parent
exists before trying to remove it from the parent. This should help guard against errors whereTween.remove
is called by mistake on already removed or destroyed tweens. Fix #6539 (thanks @orcomarcio) Particle.alpha
is now clamped to the range 0 to 1 within theupdate
method, preventing it from going out of range. Fix #6551 (thanks @orcomarcio)Math.Wrap
has been reverted to the previous version. Fix #6479 (thanks @EmilSV)- The
Graphics
Game Object will now set a default line and fill style to fully transparent and black. This prevents issues where a Graphics object would render with a color set in other Shape Game Objects if it had been drawn to and no style was previous set (thanks Whitesmith) - The WebGLRenderer will now validate that the
mipmapFilter
property in the Game Config is a valid mipmap before assigning it. - A small amount of unused code has been removed from the
Polygon.setTo
method (thanks @Trissolo) - The
WebGLRenderer.deleteFramebuffer
method has been updated so it now tests for the exitennce of a COLOR and DEPTH_STENCIL attachments, and if found, removes the bindings and deletes the stencil buffer. The code that previously deelted theRENDERERBUFFER_BINDING
has also been removed to avoid side-effects. - If you make a
Mesh
Game Object interactive, it will now bind to the scope of the Mesh and uses the currentfaces
in the hit area callback, rather than the faces as defined when the Mesh was made interactive. This will help keep the input in sync with a potentially changing Mesh structure (thanks @rexrainbow) - iOS and any browser identifying as
AppleWebKit
will now set theDevice.es2019
flag totrue
. This causes Phaser to use the native array Stable Sort. This fixes an issue where overlapping particles could flicker on iOS. Fix #6483 (thanks @mattkelliher @spayton)
Bug Fixes
- The
PostFXPipeline
will now setautoResize
totrue
on all of itsRenderTarget
instances. This fixes an issue where thePostFXPipeline
would not resize the render targets when the game size changed, causing them to become out of sync with the game canvas. Fix #6503 #6527 (thanks @Waclaw-I @rexrainbow) Particle.scaleY
would always be set to thescaleX
value, even if given a different one within the config. It will now use its own value correctly.Array.Matrix.RotateLeft
was missing thetotal
parameter, which controls how many times to rotate the matrix.Array.Matrix.RotateRight
was missing thetotal
parameter, which controls how many times to rotate the matrix.Array.Matrix.TranslateMatrix
didn't work with any translation values above 1 due to missing parameters inRotateLeft
andRotateRight
FX.Blur
didn't set thequality
parameter to its property, meaning it wasn't applied in the shader, causing it to always use a Low Blur quality (unless modified post-creation).- The
BlurFXPipeline
didn't bind the quality of shader specified in the controller, meaning it always used the Low Blur shader, regardless of what the FX controller asked for. - The
FXBlurLow
fragment shader didn't have theoffset
uniform. This is now passed in and applied to the resulting blur, preventing it from creating 45 degree artifacts (thanks Wayfinder) - The
Tilemap.createFromObjects
method wouldn't always copy custom properties to the target objects or Data Manager. Fix #6391 (thanks @samme @paxperscientiam) - The
scale.min
andscale.max
width
andheight
properties in Game Config were ignored by the Game constructor, which was expectingminWidth
andminHeight
. This now matches the documentation. Fix #6501 (thanks @NikitaShpanko @wpederzoli) - Due to a copy-paste bug, the
Actions.GetLast
function had the same code as theGetFirst
function. It now does what you'd expect it to do. Fix #6513 (thanks @dmokel) - The
TilemapLayer.PutTileAt
method would use an incorrect local GID if the Tilemap Layer wasn't using all available tilesets. Fix #5931 (thanks @christianvoigt @wjaykim) - The
TextureManager.addSpriteSheet
method would fail if aTexture
instance was given as the second parameter, throwing aCannot read property 'key' of null
(thanks @charlieschwabacher) - The
HexagonalCullBounds
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
HexagonalGetTileCorners
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
HexagonalTileToWorldXY
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
BitmapText
Game Object will now reset the WebGL Texture unit on flush, which fixes an issue of a flush happening part-way during the rendering a BitmapText (thanks @EmilSV) - When using interpolation for a Particle Emitter operation, such as:
x: { values: [ 50, 500, 200, 800 ] }
it would fail to set the final value unless you specified theinterpolation
property as well. It now defaults tolinear
if not given. Fix #6551 (thanks @orcomarcio) - The Matter Physics
ignoreGravity
boolean is now checked during the Matter Engine internal functions, allowing this property to now work again. Fix #6473 (thanks @peer2p) Group.createFromConfig
will now check to see if the config contains eitherinternalCreateCallback
orinternalRemoveCallback
and set them accordingly. This fixes an issue where the callbacks would never be set if specified in an array of single configuration objects. Fix #6519 (thanks @samme)PhysicsGroup
will now set theclassType
and null theconfig
when an array of single configuration objects is given in the constructor. Fix #6519 (thanks @samme)- The
PathFollower.pathUpdate
method will now check if thetween
property has a validdata
component before running the update. This prevents a call toPathFollower.stopFollow
from throwing aCannot read properties of null (reading '0')
error as it tried to do a single update post stop. Fix #6508 (thanks @francois-dibulo) - Added missing parameter to some function calls in
Structs.ProcessQueue#add
(thanks @Trissolo) Tile
was incorrectly using...
Phaser 3.61.0 Beta 1
New Features
Text.setRTL
is a new method that allows you to set a Text Game Object as being rendered from right-to-left, instead of the default left to right (thanks @rexrainbow)FX.Circle.backgroundAlpha
is a new property that allows you to set the amount of the alpha of the background color in the Circle FX (thanks @rexrainbow)Physics.Arcade.World.singleStep
is a new method that will advance the Arcade Physics World simulation by exactly 1 step (thanks @monteiz)Tilemaps.ObjectLayer.id
is a new property that returns the ID of the Object Layer, if specified within Tiled, or zero otherwise. You can now access the unique layer ID of Tiled layers if the event a map doesn't have unique layer names (thanks @rui-han-crh)Tilemaps.LayerData.id
is a new property that returns the ID of the Data Layer, if specified within Tiled, or zero otherwise (thanks @rui-han-crh)Text.setLetterSpacing
is a new method andText.lineSpacing
is the related property that allows you to set the spacing between each character of a Text Game Object. The value can be either negative or positive, causing the characters to get closer or further apart. 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 (thanks @Ariorh1337)ParticleEmitter.clearDeathZones
is a new method that will clear all previously created Death Zones from a Particle Emitter (thanks @rexrainbow)ParticleEmitter.clearEmitZones
is a new method that will clear all previously created Emission Zones from a Particle Emitter (thanks @rexrainbow)
Updates
- The
WebAudioSoundManager
will now bind thebody
to theremoveEventListener
method, if it exists, to prevent memory leaks (thanks @wjaykim) - The
AnimationManager.globalTimeScale
property is now applied to all Game Objects using the Animation component, allowing you to globally speed-up or slow down all animating objects (thanks @TJ09) - The
Rope
Game Object now callsinitPostPipeline
allowing you to use Post FX directly on it, such as glow, blur, etc. Fix #6550 (thanks @rexrainbow) - The
Tween.stop
method will now check to see ifTween.parent
is set. If not, it won't try to set a pending removal state or dispatch an event, which should help guard against errors whereTween.stop
is called by mistake on already destroyed tweens (thanks @orcomarcio) - The
Tween.remove
method will now check to see ifTween.parent
exists before trying to remove it from the parent. This should help guard against errors whereTween.remove
is called by mistake on already removed or destroyed tweens. Fix #6539 (thanks @orcomarcio) Particle.alpha
is now clamped to the range 0 to 1 within theupdate
method, preventing it from going out of range. Fix #6551 (thanks @orcomarcio)Math.Wrap
has been reverted to the previous version. Fix #6479 (thanks @EmilSV)
Bug Fixes
Particle.scaleY
would always be set to thescaleX
value, even if given a different one within the config. It will now use its own value correctly.Array.Matrix.RotateLeft
was missing thetotal
parameter, which controls how many times to rotate the matrix.Array.Matrix.RotateRight
was missing thetotal
parameter, which controls how many times to rotate the matrix.Array.Matrix.TranslateMatrix
didn't work with any translation values above 1 due to missing parameters inRotateLeft
andRotateRight
FX.Blur
didn't set thequality
parameter to its property, meaning it wasn't applied in the shader, causing it to always use a Low Blur quality (unless modified post-creation).- The
BlurFXPipeline
didn't bind the quality of shader specified in the controller, meaning it always used the Low Blur shader, regardless of what the FX controller asked for. - The
FXBlurLow
fragment shader didn't have theoffset
uniform. This is now passed in and applued to the resulting blur, preventing it from creating 45 degree artifacts (thanks Wayfinder) - The
Tilemap.createFromObjects
method wouldn't always copy custom properties to the target objects or Data Manager. Fix #6391 (thanks @samme @paxperscientiam) - The
scale.min
andscale.max
width
andheight
properties in Game Config were ignored by the Game constructor, which was expectingminWidth
andminHeight
. This now matches the documnentation. Fix #6501 (thanks @NikitaShpanko @wpederzoli) - Due to a copy-paste bug, the
Actions.GetLast
function had the same code as theGetFirst
function. It now does what you'd expect it to do. Fix #6513 (thanks @dmokel) - The
TilemapLayer.PutTileAt
method would use an incorrect local GID if the Tilemap Layer wasn't using all available tilesets. Fix #5931 (thanks @christianvoigt @wjaykim) - The
TextureManager.addSpriteSheet
method would fail if aTexture
instance was given as the second parameter, throwing aCannot read property 'key' of null
(thanks @charlieschwabacher) - The
HexagonalCullBounds
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
HexagonalGetTileCorners
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
HexagonalTileToWorldXY
function incorrectly referencedthis
within it, instead oflayer
(thanks @DaliborTrampota) - The
BitmapText
Game Object will now reset the WebGL Texture unit on flush, which fixes an issue of a flush happened part-way during the rendering a BitmapText (thanks @EmilSV) - When using interpolation for a Particle Emitter operation, such as:
x: { values: [ 50, 500, 200, 800 ] }
it would fail to set the final value unless you specified theinterpolation
property as well. It now defaults tolinear
if not given. Fix #6551 (thanks @orcomarcio) - The Matter Physics
ignoreGravity
boolean is now checked during the Matter Engine internal functions, allowing this property to now work again. Fix #6473 (thanks @peer2p) Group.createFromConfig
will now check to see if the config contains eitherinternalCreateCallback
orinternalRemoveCallback
and set them accordingly. This fixes an issue where the callbacks would never be set if specified in an array of single configuration objects. Fix #6519 (thanks @samme)PhysicsGroup
will now set theclassType
and null theconfig
when an array of single configuration objects is given in the constructor. Fix #6519 (thanks @samme)- The
PathFollower.pathUpdate
method will now check if thetween
property has a validdata
component before running the update. This prevents a call toPathFollower.stopFollow
from throwing aCannot read properties of null (reading '0')
error as it tried to do a single update post stop. Fix #6508 (thanks @francois-dibulo)
Examples, Documentation, Beta Testing and TypeScript
My thanks to the following for helping with the Phaser 3 Examples, Beta Testing, Docs, and TypeScript definitions, either by reporting errors, fixing them, or helping author the docs: