Closed greenkeeper[bot] closed 6 years ago
Update? #12
Update to this version instead š
fadeEffect
, flashEffect
and shakeEffect
. You can still use the friendly Camera level methods: shake
, fade
and flash
._fadeAlpha
) have been removed. If you need access to these values you can get it much more cleanly via the camera effects classes themselves. They were always private anyway, but we know some of you needed to modify them, so have been doing so from your code. This code will now need updating.Camera.cull
.callback
property of the Camera effects methods has changed purpose. It is no longer an onComplete
callback, but is now an onUpdate
callback. It is invoked every frame for the duration of the effect. See the docs for argument details.progress
property on the effect instance, allowing you to sync effect duration with other in-game events.There is a new method available in the ScenePlugin, available via: this.scene.transition
which allows you to transition from one Scene to another over the duration specified. The method takes a configuration object which lets you control various aspects of the transition, from moving the Scenes around the display list, to specifying an onUpdate callback.
The calling Scene can be sent to sleep, stopped or removed entirely from the Scene Manager at the end of the transition, and you can even lock down input events in both Scenes while the transition is happening, if required. There are various events dispatched from both the calling and target Scene, which combined with the onUpdate callback give you the flexibility to create some truly impressive transition effects both into and out of Scenes.
Please see the complete JSDocs for the ScenePlugin for more details, as well as the new examples in the Phaser 3 Labs.
enabled
which allows you to enable or disable input processing on per Scene basis.letterSpacing
property, causing it to only render the first character in WebGL (thanks @Antriel)isBooted
state if you didn't add any Scenes into the Game Config. Fix #3553 (thanks @rgk)mute
would get into a recursive loop.removeCallback
and (if specified) destroy
in any case. Now it does nothing if the Game Object isn't a member of the group (thanks @samme)maxSize
(which can happen if you reduce maxSize beneath the current size), isFull
would return false and the group could continue to grow. Now isFull
returns true in that case (thanks @samme)GL_INVALID_OPERATION: Vertex buffer is not big enough for the draw call
in WebGL.mute
, loop
, seek
and volume
.ignoreDestroy
property.My thanks to the following for helping with the Phaser 3 Examples, Docs and TypeScript definitions, either by reporting errors, fixing them or helping author the docs:
The new version differs by 99 commits.
1eff0b2
Phaser 3.5.0 Build
5cc2ebd
Fixed issue when destroying WebGLRenderer
1507dcf
eslint fix
5ccac59
Updated docs and destroy properties
b28a727
Fixed Game.destroy
9961636
Fixed overflowing of vertex count on particle emitter batcher
ea0bdce
Updated jsdocs
c37c636
The RandomDataGenerator class is now exposed under Phaser.Math should you wish to instantiate it yourself. Fix #3576
28e2764
More jsdoc fixes
3f722ba
Fixed color namespace
f02eb58
Marked all Tilemap components as private
52c6a3c
Updated jsdocs
b392dee
More jsdoc fixes
18585de
Lots of jsdoc fixes
a469110
Updated github templates
There are 99 commits in total.
See the full diff
Update to this version instead š
deleteTexture
on both renderers, but it's only available in WebGL (thanks @jmcriat)My thanks to the following for helping with the Phaser 3 Examples, Docs and TypeScript definitions, either by reporting errors, fixing them or helping author the docs:
@NemoStein @gabegordon @gazpachu @samme @cristlee @melissaelopez @dazigemm @tgrajewski
The new version differs by 18 commits.
765730c
3.5.1 Release
135ea60
Merge branch 'master' of https://github.com/photonstorm/phaser
152a017
Updated log
eceb435
Fixed issue on particle emitter rendering not writing directly to the vertex count property
89c9da5
Added more contributors
d3e6d60
Merge branch 'master' of https://github.com/photonstorm/phaser
8eef87b
Log update
d3d2197
lint fix
c3c39d8
Merge pull request #3584 from NemoStein/master
5499761
Only return 2d context
529cded
Re-enabled getScene. #3579
2c3f132
Updated jsdocs (all XHR parameters are optional in Phaser.Loader.FileTypes)
1be486f
destroy
only called once, no matter how many times the Scene restarts. Fix #3581
21f00d0
Merge branch 'master' of https://github.com/photonstorm/phaser
d8c519c
Updated change log
There are 18 commits in total.
See the full diff
Update to this version instead š
The new version differs by 46 commits.
75b250b
3.6.0 Release
349a95b
Updating to 3.6.0
cfc4528
Containers no longer in beta.
59ec8de
Merge branch 'master' of https://github.com/photonstorm/phaser
305ffdf
Updated change log
4cd2713
Merge pull request #3597 from Fabadiculous/docs
8f54932
Remove canvas from parent node.
3d0be3e
Group.remove and clear have optional destroyChild
arguments
e14d0c5
eslint fixes
a6c4306
# not .
eb1990d
jsdoc fix
176b085
jsdoc fix
cb4eb9e
Rescoped RetroFont so it's no longer bound to BitmapText
24afede
Add full stops at end of descriptions
5b31a51
Rescoped
There are 46 commits in total.
See the full diff
Update to this version instead š
The new version differs by 237 commits.
7788602
3.7.1 Release
321ccf8
3.7.0 Release
57918bb
Removed the need for raw-loader
in webpack. Shaders now build to standard JS files. Removed fs requirement.
c89728d
lint fix
ec3bd4c
The WebAudioSoundManager will now listen for 'click' events on the document body, as well as touch events, before resuming the AudioContext.
1414b77
Merge branch 'master' of https://github.com/photonstorm/phaser
672a535
Added disableInteractive and removeInteractive methods. #3621
aed8961
Merge pull request #3647 from zilbuz/jsdocs
0441e19
Updated jsdocs
fe03667
Update JSDocs
ee2c061
Updated jsdocs
cfef9c9
Updated change log
d7dfc11
Added jsdocs
ed9dbde
Added jsdocs
5700e9a
jsdocs update
There are 237 commits in total.
See the full diff
Update to this version instead š
The new version differs by 62 commits.
62c458d
New 3.8 build files
0d0846a
Calling a creator, such as GraphicsCreator, without passing in a config object, would cause an error to be thrown. All Game Object creators now catch against this.
dfc3cb9
3.8.0 Release
66810f9
Added fixed core build and updated AP config
9f7d3bf
Allowed get
to return the class and added autoStart boolean
5e667ec
Fixed 'all frames' check
984c90f
Merge pull request #3659 from samme/fix/typescript-body
26faa58
Corrected an error in Container.getBoundsTransformMatrix that called a missing method, causing a getBounds
on a nested container to fail. Fix #3624
0bbffdc
Correct JSDoc type for GameObject#body
5b0cb0f
All Game Objects have a new method setRandomPosition
which will randomly position them anywhere within the defined area, or if no area is given, anywhere within the game size.
2f4358f
The keycodes for 0 to 9 on the numeric keypad have been added. You can now use them in events
9500a6e
When calling generateFrameNames
to define an animation from a texture atlas you can now leave out all of the config properties and it will create an animation using every frame found in the atlas. Please understand you've no control over the sequence of these frames if you do this and it's entirely dictated by the json data
6d1166a
lint fixes
3043fd5
Added jsdocs and unified the boot process
ef9ab05
PluginManager updates to handle Scene system injection, PluginCache use and registering new game objects and file types
There are 62 commits in total.
See the full diff
Update to this version instead š
npm run help
will display a friendly list of all the scripts available (run npm install
first)hasFocus
which is a read-only boolean that lets you know if the window the game is embedded in (including in an iframe) currently has focus or not.autoFocus
, which is true
by default, and will automatically call window.focus()
when the game starts.window.focus
. This means in games that use keyboard controls if you tab or click away from the game, then click back on it again, the keys will carry on working (where-as before they would remain unfocused)setAllowDrag
which toggles the allowDrag
property (thanks @samme)setAllowGravity
which toggles the allowGravity
property (thanks @samme)setAllowRotation
which toggles the allowRotation
property (thanks @samme)allowDrag
, allowGravity
and allowRotation
(thanks @samme)addToScene
which allows you to inject the new file type into the LoaderPlugin of the given Scene. You could use this to add the file type into the Scene in which it was loaded.mapping
. This allows you to give a Global Plugin a property key, so that it is automatically injected into any Scenes as a Scene level instance. This allows you to have a single global plugin running in the PluginManager, that is injected into every Scene automatically.lerpX
and lerpY
which allow you to set the interpolation value used when following the target. The default is 1 (no interpolation) and offsetX
and offsetY
which allow you to set the follow offset values.scrollX
and scrollY
values to be that of the target position to avoid a large initial lerps during the first few preUpdates.mapping
, which allows a global plugin to be injected into a Scene as a reference.preDestroy
to take advantage of the preDestroy callback system.preDestroy
to take advantage of the preDestroy callback system.ignoreDestroy
property.destroy
once.dragend
event would be broadcast even if the drag distance or drag time thresholds were not met. Fix #3686 (thanks @RollinSafary)Thanks to the work of @hexus we have now documented nearly all of the Math namespace. This is hundreds of functions now covered by full docs and is work we'll continue in the coming weeks.
My thanks to the following for helping with the Phaser 3 Examples, Docs and TypeScript definitions, either by reporting errors, fixing them or helping author the docs:
The new version differs by 98 commits.
23d3fe3
3.9.0 Release
6cfc5d4
The AudioContextMonkeyPatch has been updated to use an iife. Fix #3437
3d9da06
Camera.shake would not effect dynamic tilemap layers. Fix #3669
05f55dc
Minor parameter renaming for SmoothStep interpolation functions.
2e0b50e
Simplified implementations of SmoothStepInterpolation and SmootherStepInterpolation.
2f3c35c
Fixed SmoothStepInterpolation and SmootherStepInterpolation implementations.
f38a068
Updated SmoothStep and SmootherStep documentation. Fixed lint errors.
424b5d7
Added SmootherStep interpolation function.
603483e
Merge branch 'master' of https://github.com/photonstorm/phaser
7d692bc
Added Camera.followOffset property and helper methods setLerp and setFollowOffset.
9834e9d
Added followOffset property to Camera target
bed3968
Added SmoothStep interpolation function
2684e7d
Updated docs and added native clamping
e6d1df5
Started documenting Matrix3 and Matrix4.
3a56fc3
Described all easing functions.
There are 98 commits in total.
See the full diff
Update to this version instead š
pointers
array.addPointer
allows you to add one, or more, new pointers to the Input Manager. There is no hard-coded limit to the amount you can have, although realistically you should never need more than 10. This method is available on both the Input Manager and Plugin, allowing you to use this.input.addPointer
from within your game code.pointersTotal
contains the total number of active pointers, which can be set in the Game Config using the input.activePointers
property. Phaser will create 2 pointers on start unless a different value is given in the config, or you can add them at run-time.mousePointer
is a new property that is specifically allocated for mouse use only. This is perfect for desktop only games but should be ignored if you're creating a mouse + touch game (use activePointer instead).activePointer
will now reflect the most recently active pointer on the game, which is considered as being the pointer to have interacted with the game canvas most recently.addUpCallback
, addDownCallback
and addMoveCallback
. These methods allow you to add callbacks to be invoked whenever native DOM mouse or touch events are received. Callbacks passed to this method are invoked immediately when the DOM event happens, within the scope of the DOM event handler. Therefore, they are considered as 'native' from the perspective of the browser. This means they can be used for tasks such as opening new browser windows, or anything which explicitly requires user input to activate. However, as a result of this, they come with their own risks, and as such should not be used for general game input, but instead be reserved for special circumstances. The callbacks can be set as isOnce
so you can control if the callback is called once then removed, or every time the DOM event occurs.worldX
and worldY
which contain the position of the Pointer, translated into the coordinate space of the most recent Camera it interacted with.InputManager.dirty
is a new internal property that reflects if any of the Pointers have updated this frame.InputManager.update
now uses constants internally for the event type checking, rather than string-based like before.InputManager.startPointer
is a new internal method, called automatically by the update loop, that handles touch start events.InputManager.updatePointer
is a new internal method, called automatically by the update loop, that handles touch move events.InputManager.stopPointer
is a new internal method, called automatically by the update loop, that handles touch end events.InputManager.hitTest
has had its arguments changed. It no longer takes x/y properties as the first two arguments, but instead takes a Pointer object (from which the x/y coordinates are extracted).TouchManager.handler
has been removed as it's no longer used internally.TouchManager.onTouchStart
, onTouchMove
and onTouchEnd
are the new DOM Touch Event handlers. They pass the events on to the InputManagers queueTouchStart
, queueTouchMove
and queueTouchEnd
methods respectively.MouseManager.handler
has been removed as it's no longer used internally.MouseManager.onMouseDown
, onMouseMove
and onMouseUp
are the new DOM Mouse Event handlers. They pass the events on to the InputManagers queueMouseDown
, queueMouseMove
and queueMouseUp
methods respectively.enabled
to false on either the TouchManager, MouseManager or KeyboardManager will prevent it from handling any native DOM events until you set it back again.mousePointer
, pointer1
, pointer2
, pointer3
, pointer4
, pointer5
, pointer6
, pointer7
, pointer8
, pointer9
and pointer10
. Most of these will be undefined unless you call addPointer
first, or set the active pointers quantity in your Game Config.transformPointer
which will set the transformed x and y properties of a Pointer in one call, rather than the 2 calls it took before. This is now used by all Pointer event handlers.makePixelPerfect
which allows you to specify a texture-based Game Object as being pixel perfect when performing all input checks against it. You use it like this: this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect())
, or the easier: setInteractive({ pixelPerfect: true })
- you can also pass or set an optional alpha tolerance level. See the method docs for full details and the new examples to see it in action. Note that as a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from the given coordinates and checking its color values. This is an expensive process, so should only be enabled on Game Objects that really need it.this.input.setDefaultCursor()
. This will take any valid CSS cursor string, including URLs to cursor image files.button.input.cursor = 'pointer'
, or to have a help cursor appear: button.input.cursor = 'help'
, or to have a custom image: button.input.cursor = 'url(assets/cursors/sword.cur), pointer'
.pointer
(hand cursor) there is a new short-cut: setInteractive({ useHandCursor: true })
. To use anything else: setInteractive({ cursor: CSSString })
where CSSString
is any valid CSS for setting a cursor.setInteractive
method can now take an Input Configuration object as its only argument. This allows you to set multiple input related properties in a single call, i.e.: setInteractive({ draggable: true, pixelPerfect: true })
. The available properties are:hitArea
- The object / shape to use as the Hit Area. If not given it will try to create a Rectangle based on the texture frame.hitAreaCallback
- The callback that determines if the pointer is within the Hit Area shape or not.draggable
- If true
the Interactive Object will be set to be draggable and emit drag events.dropZone
- If true
the Interactive Object will be set to be a drop zone for draggable objects.useHandCursor
- If true
the Interactive Object will set the pointer
hand cursor when a pointer is over it. This is a short-cut for setting cursor: 'pointer'
.cursor
- The CSS string to be used when the cursor is over this Interactive Object.pixelPerfect
- If true
the a pixel perfect function will be set for the hit area callback. Only works with texture based Game Objects.alphaTolerance
- If pixelPerfect
is set, this is the alpha tolerance threshold value used in the callback.KeyboardManager
class has been removed. It has been replaced with KeyboardPlugin
which is now an Input level plugin, that registers itself with the new InputPluginCache
. The Input Plugin class (which belongs to a Scene) will now automatically inject registered plugins into itself on boot. Every Scene has its own instance of the Input Plugin (if enabled in the scene plugins), which in turn has its own instance of the KeyboardPlugin. The InputManager
no longer has any reference to the Keyboard class at all. The benefits of this are two-fold: First, it allows you to now entirely exclude all of the keyboard classes from a custom build, saving a lot of space if not required. Secondly, it means that the Scenes themselves are now responsible for keyboard events, where-as before they were entirely global. This means a Scene can be paused and stop processing keyboard events, and stop having its Key objects updated, while another Scene can still carry on doing this. It also prevents key related callbacks in sleeping Scenes from being fired (which resolves issue #3733, thanks @JoeMoov2)KeyboardManager.handler
has been renamed to onKeyHandler
.KeyboardManager.captures
property has been removed as it can be more effectively handled by polling the keys
object instead.enabled
property is set to false, or if the Scene to which it belongs is not active.event.preventDefault
on the native DOM event as long as the Key exists in the keys array and has its preventDefault
property set to true
(which is the default). This means you can now control specifically which key prevents default on the browser, where-as before every key added did so.addKeyCapture
and removeKeyCapture
have been removed as you now control which keys prevent capture by using the addKey
or addKeys
methods (see entry above). The act of creating a Key is now enough to enable capture of it and can be toggled (at run-time) on a per-Key basis.KeyboardManager.addKeys
can now take either an object, or key codes, or a comma-separated string as its input. This means you can now do: keyboard.addKeys('W,S,A,D')
and get an object back with the properties WSAD mapped to the relevant Key objects.KeyboardManager.addKey
can now take either a Key object, a string, such as A
or SPACE
, or a key code value.KeyboardManager.removeKey
can now take either a Key object, a string, such as A
or SPACE
, or a key code value.GamepadManager
class has been removed. It has been replaced with GamepadPlugin
which is now an Input level plugin, that registers itself with the new InputPluginCache
. The Input Plugin class (which belongs to a Scene) will now automatically inject the registered plugins into itself on boot. Every Scene has its own instance of the Input Plugin (if enabled in the scene plugins), which in turn has its own instance of the GamepadPlugin. The InputManager
no longer has any reference to the Gamepad class at all. The benefits of this are two-fold: First, it allows you to now entirely exclude all of the gamepad classes from a custom build, saving a lot of space if not required. Secondly, it means that the Scenes themselves are now responsible for gamepad events, where-as before they were entirely global. This means a Scene can be paused and stop processing gamepad events, and stop having its Gamepad objects updated, while another Scene can still carry on doing this. It also prevents gamepad related callbacks in sleeping Scenes from being fired.pad1
to pad4
properties, meaning you can do: this.input.gamepad.pad1
for direct access to a pad once it's connected.left
, right
, up
, down
for directions, A
, Y
, X
and B
for buttons, L1
, L2
, R1
and R2
for shoulder buttons, and leftStick
and rightStick
for the axis sticks. You can still use Gamepad.getButtonValue()
to get the value from a button and Gamepad.getButtonTotal()
to get the total number of buttons available on the pad.Gamepad.getAxisTotal
and Gamepad.getAxisValue
will return the total number of axis, and an axis value, accordingly.Gamepad.setAxisThreshold
will now let you set the threshold across all axis of a Gamepad in one call.Button
objects will now emit 2 events, one from the button itself and another from the Gamepad. This means you can listen for button events in 3 ways: 1) By directly polling the button value in an update loop, 2) Listening for events on the Gamepad Plugin: this.input.gamepad.on('down')
, or 3) By listening for events on the Gamepad itself: gamepadReference.on('down')
.fps
config value and property (defaults to 60fps), which you can change at run-time using the setFPS
method. The core update loop has been recoded so that it steps based entirely on the given frame rate, and not the wall-clock or game step delta. This fixed time step allows for a straightforward implementation of a deterministic game state. Meaning you can now set the fps rate to a high value such as 240, regardless of the browser update speed (it will simply perform more physics steps per game step). This is handy if you want to increase the accuracy of the simulation in certain cases.step
function directly, to manually advance the simulation.timeScale
which will scale all time-step calculations at run-time, allowing you to speed-up or slow-down your simulation at will, without adjusting the frame rate.useTree
. In certain situations, i.e. densely packed worlds, this may give better performance. Static bodies will always use an RTree.collideSpriteVsGroup
has been rewritten. If you are using an RTree it now uses the results directly from the tree search, instead of iterating all children in the Group, which dramatically reduces the work it does. If you have disabled the RTree it performs a brute-force O(N2) Sprite vs. Group iteration sweep. We tested multiple axis sorting variants but the cost of the array allocation and/or sorting, with large amounts of bodies (10,000+), far outweighed the simple math involved in the separation logic.Body.useDamping
is a new boolean property that allows you to use a damping effect for drag, rather than the default linear deceleration. This gives much better results if you need smooth deceleration across both axis, such as the way the ship slows down in the game Asteroids, without the tell-tale axis drift associated with linear drag.GetOverlapX
and GetOverlapY
now use the calculated delta values, not the deltaX/Y methods.collideSpriteVsGroup
aborts early if the Sprite body has been disabled.updateMotion
has a new argument delta
which should typically be a fixed-time delta value.intersects
has been restructured to prioritize rect vs. rect checks.update
and postUpdate
have been recoded to handle the new fixed time-step system in place. update
now takes a new argument, delta, which is used internally for calculations.Body.dirty
has been removed as a property as it's no longer used internally.Body.deltaAbsX
and deltaAbsY
now return the cached absolute delta value from the previous update, and no longer calculate it during the actual call.World.enable
has been recoded to remove all the hasOwnProperty
checks and streamline the internal flow.World.disable
has been recoded to remove all the hasOwnProperty
checks and streamline the internal flow.World.add
is a new method that adds an existing body to the simulation and enableBody
now passes its newly created bodies to this method.World.disableGameObjectBody
has been removed as it duplicated what the disable
method did.World.enable
will pass the objects to enableBody
, which will create a new Body object, if required, and finally pass it to add
. World.disable
does the same, but removes the bodies from the simulation. It passes the bodies to disableBody
, which in turn passes it to remove
. Both of these work for single objects, an array of objects, Groups or even arrays of Groups.World.computeAngularVelocity
is a new method that specifically calculates the angular velocity of a Body.World.computeVelocity
has had its signature changed. Rather than taking a bunch of arguments all it now takes is a Body and a delta value. Internally it now calculates both the x and y velocity components together in the same single call, where-as before it was split into two calls and multiple assignments.World.computeVelocity
no longer returns the new velocities, they are now set directly on the body within the method.World.computeVelocity
has been recoded to use Fuzzy Greater Than and Less Than calls when applying drag to a previously accelerated body. Using a fuzzy epsilon allows us to mitigate the ping-pong issue, where a decelerating body would constantly flip between a small negative and positive velocity value and never come to an actual rest.World.computeVelocity
now checks the Body.useDamping
property to perform either linear deceleration or damping on the Body.World.updateMotion
has changed to call the new computeAngularVelocity
and computeVelocity
methods.blocked
properties accordingly (before it only set the touching
properties.) This means you can now use checks like Body.onFloor()
when traversing static bodies (thanks @fariazz)values
property. For example, if you set a new value such as this: data.set('gold', 50)
you can now access it via: data.values.gold
, where it is treated as a normal property, allowing you to use it in conditional evaluations if (data.values.level === 2)
, or modify it: data.values.gold += 50
.changedata
event, regardless if it is changed via the set
method, or the new values
approach.PlayerLives
, it will emit the event changedata_PlayerLives
. This happens regardless if it is changed via the set
method, or the new values
approach.set
method can now take an object containing key value pairs as the first argument. This means you can now set a bunch of values all at once, i.e: data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 })
.get
method can now take an array of keys, and will return an array of matching values. This is handy for array destructuring in ES6.remove
method can now take an array of keys, and will remove all matching values, emitting the removedata
event for each.setdata
event. If a value is set that already exists, it instead emits a changedata
and related changedata_key
event. Setting a new value no longer emits both events.resetFunction
function has been removed from the changedata
event arguments. Previously this was used to allow you to stop a value being updated by calling the reset function instead. However, it created brand new anonymous functions every single time a value was updated. As you can now access stored data via the values
property you can use this for much easier conditional checks and sets.blockSet
property has been removed as it's no longer used internally.update
method is polled every frame, which does the same job instead. This avoids load-time race conditions where pre-populated files would trigger loads part way during an existing load, fixing #3705 in the process (thanks @the-simian)init
, preload
and create
phase of your Scene. This means that any plugins, or custom code, written to use the Scene Systems preupdate
, update
or postupdate
events will need to be aware that these are now fired from init
onwards, not just once create
has finished.sceneUpdate
, which is a reference that maps to your Scene.update
function. During init
, preload
and create
this is always mapped to NOOP. Once create
has finished it gets re-mapped to your Scene's update function. If your Scene doesn't have one, it remains mapped to NOOP. In practise, this means nothing has changed from before. Scene.update
never ran until create
was completed, and it still doesn't. However, because the internal Scene systems are now updating right from init
, it means that things like the update list and physics systems are fully operational during your Preloader. This allows you to create far more elaborate preloaders than ever before. Although, with great power comes great responsibility, as the onus is now on you to be careful which events you consume (especially input events) during your preloader.RenderTexture.resize
will allow you to resize the underlying Render Texture to the new dimensions given. Doing this also clears the Render Texture at the same time (thanks @saqsun).Rectangle.RandomOutside
is a new function that takes two Rectangles, outer
and inner
, and returns a random point that falls within the outer rectangle but is always outside of the inner rectangle.length
, making it consistent with the Display List (thanks @samme)centerX
and centerY
which return the coordinates of the center of the viewport, relative to the canvas (thanks @samme)visible
. An invisible Camera will skip rendering and input tests of everything it can see. This allows you to create say a mini-cam and then toggle it on and off without needing to re-create it each time.setVisible
which toggles its visible property.CameraManager.fromJSON
will now set the visible property is defined in the config.ScenePlugin.run
is a new method that will run the given Scene and not change the state of the current Scene at all. If the scene is asleep, it will be woken. If it's paused, it will be resumed. If not running at all, it will be started.TextureManager.getPixelAlpha
is a new method that will return the alpha value of a pixel from the given texture and frame. It will return null
if the coordinates were out of bounds, otherwise a value between 0 and 255.Game.isOver
is a new read-only boolean property that indicates if the mouse pointer is currently over the game canvas or not. It is set by the VisibilityHandler and is only reliable on desktop systems.Game.mouseout
is dispatched if the mouse leaves the game canvas. You can listen to it from this.sys.game.events.on('mouseout')
from within a Scene.Game.mouseover
is dispatched if the mouse enters the game canvas, having previously been outside of it. You can listen to it from this.sys.game.events.on('mouseover')
from within a Scene.this.matter.add.sprite(x, y, texture, frame, { shape: shapes.banana })
(where shapes.banana
is one of the exported PhysicsEditor shapes in the JSON you loaded). See the 'physics/matterjs/advanced shape creation.js' example for more details.ForwardDiffuseLightPipeline
, used by the Lights system, now sets a flag if the Scene doesn't contain any lights. All of the Game Objects now check this flag and don't even bother adding themselves to the batch if there are no lights in the Scene, as they'd never render anyway. This also avoids the ghost-image problem if you swap Scenes to a new Scene with the Light Manager enabled, but no actual lights defined. Fix #3707 (thanks @samvieten).CameraManager.getCameraBelowPointer
has been renamed to getCamerasBelowPointer
and it now returns an array of all the cameras below the given pointer, not just the top-most one. The array is sorted so that the top-most camera is at the start of the array.TimeStep.step
the rawDelta
and delta
values are checked to make sure they are non-negative, which can happen in Chrome when the delta is reset and out of sync with the value passed to Request Animation Frame. Fix #3088 (thanks @Antriel)Cameras.Controls.Fixed
has been removed. It's was deprecated a few versions ago. Please use FixedKeyControl
instead.Cameras.Controls.Smoothed
has been removed. It's was deprecated a few versions ago. Please use SmoothedKeyControl
instead.RenderTexture.drawImage
method incorrectly set the values of the frame, causing them to appear wrongly scaled in the canvas renderer. Fix #3710 (thanks @saqsun).Math.Matrix4.makeRotationAxis()
(thanks @hexus)Math.abs()
in Math.Quaternion.calculateW()
(thanks @qxzkjp).remove()
handler when Animation
s are removed from the AnimationManager
. This prevented removed animations from stopping correctly.TweenManager.getTweensOf
method has been fixed to remove a potential endless loop should multiple targets be passed in to it (thanks @cyantree)Thanks to the work of @hexus we have now documented all of the Math namespace and made good progress on the Game Objects.
I personally have also documented the entire Input system, which was 328 classes, properties and methods to describe, as well as lots of other areas.
The new version differs by 172 commits.
16f61b4
3.10 Release
15b544f
jsdoc fixes
9d52b6a
Fixed jsdoc errors
7eac419
Fixed namespace
641abd3
Updated the change log
579f5bf
Added the new sceneUpdate reference property.
eb8d3cc
No longer injects update
into a Scene, and now calls step
from init onwards.
f034883
The Loader now uses an update loop to release new files to the queue, rather than doing it during the async hell-hole that was the inflight iterator. Fix #3705.
d6c2b11
Replace KeyboardManager with KeyboardPlugin
6dba00a
Updated change log
7608fcd
Small package update
c7c104b
Tidied up the formatting and jsdocs for Physics Editor parser
9a53daa
Merge pull request #3729 from CodeAndWeb/matterjs-pe-loader
ff7f614
renamed to PhysicsEditorParser, added jsdocs
d058674
eslint fix
There are 172 commits in total.
See the full diff
Update to this version instead š
addPointer
or specified one in the config. Now, it Touch is enabled in the config, it'll always create 2 pointers by default.pointers
array.addPointer
allows you to add one, or more, new pointers to the Input Manager. There is no hard-coded limit to the amount you can have, although realistically you should never need more than 10. This method is available on both the Input Manager and Plugin, allowing you to use this.input.addPointer
from within your game code.pointersTotal
contains the total number of active pointers, which can be set in the Game Config using the input.activePointers
property. Phaser will create 2 pointers on start unless a different value is given in the config, or you can add them at run-time.mousePointer
is a new property that is specifically allocated for mouse use only. This is perfect for desktop only games but should be ignored if you're creating a mouse + touch game (use activePointer instead).activePointer
will now reflect the most recently active pointer on the game, which is considered as being the pointer to have interacted with the game canvas most recently.addUpCallback
, addDownCallback
and addMoveCallback
. These methods allow you to add callbacks to be invoked whenever native DOM mouse or touch events are received. Callbacks passed to this method are invoked immediately when the DOM event happens, within the scope of the DOM event handler. Therefore, they are considered as 'native' from the perspective of the browser. This means they can be used for tasks such as opening new browser windows, or anything which explicitly requires user input to activate. However, as a result of this, they come with their own risks, and as such should not be used for general game input, but instead be reserved for special circumstances. The callbacks can be set as isOnce
so you can control if the callback is called once then removed, or every time the DOM event occurs.worldX
and worldY
which contain the position of the Pointer, translated into the coordinate space of the most recent Camera it interacted with.InputManager.dirty
is a new internal property that reflects if any of the Pointers have updated this frame.InputManager.update
now uses constants internally for the event type checking, rather than string-based like before.InputManager.startPointer
is a new internal method, called automatically by the update loop, that handles touch start events.InputManager.updatePointer
is a new internal method, called automatically by the update loop, that handles touch move events.InputManager.stopPointer
is a new internal method, called automatically by the update loop, that handles touch end events.InputManager.hitTest
has had its arguments changed. It no longer takes x/y properties as the first two arguments, but instead takes a Pointer object (from which the x/y coordinates are extracted).TouchManager.handler
has been removed as it's no longer used internally.TouchManager.onTouchStart
, onTouchMove
and onTouchEnd
are the new DOM Touch Event handlers. They pass the events on to the InputManagers queueTouchStart
, queueTouchMove
and queueTouchEnd
methods respectively.MouseManager.handler
has been removed as it's no longer used internally.MouseManager.onMouseDown
, onMouseMove
and onMouseUp
are the new DOM Mouse Event handlers. They pass the events on to the InputManagers queueMouseDown
, queueMouseMove
and queueMouseUp
methods respectively.enabled
to false on either the TouchManager, MouseManager or KeyboardManager will prevent it from handling any native DOM events until you set it back again.mousePointer
, pointer1
, pointer2
, pointer3
, pointer4
, pointer5
, pointer6
, pointer7
, pointer8
, pointer9
and pointer10
. Most of these will be undefined unless you call addPointer
first, or set the active pointers quantity in your Game Config.transformPointer
which will set the transformed x and y properties of a Pointer in one call, rather than the 2 calls it took before. This is now used by all Pointer event handlers.makePixelPerfect
which allows you to specify a texture-based Game Object as being pixel perfect when performing all input checks against it. You use it like this: this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect())
, or the easier: setInteractive({ pixelPerfect: true })
- you can also pass or set an optional alpha tolerance level. See the method docs for full details and the new examples to see it in action. Note that as a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from the given coordinates and checking its color values. This is an expensive process, so should only be enabled on Game Objects that really need it.this.input.setDefaultCursor()
. This will take any valid CSS cursor string, including URLs to cursor image files.button.input.cursor = 'pointer'
, or to have a help cursor appear: button.input.cursor = 'help'
, or to have a custom image: button.input.cursor = 'url(assets/cursors/sword.cur), pointer'
.pointer
(hand cursor) there is a new short-cut: setInteractive({ useHandCursor: true })
. To use anything else: setInteractive({ cursor: CSSString })
where CSSString
is any valid CSS for setting a cursor.setInteractive
method can now take an Input Configuration object as its only argument. This allows you to set multiple input related properties in a single call, i.e.: setInteractive({ draggable: true, pixelPerfect: true })
. The available properties are:hitArea
- The object / shape to use as the Hit Area. If not given it will try to create a Rectangle based on the texture frame.hitAreaCallback
- The callback that determines if the pointer is within the Hit Area shape or not.draggable
- If true
the Interactive Object will be set to be draggable and emit drag events.dropZone
- If true
the Interactive Object will be set to be a drop zone for draggable objects.useHandCursor
- If true
the Interactive Object will set the pointer
hand cursor when a pointer is over it. This is a short-cut for setting cursor: 'pointer'
.cursor
- The CSS string to be used when the cursor is over this Interactive Object.pixelPerfect
- If true
the a pixel perfect function will be set for the hit area callback. Only works with texture based Game Objects.alphaTolerance
- If pixelPerfect
is set, this is the alpha tolerance threshold value used in the callback.KeyboardManager
class has been removed. It has been replaced with KeyboardPlugin
which is now an Input level plugin, that registers itself with the new InputPluginCache
. The Input Plugin class (which belongs to a Scene) will now automatically inject registered plugins into itself on boot. Every Scene has its own instance of the Input Plugin (if enabled in the scene plugins), which in turn has its own instance of the KeyboardPlugin. The InputManager
no longer has any reference to the Keyboard class at all. The benefits of this are two-fold: First, it allows you to now entirely exclude all of the keyboard classes from a custom build, saving a lot of space if not required. Secondly, it means that the Scenes themselves are now responsible for keyboard events, where-as before they were entirely global. This means a Scene can be paused and stop processing keyboard events, and stop having its Key objects updated, while another Scene can still carry on doing this. It also prevents key related callbacks in sleeping Scenes from being fired (which resolves issue #3733, thanks @JoeMoov2)KeyboardManager.handler
has been renamed to onKeyHandler
.KeyboardManager.captures
property has been removed as it can be more effectively handled by polling the keys
object instead.enabled
property is set to false, or if the Scene to which it belongs is not active.event.preventDefault
on the native DOM event as long as the Key exists in the keys array and has its preventDefault
property set to true
(which is the default). This means you can now control specifically which key prevents default on the browser, where-as before every key added did so.addKeyCapture
and removeKeyCapture
have been removed as you now control which keys prevent capture by using the addKey
or addKeys
methods (see entry above). The act of creating a Key is now enough to enable capture of it and can be toggled (at run-time) on a per-Key basis.KeyboardManager.addKeys
can now take either an object, or key codes, or a comma-separated string as its input. This means you can now do: keyboard.addKeys('W,S,A,D')
and get an object back with the properties WSAD mapped to the relevant Key objects.KeyboardManager.addKey
can now take either a Key object, a string, such as A
or SPACE
, or a key code value.KeyboardManager.removeKey
can now take either a Key object, a string, such as A
or SPACE
, or a key code value.GamepadManager
class has been removed. It has been replaced with GamepadPlugin
which is now an Input level plugin, that registers itself with the new InputPluginCache
. The Input Plugin class (which belongs to a Scene) will now automatically inject the registered plugins into itself on boot. Every Scene has its own instance of the Input Plugin (if enabled in the scene plugins), which in turn has its own instance of the GamepadPlugin. The InputManager
no longer has any reference to the Gamepad class at all. The benefits of this are two-fold: First, it allows you to now entirely exclude all of the gamepad classes from a custom build, saving a lot of space if not required. Secondly, it means that the Scenes themselves are now responsible for gamepad events, where-as before they were entirely global. This means a Scene can be paused and stop processing gamepad events, and stop having its Gamepad objects updated, while another Scene can still carry on doing this. It also prevents gamepad related callbacks in sleeping Scenes from being fired.pad1
to pad4
properties, meaning you can do: this.input.gamepad.pad1
for direct access to a pad once it's connected.left
, right
, up
, down
for directions, A
, Y
, X
and B
for buttons, L1
, L2
, R1
and R2
for shoulder buttons, and leftStick
and rightStick
for the axis sticks. You can still use Gamepad.getButtonValue()
to get the value from a button and Gamepad.getButtonTotal()
to get the total number of buttons available on the pad.Gamepad.getAxisTotal
and Gamepad.getAxisValue
will return the total number of axis, and an axis value, accordingly.Gamepad.setAxisThreshold
will now let you set the threshold across all axis of a Gamepad in one call.Button
objects will now emit 2 events, one from the button itself and another from the Gamepad. This means you can listen for button events in 3 ways: 1) By directly polling the button value in an update loop, 2) Listening for events on the Gamepad Plugin: this.input.gamepad.on('down')
, or 3) By listening for events on the Gamepad itself: gamepadReference.on('down')
.fps
config value and property (defaults to 60fps), which you can change at run-time using the setFPS
method. The core update loop has been recoded so that it steps based entirely on the given frame rate, and not the wall-clock or game step delta. This fixed time step allows for a straightforward implementation of a deterministic game state. Meaning you can now set the fps rate to a high value such as 240, regardless of the browser update speed (it will simply perform more physics steps per game step). This is handy if you want to increase the accuracy of the simulation in certain cases.step
function directly, to manually advance the simulation.timeScale
which will scale all time-step calculations at run-time, allowing you to speed-up or slow-down your simulation at will, without adjusting the frame rate.useTree
. In certain situations, i.e. densely packed worlds, this may give better performance. Static bodies will always use an RTree.collideSpriteVsGroup
has been rewritten. If you are using an RTree it now uses the results directly from the tree search, instead of iterating all children in the Group, which dramatically reduces the work it does. If you have disabled the RTree it performs a brute-force O(N2) Sprite vs. Group iteration sweep. We tested multiple axis sorting variants but the cost of the array allocation and/or sorting, with large amounts of bodies (10,000+), far outweighed the simple math involved in the separation logic.Body.useDamping
is a new boolean property that allows you to use a damping effect for drag, rather than the default linear deceleration. This gives much better results if you need smooth deceleration across both axis, such as the way the ship slows down in the game Asteroids, without the tell-tale axis drift associated with linear drag.GetOverlapX
and GetOverlapY
now use the calculated delta values, not the deltaX/Y methods.collideSpriteVsGroup
aborts early if the Sprite body has been disabled.updateMotion
has a new argument delta
which should typically be a fixed-time delta value.intersects
has been restructured to prioritize rect vs. rect checks.update
and postUpdate
have been recoded to handle the new fixed time-step system in place. update
now takes a new argument, delta, which is used internally for calculations.Body.dirty
has been removed as a property as it's no longer used internally.Body.deltaAbsX
and deltaAbsY
now return the cached absolute delta value from the previous update, and no longer calculate it during the actual call.World.enable
has been recoded to remove all the hasOwnProperty
checks and streamline the internal flow.World.disable
has been recoded to remove all the hasOwnProperty
checks and streamline the internal flow.World.add
is a new method that adds an existing body to the simulation and enableBody
now passes its newly created bodies to this method.World.disableGameObjectBody
has been removed as it duplicated what the disable
method did.World.enable
will pass the objects to enableBody
, which will create a new Body object, if required, and finally pass it to add
. World.disable
does the same, but removes the bodies from the simulation. It passes the bodies to disableBody
, which in turn passes it to remove
. Both of these work for single objects, an array of objects, Groups or even arrays of Groups.World.computeAngularVelocity
is a new method that specifically calculates the angular velocity of a Body.World.computeVelocity
has had its signature changed. Rather than taking a bunch of arguments all it now takes is a Body and a delta value. Internally it now calculates both the x and y velocity components together in the same single call, where-as before it was split into two calls and multiple assignments.World.computeVelocity
no longer returns the new velocities, they are now set directly on the body within the method.World.computeVelocity
has been recoded to use Fuzzy Greater Than and Less Than calls when applying drag to a previously accelerated body. Using a fuzzy epsilon allows us to mitigate the ping-pong issue, where a decelerating body would constantly flip between a small negative and positive velocity value and never come to an actual rest.World.computeVelocity
now checks the Body.useDamping
property to perform either linear deceleration or damping on the Body.World.updateMotion
has changed to call the new computeAngularVelocity
and computeVelocity
methods.blocked
properties accordingly (before it only set the touching
properties.) This means you can now use checks like Body.onFloor()
when traversing static bodies (thanks @fariazz)values
property. For example, if you set a new value such as this: data.set('gold', 50)
you can now access it via: data.values.gold
, where it is treated as a normal property, allowing you to use it in conditional evaluations if (data.values.level === 2)
, or modify it: data.values.gold += 50
.changedata
event, regardless if it is changed via the set
method, or the new values
approach.PlayerLives
, it will emit the event changedata_PlayerLives
. This happens regardless if it is changed via the set
method, or the new values
approach.set
method can now take an object containing key value pairs as the first argument. This means you can now set a bunch of values all at once, i.e: data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 })
.get
method can now take an array of keys, and will return an array of matching values. This is handy for array destructuring in ES6.remove
method can now take an array of keys, and will remove all matching values, emitting the removedata
event for each.setdata
event. If a value is set that already exists, it instead emits a changedata
and related changedata_key
event. Setting a new value no longer emits both events.resetFunction
function has been removed from the changedata
event arguments. Previously this was used to allow you to stop a value being updated by calling the reset function instead. However, it created brand new anonymous functions every single time a value was updated. As you can now access stored data via the values
property you can use this for much easier conditional checks and sets.blockSet
property has been removed as it's no longer used internally.update
method is polled every frame, which does the same job instead. This avoids load-time race conditions where pre-populated files would trigger loads part way during an existing load, fixing #3705 in the process (thanks @the-simian)init
, preload
and create
phase of your Scene. This means that any plugins, or custom code, written to use the Scene Systems preupdate
, update
or postupdate
events will need to be aware that these are now fired from init
onwards, not just once create
has finished.sceneUpdate
, which is a reference that maps to your Scene.update
function. During init
, preload
and create
this is always mapped to NOOP. Once create
has finished it gets re-mapped to your Scene's update function. If your Scene doesn't have one, it remains mapped to NOOP. In practise, this means nothing has changed from before. Scene.update
never ran until create
was completed, and it still doesn't. However, because the internal Scene systems are now updating right from init
, it means that things like the update list and physics systems are fully operational during your Preloader. This allows you to create far more elaborate preloaders than ever before. Although, with great power comes great responsibility, as the onus is now on you to be careful which events you consume (especially input events) during your preloader.RenderTexture.resize
will allow you to resize the underlying Render Texture to the new dimensions given. Doing this also clears the Render Texture at the same time (thanks @saqsun).Rectangle.RandomOutside
is a new function that takes two Rectangles, outer
and inner
, and returns a random point that falls within the outer rectangle but is always outside of the inner rectangle.length
, making it consistent with the Display List (thanks @samme)centerX
and centerY
which return the coordinates of the center of the viewport, relative to the canvas (thanks @samme)visible
. An invisible Camera will skip rendering and input tests of everything it can see. This allows you to create say a mini-cam and then toggle it on and off without needing to re-create it each time.setVisible
which toggles its visible property.CameraManager.fromJSON
will now set the visible property is defined in the config.ScenePlugin.run
is a new method that will run the given Scene and not change the state of the current Scene at all. If the scene is asleep, it will be woken. If it's paused, it will be resumed. If not running at all, it will be started.TextureManager.getPixelAlpha
is a new method that will return the alpha value of a pixel from the given texture and frame. It will return null
if the coordinates were out of bounds, otherwise a value between 0 and 255.Game.isOver
is a new read-only boolean property that indicates if the mouse pointer is currently over the game canvas or not. It is set by the VisibilityHandler and is only reliable on desktop systems.Game.mouseout
is dispatched if the mouse leaves the game canvas. You can listen to it from this.sys.game.events.on('mouseout')
from within a Scene.Game.mouseover
is dispatched if the mouse enters the game canvas, having previously been outside of it. You can listen to it from this.sys.game.events.on('mouseover')
from within a Scene.this.matter.add.sprite(x, y, texture, frame, { shape: shapes.banana })
(where shapes.banana
is one of the exported PhysicsEditor shapes in the JSON you loaded). See the 'physics/matterjs/advanced shape creation.js' example for more details.ForwardDiffuseLightPipeline
, used by the Lights system, now sets a flag if the Scene doesn't contain any lights. All of the Game Objects now check this flag and don't even bother adding themselves to the batch if there are no lights in the Scene, as they'd never render anyway. This also avoids the ghost-image problem if you swap Scenes to a new Scene with the Light Manager enabled, but no actual lights defined. Fix #3707 (thanks @samvieten).CameraManager.getCameraBelowPointer
has been renamed to getCamerasBelowPointer
and it now returns an array of all the cameras below the given pointer, not just the top-most one. The array is sorted so that the top-most camera is at the start of the array.TimeStep.step
the rawDelta
and delta
values are checked to make sure they are non-negative, which can happen in Chrome when the delta is reset and out of sync with the value passed to Request Animation Frame. Fix #3088 (thanks @Antriel)Cameras.Controls.Fixed
has been removed. It's was deprecated a few versions ago. Please use FixedKeyControl
instead.Cameras.Controls.Smoothed
has been removed. It's was deprecated a few versions ago. Please use SmoothedKeyControl
instead.RenderTexture.drawImage
method incorrectly set the values of the frame, causing them to appear wrongly scaled in the canvas renderer. Fix #3710 (thanks @saqsun).Math.Matrix4.makeRotationAxis()
(thanks @hexus)Math.abs()
in Math.Quaternion.calculateW()
(thanks @qxzkjp).remove()
handler when Animation
s are removed from the AnimationManager
. This prevented removed animations from stopping correctly.TweenManager.getTweensOf
method has been fixed to remove a potential endless loop should multiple targets be passed in to it (thanks @cyantree)Thanks to the work of @hexus we have now documented all of the Math namespace and made good progress on the Game Objects.
I personally have also documented the entire Input system, which was 328 classes, properties and methods to describe, as well as lots of other areas.
Update to this version instead š
Camera.alpha
(and its related method Camera.setAlpha
) allows you to set an alpha level for the entire camera. This impacts everything it is rendering, even if those objects also have their own alpha values too. You can tween the property to make the camera contents fade in / out, or otherwise set it as needed in your game.Camera.deadzone
(and its related method Camera.setDeadzone
) allows you to specify the deadzone for a camera. The deadzone is a rectangular region used when a camera is following a target. If the target is within the deadzone then the camera will not scroll. As soon as the target leaves the deadzone, the camera will begin tracking it (applying lerp if needed.) It allows you to set a region of the camera in which a player can move freely before tracking begins. The deadzone is re-centered on the camera mid point every frame, meaning you can also use the rectangle for other in-game checks as needed.Camera.pan
is a new Camera Effect that allows you to control automatic camera pans between points in your game world. You can specify a duration and ease type for the pan, and it'll emit events just like all other camera effects, so you can hook into the start, update and completion of the pan. See the examples and docs for more details.Camera.zoom
is a new Camera Effect that allows you to control automatic camera zooming. You can specify a duration and ease type for the zoom, as well as the zoom factor of course, and it'll emit events just like all other camera effects, so you can hook into the start, update and completion of the zoom. Used in combination with the new Pan effect you can zoom and pan around with ease. See the examples and docs for more details.Camera.midPoint
is a new Vec2 property that is updated every frame. Use it to obtain exactly where in the world the center of the camera is currently looking.Camera.displayWidth
is a new property that returns the display width of the camera, factoring in the current zoom level.Camera.displayHeight
is a new property that returns the display height of the camera, factoring in the current zoom level.Camera.worldView
is a new property, an instance of a Rectangle, that contains the dimensions of the area of the world currently visible by the camera. You can use it for intersection or culling tests that don't need to factor in camera rotation.Camera.dirty
is a new boolean property. A dirty Camera has had either its viewport size, bounds, scroll, rotation or zoom levels changed since the last frame. The flag is reset in the postCameraRender
method, but until that point can be checked and used.Camera.centerOn
is a new method that will move the camera so its viewport is centered on the given coordinates. A handy way of jumping to different points around a map without needing to calculate the scroll offsets.Camera.centerToBounds
didn't take the bounds offset into account, so bounds at non-zero positions wouldn't center properly. All bounds now center correctly. Fix #3706 (thanks @cyantree)Camera.setBounds
has a new optional argument centerOn
. If specified it will automatically center the camera on the new bounds given.Camera._id
has been renamed to Camera.id
, a read-only bitmask used for camera exclusion from Game Objects.cameraPool
has been removed entirely. It was mostly pointless in practice as Cameras are not regenerated frequently enough to need pooling. It also didn't maintain the bitmask list correctly before.CameraManager.resetAll
now destroys all current Cameras, resets the camera ID marker to 1 and adds a single new Camera.CameraManager.currentCameraId
has been removed. IDs are assigned more intelligently now, via the getNextID
internal method.CameraManager.addExisting
no longer needs to be passed a Camera that already exists in the pool (as the pool has been removed), meaning you can now create your own Cameras and pass them to addExisting
and have them treated as normal cameras and not be ignored by the manager. They are also assigned a proper ID when added.CameraManager.addExisting
has a new boolean argument makeMain
which will make the new camera the main one.CameraManager.getTotal
is a new method that will return the total number of Cameras being managed, with an optional isVisible
argument, that only counts visible cameras if set.CameraManager.remove
can now take an array of cameras to be removed from the manager, as well as a single camera.CameraManager.remove
would previously not allow you to remove a camera if it meant there would be no cameras left in the Camera Manager. This restriction has been removed. A Camera Manager can now run even with zero cameras. Your game obviously won't display anything, but it's still now possible.CameraManager.remove
will now return the total number of Cameras removed.Before explaining the changes it's worth covering what the three different game config properties do:
roundPixels
- this will cause the renderer to draw most Game Objects at whole integer positions. Their actual positions can be anything, but the renderer will floor the values to ensure they are integers immediately before drawing. It only works on texture based Game Objects. Graphics objects, for instance, ignore this property.
antialias
- when set to true
WebGL textures are created using gl.LINEAR
, which allows WebGL to try its best to interpolate the texture when rendered at non-texture frame sizes. This can happen if you scale a Game Object, or zoom a Camera. In both cases it will need to interpolate the pixel values to accommodate the new size. If this property is set to false
then it will use gl.NEAREST
instead. This uses a nearest neighbor method of interpolation, and is nearly always the better option if you need to keep the textures crisp, such as when using scaled pixel art. Disabling antialias
invokes nearest-neighbor interpolation on the game canvas itself as well. If you need a mixture of aliased and anti-aliased textures in your game, then you can change them on a per-texture basis by using Texture.setFilter
.
There is a third game config property called pixelArt
. If set to true
it's the same thing as enabling roundPixels
and disabling antialias
. This is the optimum setting for pixel art games.
pixelArt
OR antialias
before setting the canvas scale mode. Both values are checked during texture creation as well.roundPixels
values set to true
by default. You can toggle this by changing the CameraManager.roundPixels
property, or change it on a camera-by-camera basis, as needed.Camera.roundPixels
is now used across all rendering code for both Canvas and WebGL. Previously, it would check the renderer config value, but now all renderer code uses the camera value to decide if it should floor the drawing position or not.The Texture Tint Pipeline has been rewritten to tidy up hundreds of lines of duplicate code and to move the responsibility of drawing to the Game Objects themselves. Previously, had you excluded say Tilemaps from your build of Phaser, the renderer would still include masses of code dealing with the drawing of them. This task has been moved to the Game Objects and the pipeline just provides a set of clean utility functions for batching, flushing and drawing.
The decision to make this change was not taken lightly. However, I felt that none of the pipelines actually lived up to their name. You could never actually pass objects through one pipeline to another as they didn't have entry and exit points and were instead just glorified singular batches. Although you could change the pipeline being used on a Game Object this action meant that every pipeline had to be responsible for every single type of Game Object, both now and in the future, and they were full of redundant stub functions as a result. The payload size was also considerable. It has now gone from 1,961 lines of code at 76 KB down to 729 lines of code and 27 KB. It's not the only file to benefit either. The ForwardDiffuseLightPipeline
also reduced from 402 lines (15.7 KB) down to 159 lines and 6 KB. Sizes include comments and are un-minified. In a production bundle the difference will be even greater. This is work we will continue in the next release as we do the same updates to the FlatTintPipeline, responsible for rendering Graphics objects, and look at consolidating the shaders allowing you to use Graphics and Sprites mixed in the display list with no shader swapping cost.
batchSize
. The default is 2000 before the batch will flush, which is a happy average between desktop and mobile. If targeting desktop specifically, you may wish to increase this value to reduce draw calls.batchVertices
which will add a vertices block to the current batch. This is now used internally by nearly all render functions.tintEffect
. This is a single FLOAT.TransformMatrix
class far more than before. This allows the matrix operations to be run-time compiled and cut down on masses of code.drawTexture
method has been removed. It has been replaced by drawTextureFrame
which has a new and more concise signature. See the API docs for details.batchTileSprite
method has been removed. It is now handled in the TileSprite WebGL Render function.drawStaticTilemapLayer
method has been removed. It is now handled in the Static Tilemap Layer WebGL Render function.drawEmitterManager
method has been removed. It is now handled in the Particle Manager WebGL Render function.batchText
method has been removed. It is now handled in the Static Text WebGL Render function.batchDynamicTilemapLayer
method has been removed. It is now handled in the Dynamic Tilemap Layer WebGL Render function.batchMesh
method has been removed. It is now handled in the Mesh WebGL Render function.batchBitmapText
method has been removed. It is now handled in the BitmapText WebGL Render function.batchDynamicBitmapText
method has been removed. It is now handled in the DynamicBitmapText WebGL Render function.batchBlitter
method has been removed. It is now handled in the Blitter WebGL Render function.Due to the changes in the Texture Tint Pipeline the Textures.Frame
class has also been updated. The following changes concern the Frame UV data:
x0
, y0
, x1
, y1
, x2
, y2
, x3
and y3
and was stored in the data.uvs
object. These have been replaced with directly accessible properties: u0
, v0
, u1
and v1
. These 4 properties are used directly in all renderer code now. Although it was clearer having 8 properties, 4 of them were just duplicates, so we've traded a little clarity for a smaller overall object and less dictionary look-ups.Frame.uvs
(and the corresponding Frame.data.uvs
) object has been removed.As well as tidying the Texture Tint Pipeline, I also updated the shader. It now has a new attribute 'tintEffect' which allows you to control how a tint is applied to a Game Object. The default way tinting worked was for the tint color values to be multiplied with the texture pixel values. This meant you were unable to do things like tint a Game Object white, because multiplying a color by white doesn't change it. The new tint mode allows you to literally replace the pixel color values.
setTintFill
is a new method available to all Game Objects that have the Tint component. It differs from setTint
in that the colors literally replace the pixel values from the texture (while still respecting the alpha). This means you can now create effects such as flashing a sprite white if it gets hit, or red for damage, etc. You can still use different colors per corner of the Game Object, allowing you to create nice seamless gradient effects.tintFill
is a new boolean property that allows you to toggle between the two different tint types: multiply or replace.isTinted
is a new read-only boolean indicating if a Game Object is tinted or not. Handy for knowing if you need to clear a tint after an effect.Mesh.tintFill
allows you to control the tint effect applied to the Mesh vertices when color blending.The Tint component documentation has been overhauled to explain these differences in more detail, and you can find lots of new examples as well.
There is a new Game Object Component called TextureCrop
. It replaces the Texture Component (which still exists) and adds in the ability to crop the texture being used. This component is now being used by the Sprite
and Image
Game Objects.
setCrop
method. The crop is a rectangle that limits the area of the texture frame that is visible during rendering. Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just changes what is shown when rendered. This is ideal for hiding part of a Sprite without using a mask, or for effects like displaying a progress or loading bar. Cropping works even when the Game Object is flipped, or is a trimmed frame from an atlas.isCropped
boolean at any point.align
which can accept either left-aligned (the default), center aligned, or right-aligned. Alignment works by calculating the longest line of text in the object and then offsetting the other lines to match it.BitmapText.setCenterAlign
is a new chainable method to center-align the text.BitmapText.setLeftAlign
is a new chainable method to left-align the text.BitmapText.setRightAlign
is a new chainable method to right-align the text.BitmapText.align
is a new property that holds the alignment of the text.BitmapText.setFont
is a new method that allows you to change the font it is rendering with.letterSpacing
is now _letterSpacing
), so as to not change the API, getters and setters for them all have been added.dirty
flag that tracks if any part of the BitmapText has changed. This is used when getting the BitmapText's bounds object, as used in the renderer for line alignment, and in properties like width
and height
. The dirty flag ensures the bounds are only recalculated if something has changed, cutting down on un-necessary calculations.GetBitmapTextSize
, which is used internally in the BitmapText Game Objects, will now produce different bounds from the previous version. Previously, the bounds were tight against the letters in the text. However, this meant the bounds were not properly aligned with the origin of the BitmapText, and consequently you'd get different bounds if the text consisted of different characters. The bounds are now calculated purely based on the glyph data and letter spacing values. This will give a far more consistent overall experience, but it does mean if you were using the bounds to position text previously, you'll need to revisit that code again. See issue #3799 for more details (and to discuss this further if you wish) (thanks @SBCGames)GetBitmapTextSize
and its exposed method BitmapText.getTextBounds
now factor in the display origin of the BitmapText into the global
position returned.BitmapText
WebGL Renderer incorrectly calculated the font scale at very small sizes, causing characters to overlap when they shouldn't. Scale is now applied to the correct component parts in the render code.BitmapText
would be cut off if you specified a resolution value > 1. Fix #3642 (thanks @kanthi0802)DynamicBitmapText
that had a crop set on it would fail to render if anything was above it on the display list. It now crops properly, no matter what is above or below it on the display list.DynamicBitmapText
class now extends the BitmapText
class. This saves on lots of space in the bundle and consolidates functionality between the two. Please be aware of it if you have classes that extend either of them.displayCallback
in the DynamicBitmapText
class it would generate a brand new object containing all the glyph data, every frame, for every glyph, and send it to the callback. This has been changed so it now uses a new cached local object: callbackData
. This object is recycled for every glyph, stopping un-needed gc from building up.DynamicTilemapLayer.tilesDrawn
is a read-only property that contains the number of tiles sent to the renderer in the previous frame.DynamicTilemapLayer.tilesTotal
is a read-only property that contains the total number of tiles in the layer, updated every frame.DynamicTilemapLayer.skipCull
and its associated chainable method setSkipCull
allows you to control if the cameras should cull the layer tiles before rendering them or not. By default they will cull, to avoid over-rendering, but in some circumstances you may wish to disable this and can now do so by toggling this property.CullTiles
component, as used by the Dynamic Tilemap, has been recoded from scratch to take advantage of updates in the Camera system. It will now properly cull tiles, irrespective of the layer scale, or camera zoom. It also now supports the layers skipCull
property, allowing you to override the culling. The Dungeon Generator labs demo now works again as a result of this fix, and has been updated with a debug mode and camera control UI. You can edit the example source to swap between 4 different dungeon layouts, from 2500 tiles up to 1 million tiles. There are limitations to the way the culling works though. If you rotate the camera you may find you see the cull edge. You can disable this using the new skipCull
property. Fixing this also fixed #3818 (thanks @Mursaat)DynamicTilemapLayer.cullPaddingX
, cullPaddingY
and the associated chainable method setCullPadding
allows you to control how many additional tiles are added into the cull rectangle when it is calculated. If you find that your camera size and zoom settings are causing tiles to get prematurely culled, resulting in clipping during scrolling, then set the cullPadding
values to add extra layers of tiles to the calculations in both directions without needing to disable culling entirely.DynamicTilemapLayer.cullCallback
allows you to change the function that is used to perform the tile culling. By default it will call TilemapComponents.CullTiles
but you can override this to call any function you like. It is sent 3 arguments: the layer data, the camera and the array to store the tiles in. Using this feature you can now create whatever culling system you require, should the default one prove to not be suitable for your game. Fix #3811 (thanks @georgzoeller)light map
example in the labs for a demonstration. Note that there are limits on the number of tiles that can be rendered with lighting enabled. Fix #3544 (thanks @FrancescoNegri)Graphics.fillRoundedRect
will draw a stroked rounded rectangle to a Graphics object. The radius of the corners can be either a number, or an object, allowing you to specify different radius per corner (thanks @TadejZupancic)Graphics.strokeRoundedRect
will draw a filled rounded rectangle to a Graphics object. The radius of the corners can be either a number, or an object, allowing you to specify different radius per corner (thanks @TadejZupancic)ParticleEmitter.stop
is a new chainable method to stop a particle emitter. It's the same as setting on
to false
but means you don't have to break the method flow to do so (thanks @samme)ScenePlugin.pause
(and the corresponding methods in Scene Systems and the Scene Manager) now has a new optional data
argument, which is passed to the target Scene and emitted in its 'pause' event.ScenePlugin.resume
(and the corresponding methods in Scene Systems and the Scene Manager) now has a new optional data
argument, which is passed to the target Scene and emitted in its 'resume' event.ScenePlugin.sleep
(and the corresponding methods in Scene Systems and the Scene Manager) now has a new optional data
argument, which is passed to the target Scene and emitted in its 'sleep' event.ScenePlugin.wake
(and the corresponding methods in Scene Systems and the Scene Manager) now has a new optional data
argument, which is passed to the target Scene and emitted in its 'wake' event.ScenePlugin.setActive
now has a new optional data
argument, which is passed to the target Scene and emitted in its 'pause' or 'resume' events.TileSprite.tileScaleX
and tileScaleY
are two new properties that allow you to control the scale of the texture within the Tile Sprite. This impacts the way the repeating texture is scaled, and is independent to scaling the Tile Sprite itself. It works in both Canvas and WebGL mode.TransformMatrix.copyFrom
is a new method that will copy the given matrix into the values of the current one.TransformMatrix.multiplyWithOffset
is a new method that will multiply the given matrix with the current one, factoring in an additional offset to the results. This is used internally by the renderer code in various places.Rectangle.Intersection
will take two Rectangle objects and return the area of intersection between them. If there is no intersection, an empty Rectangle is returned.Pointer.prevPosition
is a new Vector2 that stores the previous position of the Pointer, prior to the most recent DOM event. You can use this when performing calculations between the old and current positions, such as for tracking the pointer speed.Pointer.getInterpolatedPosition
is a new method that will return an array of smoothly interpolated values between the old and previous position of the Pointer. You can configure how many interpolation steps should take place (the default is 10) and provide an output array to store them in. This method is handy if you've got an object tracking a pointer and you want to ensure it has smooth movement (as the DOM will often process pointer events at a faster rate than the game loop can update).TransformMatrix.copyFromArray
will populate a matrix from the given array of values. Where 0, 1, 2, 3, 4 and 5 map to a, b, c, d, e and f.WebGLPipeline
has a new over-rideable method called boot
which is called when the renderer and all core game systems have finished being set-up.KeyboardPlugin.checkDown
is a new method that allows you to check if a Key is being pressed down or not in an update loop. The difference between this method and checking the Key.isDown
property directly is that you can provide a duration to this method. For example, if you wanted a key press to fire a bullet, but you only wanted it to be able to fire every 100ms, then you can call this method with a duration
of 100 and it will only return true
every 100ms.remove
method too) will not emit the parent of the DataManager as the 2nd argument in the removedata
event, to keep it consistent with the set events (thanks @rexrainbow)filecomplete
event said that you could listen for a specific file using its type and key, i.e.: filecomplete-image-monster
, however, the code used an underscore instead of a hyphen. We feel the hyphen looks cleaner, so the Loader code has been updated, meaning you can now use the hyphen version of the event properly (thanks @NokFrt)Tween.play
on a tween created via TweenManager.create
wouldn't actually start playback until the tween was first added to the Tween Manager. Now, calling play
will have it automatically add itself to the Tween Manager if it's not already in there. Fix #3763 (thanks @pantoninho)Scene.run
will now pass the optional data
object in all cases, no matter if it's waking, resuming or starting a Scene (thanks @rook2pawn)ScenePlugin.start
and ScenePlugin.restart
will now always queue the op with the Scene Manager, regardless of the state of the Scene, in order to avoid issues where plugins carry on running for a frame before closing down. Fix #3776 (thanks @jjalonso)Tileset.glTexture
is a new property that maps to the WebGL Texture for the Tileset image. It's used internally by the renderer to avoid expensive object look-ups and is set automatically in the Tileset.setImage
method.Frame.glTexture
is a new property that maps to the WebGL Texture for the Frames Texture Source image. It's used internally by the renderer to avoid expensive object look-ups and is set automatically in the Frame
constructor.TransformMatrix.e
and TransformMatrix.f
are two new properties that are an alias for the tx
and ty
values.Graphics.arc
has a new optional argument overshoot
. This is a small value that is added onto the end of the endAngle
and allows you to extend the arc further than the default 360 degrees. You may wish to do this if you're trying to draw an arc with an especially thick line stroke, to ensure there are no gaps. Fix #3798 (thanks @jjalonso)Quad
Game Object now has a new setFrame
method that allows you to change the frame being rendered by the Quad, including using frames that are part of a texture atlas. Fix #3161 (thanks @halgorithm)ScenePlugin
will now queue all of the following ops with the Scene Manager: start
, run
, pause
, resume
, sleep
, wake
, switch
and stop
. This means for all of these calls the Scene Manager will add the call into its queue and process it at the start of the next frame. This fixes #3812 and keeps things more predictable (thanks @Waclaw-I)TransformMatrix.multiply
has a new optional argument out
which is a matrix to store the multiplication results in. If not given it will act as before, multiplying the current matrix.Zones
now have a NOOP setAlpha
method, which allows them to be added into Containers (thanks @TadejZupancic)setPipeline
method now returns the instance of the Game Object on which it was called. It used to return the pipeline that was set, but this made it non-chainable which broke with the conventions set in all the other set
methods. If you use setPipeline
in your code anywhere to retrieve the pipeline reference, please use the pipeline
property of the Game Object instead.changedata
event was emitting the original value of the data instead of new value (thanks @iamchristopher)filecomplete
event if any of files failed to load, causing it to fail to run the Scene create
function as well. Fix #3750 (thanks @NokFrt)blocked.none
property is now set to false
after separation with static bodies or tiles. Previously, the blocked direction was set correctly, but the none
remained true
(thanks @samme)Bob.setFrame
didn't actually set the frame on the Bob, now it does. Fix #3774 (thanks @NokFrt)Bob.alpha
was ignored by the canvas renderer, only working in WebGL. This has now been fixed.SceneManager.run
would ignore scenes that are currently in the queue of scenes pending to be added. This has now been fixed so that the scene is queued to be started once it's ready (thanks @rook2pawn)GameObject.disableInteractive
was toggling input. Every second call would turn the input back on (thanks @TadejZupancic)getBounds
and displayWidth
and displayHeight
results were incorrect. Fix #3789 (thanks @jjalonso)ArrayUtils.AddAt
didn't calculate the array offset correctly if you passed an array in to be merged with an existing array. This also caused Container.addAt to fail if an array was passed to it. Fix #3788 (thanks @jjalonso)Pointer.camera
property would only be set if there was a viable Game Object in the camera view. Now it is set regardless, to always be the Camera the Pointer interacted with.clearMask(true)
would throw an exception if the Game Object didn't have a mask. Now it checks first before destroying the mask. Fix #3809 (thanks @NokFrt)GeometryMask
the stencil has been changed from INVERT
to KEEP
in order to fix issues when masking Graphics objects and other complex objects. Fix #3807. This also fixes the issue where children in Containers would display incorrectly outside of a Geometry mask. Fix #3746 (thanks @zilbuz @oklar)BitmapMask.destroy
will now remove the textures and framebuffers that it created from the WebGL Renderer as part of the destroy process. Fix #3771 (thanks @nunof07)My thanks to the following for helping with the Phaser 3 Examples, Docs and TypeScript definitions, either by reporting errors, fixing them or helping author the docs:
@DannyT @squilibob @dvdbrink @t1gu1 @cyantree @DrevanTonder @mikewesthad @tarsupin @shadowofsoul
Also, a special mention to @andygroff for his excellent work enhancing the search box on the examples site, and @hexus for his assistance completing the documentation for the Game Objects.
The new version differs by 283 commits.
05e6f65
3.11 Release
9a82bd3
Updated change log
42c3fc5
Better normal map handling
66ee2ac
Bumped version
eee96cd
setPipeline
returns the Game Object, not the pipeline, to be consistent.
4843d7e
Pipelines have a boot handler now.
61954de
Added checkDown
method and related properties.
64ceb79
Merge branch 'master' of https://github.com/photonstorm/phaser
944ca91
Updated log
aa9ba84
Merge pull request #3741 from TadejZupancic/patch-5
b4ddd44
Added cullCallback
support - the final step in culling. Don't like ours? Roll your own!
8981cf4
Swapped from vec2 to explicit values for cullPadding
b03d3ff
Added support for cull padding
52f5002
Updated change log
e66cf4e
Adjusted bounds +- 1 tile
There are 250 commits in total.
See the full diff
āļø Greenkeeperās updated Terms of Service will come into effect on April 6th, 2018.
Version 3.4.0 of phaser was just published.
The version 3.4.0 is not covered by your current version range.
If you donāt accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.
It might be worth looking into these changes and trying to get this project onto the latest version of phaser.
If you have a solid test suite and good coverage, a passing build is a strong indicator that you can take advantage of these changes directly by merging the proposed change into your project. If the build fails or you donāt have such unconditional trust in your tests, this branch is a great starting point for you to work on the update.
Release Notes
Phaser v3.4.0 ReleaseNew Features
A beta release of the new Container Game Object arrives in this version. We've flagged it as beta because there are known issues in using Containers in Scenes that have multiple cameras or irregular camera viewports. However, in all other instances we've tested they are operating normally, so we felt it would be best to release them into this build to give developers a chance to get used to them. Using a Container will issue a single console warning as a reminder. We will remove this once they leave beta in a future release. In the meantime they are fully documented and you can find numerous examples in the Phaser 3 Examples repo too.
correction
which is used in the Engine.update call and allows you to adjust the time being passed to the simulation. The default value is 1 to remain consistent with previous releases.getDelta
which allows you to specify your own function to calculate the delta value given to the Matter Engine when it updates.set60Hz
andset30Hz
which will set an Engine update rate of 60Hz and 30Hz respectively. 60Hz being the default.autoUpdate
, which defaults totrue
. When enabled the Matter Engine will update in sync with the game step (set by Request Animation Frame). The delta value given to Matter is now controlled by thegetDelta
function.step
which manually advances the physics simulation by one iteration, using whatever delta and correction values you pass in to it. When used in combination withautoUpdate=false
you can now explicitly control the update frequency of the physics simulation and unbind it from the game step.debugShowJoint
anddebugJointColor
. If defined they will display joints in Matter bodies during the postUpdate debug phase (only if debug is enabled) (thanks @OmarShehata)destroyChildren
which will automatically calldestroy
on all children of a Group if set to true (the default is false, hence it doesn't change the public API). Fix #3246 (thanks @DouglasLapsley)letterSpacing
which accepts a positive or negative number to add / reduce spacing between characters (thanks @wtravO)Tilemap.addTileset
and it will work in WebGL, where-as before it would display a corrupted tilemap. Fix #3407 (thanks @Zykino)ScenePlugin.start
without any arguments, but is more clear.destroy
event when they are destroyed (thanks @rexrainbow)mapAdd
which is used to extend the default injection map of a scene instead of overwriting it (thanks @sebashwa)getTopLeft
,getTopRight
,getBottomLeft
andgetBottomRight
all have a new optional argumentincludeParent
which will factor in all ancestor transforms to the returned point.Bug Fixes
startFollow
, but PathFollower.setPath was still usingPathFollower.start
(thanks @samid737)setRate
on its sounds, instead ofcalculateRate
.getValue
method now correctly applies the threshold and zeroes out the returned value.setZ
instead ofsetDepth
for the Debug Graphics Layer, causing it to appear behind objects in some display lists.renderer
exists before calling destroy on it. Fix #3498 (thanks @Huararanga)update
loops. Fix #3490 (thanks @belen-albeza)divisions
argument and always returning 1, which made it fail when used as part of a Path. It now defaults to return 1 unless specified otherwise (thanks _ok)setDisplaySize
(thanks Babsobar)setDisplaySize
(thanks Babsobar)null
, and now returns the first available Canvas. Fix #3520 (thanks @mchiasson)data
argument it wouldn't get passed through if the Scene was not yet available (i.e. the game had not fully booted). The data is now passed to the Sceneinit
andcreate
methods and stored in the Scene Settingsdata
property. Fix #3363 (thanks @pixelhijack)Tween.play
on a tween that was paused due to its config object, not as a result of having its paused method called. Fix #3452 (thanks @jazen)destroy
on Tweens instead ofstop
(thanks @Antriel)setOffset
on a Static Arcade Physics Body would break because the method was missing. It has been added and now functions as expected. Fix #3465 (thanks @josephjaniga and @DouglasLapsley)setInteractive
is called on a Game Object that fails to set a hit area, it will no longer try to assigndropZone
to an undefinedinput
property.setOrigin
unless the Game Object has the origin component (which not all do, like Graphics and Container)destroy
method, causing an error when trying to destroy the parent Game Object. Fix #3516 (thanks @RollinSafary)Updates
rate
anddetune
properties removed as they are always set in the overriding class.setRate
andsetDetune
from the 3.3.0 release have moved to the WebAudioSound and HTML5AudioSound classes respectively, as they each handle the values differently.InteractiveObject.js
has been renamed toCreateInteractiveObject.js
to more accurately reflect what it does and to avoid type errors in the docs.Fixed
toFixedKeyControl
andSmoothed
toSmoothedKeyControl
to match the class names. Fix #3463 (thanks @seivan)setSize
andsetDisplaySize
methods. This component is used for Game Objects that have a non-texture based size.key
which will allow you to scan a top-level property of any object in the given sorted array and get the closest match to it.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.skipCallback
.extend
property of a Scene config object it will now block overwriting the Scenesys
property.extend
property of a Scene config object, if you define a property calleddata
that has an object set, it will populate the Scenes Data Manager with those values.isProcessing
which is now a boolean, not an integer. It's also now public and read-only.a
,b
,c
,d
,tx
andty
. It also has the following new getters:scaleX
,scaleY
androtation
.List.getFirst
instead which offers the exact same functionality.List.add
instead which offers the exact same functionality.removeAllListeners
for any local events.Animation System Updates
We have refactored the Animation API to make it more consistent with the rest of Phaser 3 and to fix some issues. All of the following changes apply to the Animation Component:
frameRate
property to set the speed of an animation in frames per second.onStart
,onRepeat
,onUpdate
andonComplete
and the corresponding params arrays likeonStartParams
and the propertycallbackScope
. The reason for this is that they were all set on a global level, meaning that if you had 100 Sprites sharing the same animation, it was impossible to set the callbacks to fire for just one of those Sprites, but instead they would fire for all 100 and it was up to you to figure out which Sprite you wanted to update. Instead of callbacks animations now dispatch events on the Game Objects in which they are running. This means you can now dosprite.on('animationstart')
and it will be invoked at the same point the oldonStart
callback would have been. The new events are:animationstart
,animtionrepeat
,animationupdate
andanimationcomplete
. They're all dispatched from the Game Object that has the animation playing, not from the animation itself. This allows you far more control over what happens in the callbacks and we believe generally makes them more useful.animationupdate
event dispatched from the Game Object itself and check the 2nd argument, which is the animation frame.dispatchCallbacks
argument, because it dispatches an event which you can choose to ignore.delay
method has been removed.setDelay
allows you to define the delay before playback begins.getDelay
returns the animation playback delay value.delayedPlay
now returns the parent Game Object instead of the component.load
now returns the parent Game Object instead of the component.pause
now returns the parent Game Object instead of the component.resume
now returns the parent Game Object instead of the component.isPaused
returns a boolean indicating the paused state of the animation.paused
method has been removed.play
now returns the parent Game Object instead of the component.progress
method has been removed.getProgress
returns the animation progress value.setProgress
lets you jump the animation to a specific progress point.repeat
method has been removed.getRepeat
returns the animation repeat value.setRepeat
sets the number of times the current animation will repeat.repeatDelay
method has been removed.getRepeatDelay
returns the animation repeat delay value.setRepeatDelay
sets the delay time between each repeat.restart
now returns the parent Game Object instead of the component.stop
now returns the parent Game Object instead of the component.timeScale
method has been removed.getTimeScale
returns the animation time scale value.setTimeScale
sets the time scale value.totalFrames
method has been removed.getTotalFrames
returns the total number of frames in the animation.totalProgres
method has been removed as it did nothing and was mis-spelt.yoyo
method has been removed.getYoyo
returns if the animation will yoyo or not.setYoyo
sets if the animation will yoyo or not.updateFrame
will now callsetSizeToFrame
on the Game Object, which will adjust the Game Objectswidth
andheight
properties to match the frame size. Fix #3473 (thanks @wtravO @jp-gc)updateFrame
now supports animation frames with custom pivot points and injects these into the Game Object origin.destroy
now removes events, references to the Animation Manager and parent Game Object, clears the current animation and frame and empties internal arrays.yoyo
property on an Animation Component would have no effect as it only ever checked the global property, it now checks the local one properly allowing you to specify ayoyo
on a per Game Object basis.Examples, Documentation and TypeScript
My thanks to the following for helping with the Phaser 3 Examples, Docs and TypeScript definitions, either by reporting errors, fixing them or helping author the docs:
@gabegordon @melissaelopez @samid737 @nbs @tgrajewski @pagesrichie @hexus @mbrickn @erd0s @icbat @Matthew-Herman @ampled @mkimmet @PaNaVTEC
Commits
The new version differs by 4691 commits.
de99579
Updated release name
443a12e
Phaser 3.4 release
9774b6e
Updated change log
a6ef9e0
Shorter warning
703f040
Added warning to docs
5612336
Containers flag
1802f8b
GetBounds
getTopLeft
,getTopRight
,getBottomLeft
andgetBottomRight
all have a new optional argumentincludeParent
which will factor in all ancestor transforms to the returned point.2e722b0
debugging tests
9269aa7
Swapped to using public properties
efe6330
Added scaleX/Y getters
112a1ea
Typo
f13bbca
Fix getWorldBounds clash
c571124
eslint override
ad4109a
Updated sortHandlerGO to handle any depth containers.
9c0c037
Added getIndexList method.
There are 250 commits in total.
See the full diff
FAQ and help
There is a collection of [frequently asked questions](https://greenkeeper.io/faq.html). If those donāt help, you can always [ask the humans behind Greenkeeper](https://github.com/greenkeeperio/greenkeeper/issues/new).Your Greenkeeper bot :palm_tree: