This version is out of date

The version of Phaser downloaded from this page is not the current stable release.

Version: 2.4.4 - "Amador"
Released: 15th August 2015
Next Version: 2.4.5
Previous Version: 2.4.3

Change Log

New Features

  • Emitter.emitParticle now has 4 new optional arguments: x, y, key and frame. These allow you to override whatever the Emitter default values may be and emit the particle from the given coordinates and with a new texture.
  • Group.resetChild is a new method that allows you to call both child.reset and/or child.loadTexture on the given child object. This is used internally by getFirstDead and similar, but is made public so you can use it as a group iteration callback. Note that the child must have public reset and loadTexture methods to be valid for the call.
  • Group.getFirstDead, Group.getFirstAlive and Group.getFirstExists all have new optional arguments: createIfNull, x, y, key and frame. If the method you call cannot find a matching child (i.e. getFirstDead cannot find any dead children) then the optional createIfNull allows you to instantly create a new child in the group using the position and texture arguments to do so. This allows you to always get a child back from the Group and remove the need to do null checks and Group inserts from your game code. The same arguments can also be used in a different way: if createIfNull is false AND you provide the extra arguments AND a child is found then it will be passed to the new Group.resetChild method. This allows you to retrieve a child from the Group and have it reset and instantly ready for use in your game without any extra code.
  • P2.Body.removeCollisionGroup allows you to remove the given CollisionGroup, or array of CollisionGroups, from the list of groups that a body will collide with and updates the collision masks (thanks @Garbanas #2047)
  • Filter.addToWorld allows you to quickly create a Phaser.Image object at the given position and size, with the Filter ready applied to it. This can eliminate lots of duplicate code.
  • Tiled 0.13.0 added support for layer data compression when exporting as JSON. This means that any .tmx stored using base64 encoding will start exporting layer data as a base64 encoded string rather than a native array. This update adds in automatic support for this as long as the data isn't compressed. For IE9 support you'll need to use the new polyfill found in the resources folder (thanks @noidexe #2084)
  • You can now load single layer Pyxel Edit TileMaps as an atlas (thanks @joshpmcghee #2050)
  • Canvas.getSmoothingPrefix will return the vendor prefixed smoothing enabled value from the context if set, otherwise null.
  • The Random Number Generator can now get and set its state via rnd.state. This allows you to do things like saving the state of the generator to a string that can be part of a save-game file and load it back in again (thanks @luckylooke #2056 #1900)
  • Device.iOSVersion now contains the major version number of iOS.
  • The new PointerMode enumeration value has been added for better simple input discrimination in the future, between active pointers such as touch screens and passive pointers, such as mouse cursors (thanks @pnstickne #2062)
  • Button.justReleasedPreventsOver controls if a just-release event on a pointer prevents it from being able to trigger an over event.
  • Button.forceOut expanded to accept a PointerMode value such that it can be controlled per-input mode.
  • Phaser.KeyCode is a new pseudo-type used by the Keyboard class (and your code) to allow for separation of all the Keyboard constants to their own file. This stops the JSDocs from becoming 'polluted' and allows for easier future expansion (thanks @pnstickne #2118 #2031)


  • TypeScript definitions fixes and updates (thanks @clark-stevenson @milkey-mouse @timotei @qdrj @Garbanas @cloakedninjas)
  • Docs typo fixes (thanks @rwrountree @yeluoqiuzhi @pnstickne @fonsecas72 @JackMorganNZ @caryanne)
  • Math.average has been optimized (thanks @rwrountree #2025)
  • When calling GameObject.revive the heal method is called to apply the health value, allowing it to take into consideration a maxHealth value if set (thanks @bsparks #2027)
  • Change, ..) to use slice instead (thanks @pnstickne #2034 #2032)
  • BitmapData.move, moveH and moveV have a new optional wrap argument allowing you to control if the contents of the BitmapData are wrapped around the edges (true) or simply scrolled off (false).
  • Time.desiredFps has moved to a getter / setter.
  • Time.physicsElapsed and Time.physicsElapsedMS are no longer calculated every frame, but only when the desiredFps is changed.
  • Time.update has been streamlined and the updateSetTimeout and updateRAF methods merged and duplicate code removed.
  • Time.desiredFpsMult is a pre-calculated multiplier used in Game.update.
  • Time.refresh updates the Time.time and Time.elapsedMS values and is called automatically by Game.update.
  • DeviceButton was setting a duration property on itself, which went against the read only getter of duration (thanks @winstonwolff)
  • Added Node.js v4 stable to Travis config (thanks @phillipalexander #2070)
  • Optimised Canvas.getSmoothingEnabled, Canvas.setSmoothingEnabled and Canvas.setImageRenderingCrisp.
  • The Physics Editor Exporter (found in the resources folder of the repo) has had an option to prefix shape names and optimize JSON output added to it (thanks @Garbanas #2093)
  • Touch.addTouchLockCallback has a new argument onEnd which allows the callback to fire either on a touchstart or a touchend event.
  • The SoundManager now detects if the browser is running under iOS9 and uses a touchend callback to unlock the audio subsystem. Previous versions of iOS (and Android) still use touchstart. This fixes Apple's screw-up with regard to changing the way Web Audio should be triggered in Mobile Safari. Thanks Apple (thanks @MyCatCarlos for the heads-up #2095)
  • InputHandler.validForInput now checks if the game object has input.enabled set to false and doesn't validate it for input if that's the case.
  • The default Button.onOverMouseOnly value has changed from false to true. If you used this in your touch enabled games then please be aware of this change (#2083)
  • BitmapData.clear now automatically calls BitmapData.update at the end of it.
  • New Color stub added for the custom build process. Contains just the bare minimum of functions that Phaser needs to work. Cuts file size from 48.7KB to 7.4KB. Note: Do not stub this out if using BitmapData objects.
  • New DOM stub added for the custom build process. Contains just the bare minimum of functions that Phaser needs to work. Cuts file size from 14.8KB to 2.4KB. Note: Do not stub this out if using the full Scale Manager.
  • New Scale Manager stub added. Removes all Scale Manager handling from Phaser! But saves 75KB in the process. If you know you don't need to scale the Phaser canvas, or are handling that externally, then you can safely stub it out in a custom build.
  • Added the PIXI.PolyK, PIXI.WebGLGraphics and PIXI.CanvasGraphics files to the Graphics custom build option. They weren't used anyway and this removes an extra 40.2KB from the build size.
  • Phaser.Create no longer automatically creates a BitmapData object when it starts. It now only does it when you first make a texture or grid.
  • New Create stub added for the custom build process. Cuts file size by 8KB.
  • You can now exclude the FlexGrid from custom builds, saving 15KB.
  • The ScaleManager no longer creates a Phaser.FlexGrid if the class isn't available (i.e. excluded via a custom build)
  • Time.suggestedFps is now defaulted to Time.desiredFps for the first few frames until things have settled down (previously it was null) (thanks @noidexe #2130)
  • Text with anchor 0.5 and word wrap would have an extra space added to its width calculations, this is now adjusted for (thanks @nickryall #2052 #1990)
  • ScaleManager.getParentBounds now checks if parentNode has an offsetParent before calling getBoundingClientRect on it (thanks @McFarts #2134)

Bug Fixes

  • Loader.bitmapFont wouldn't automatically set the atlasURL value if just the key was given.
  • The Loader would put the baseURL and/or path in front of data: and blob URLs (thanks @rblopes #2044)
  • When the Text width was being calculated it would add the strokeThickness value twice, causing an alignment offset (thanks @nickryall #2039)
  • Sound.onEndedHandler has a fix for AudioBufferSourceNode listener memory leak (thanks @Pappa #2069)
  • Game.update could call updateLogic multiple times in a single frame when catching up with slow device frame rates. This would cause Tweens to advance at twice the speed they should have done (thanks @mkristo)
  • Added useCapture flags to removeEventListener in MSPointer class (thanks @pmcmonagle #2055)
  • Under setTimeOut (or when forceSetTimeOut was true) the Time was incorrectly setting Time.timeExpected causing game updates to lag (thanks @satan6 #2087)
  • Fixes edge case when TilingSprite is removed before render (thanks @pnstickne #2097 #2092)
  • Camera.setBoundsToWorld only adjusts the bounds if it exists (thanks @prudolfs #2099)
  • Keyboard.addCallbacks didn't check to see if the arguments were null, only if they were undefined making the jsdocs misleading.
  • ScaleManager.getParentBounds now takes any transforms into account to get the correct parent bounds (thanks @jdnichollsc #2111 #2098)
  • Cache.addBitmapFont now applies a default value for the x and y spacing if the arguments are omitted (thanks @nlotz #2128)
  • Removed use of the tilePosition property in the Phaser.Rope class as it isn't implemented and caused calls to Rope.reset to crash (thanks @spayton #2135)
  • ScaleMin and ScaleMax stopped working in Phaser 2.3.0 due to an incorrect transform callback scope (thanks @brianbunch #2132)

Pixi Updates

Please note that Phaser uses a custom build of Pixi and always has done. The following changes have been made to our custom build, not to Pixi in general.

  • CanvasRenderer.mapBlendModes optimised to cut down on file size.
  • PIXI.WebGLRenderer.updateTexture now returns a boolean depending on if the texture was successfully bound to the gl context or not.
  • PIXI.WebGLSpriteBatch.renderBatch would still try and render a texture even if updateTexture failed to bind it. It now checks the return value from updateTexture and ignores failed binds.
  • WebGLRenderer.mapBlendModes optimised to cut down on file size.
  • Sprite.getBounds would report an inaccurate value if the sprite was negatively scaled (causing things like generateTexture to be cut off) (thanks @DavidAPC #2108)
  • Removed DisplayObject.transformCallback as it's a Game Object component.
  • BaseTexture.skipRender is a new boolean that can be set to skip the rendering phase in the WebGL Sprite Batch. You may want to do this if you have a parent Sprite with no visible texture (i.e. uses the internal __default texture) that has children that you do want to render, without causing a batch flush in the process.