mirror of
https://github.com/photonstorm/phaser
synced 2024-11-30 00:21:04 +00:00
ArcadePhysics.updateMotion applies the dt to the velocity calculations as well as position now (thanks jcs)
This commit is contained in:
parent
fa8533f5d1
commit
1eca16a948
9 changed files with 662 additions and 208 deletions
215
README.md
215
README.md
|
@ -45,192 +45,24 @@ Version 1.1.3 - in build
|
||||||
* New: StageScaleMode.forceOrientation allows you to lock your game to one orientation and display a Sprite (i.e. a "please rotate" screen) when incorrect.
|
* New: StageScaleMode.forceOrientation allows you to lock your game to one orientation and display a Sprite (i.e. a "please rotate" screen) when incorrect.
|
||||||
* New: World.visible boolean added, toggles rendering of the world on/off entirely.
|
* New: World.visible boolean added, toggles rendering of the world on/off entirely.
|
||||||
* Fixed: Mouse.stop now uses the true useCapture, which means the event listeners stop listening correctly (thanks beeglebug)
|
* Fixed: Mouse.stop now uses the true useCapture, which means the event listeners stop listening correctly (thanks beeglebug)
|
||||||
|
* Fixed: Input Keyboard example fix (thanks Atrodilla)
|
||||||
|
* Updated: ArcadePhysics.updateMotion applies the dt to the velocity calculations as well as position now (thanks jcs)
|
||||||
* Updated: RequestAnimationFrame now retains the callbackID which is passed to cancelRequestAnimationFrame.
|
* Updated: RequestAnimationFrame now retains the callbackID which is passed to cancelRequestAnimationFrame.
|
||||||
* Updated: Button now goes back to over state when setFrames used in action (thanks beeglebug)
|
* Updated: Button now goes back to over state when setFrames used in action (thanks beeglebug)
|
||||||
* Updated: plugins now have a postUpdate callback (thanks cocoademon)
|
* Updated: plugins now have a postUpdate callback (thanks cocoademon)
|
||||||
|
|
||||||
|
You can view the complete Change Log for all previous versions at https://github.com/photonstorm/phaser/changelog.md
|
||||||
|
|
||||||
Version 1.1.2 - November 1st 2013
|
|
||||||
|
|
||||||
* New: You'll now find a complete Basic project Template in the resources/Project Templates folder. Will add more complex ones soon.
|
|
||||||
* New: Phaser.Button now has the ability to set over/out/up/down sound effects so they play automatically based on those events.
|
|
||||||
* New: Added init method to plugins, to be called as they are added to the PluginManager (thanks beeglebug)
|
|
||||||
* New: Physics.Body now has a center property (issue 142, thanks MikeMnD)
|
|
||||||
* New: Lots of fixes across Full Screen Mode support. Input now works, scaling restores properly, world scale is correct and anti-alias support added.
|
|
||||||
* New: Added Group.cursor. This points to the first item added to a Group. You can move the cursor with Group.next() and Group.previous().
|
|
||||||
* New: Added Tween.isTweening(object) to check if an object is currently being tweened or not (thanks mikehamil10)
|
|
||||||
* New: Added getMagnitude, setMagnitude, normalize and isZero methods to Point (thanks beeglebug)
|
|
||||||
* New/Change: Group.callAll now supports nested functions and a context, making it really powerful!
|
|
||||||
* Updated: Fixed a few final bugs in the Sprite body and bounds calculations, in turn this resolved the Tilemap collision issues in the 1.1 release.
|
|
||||||
* Updated: Finished documentation for the Phaser.Button class.
|
|
||||||
* Updated: Fixed the Invaders game sample and enhanced it.
|
|
||||||
* Updated: Fixed the Star Struck game sample and enhanced it.
|
|
||||||
* Updated: If you pause an Animation, when you next play it it'll resume (un-pause itself).
|
|
||||||
* Updated: hexToRGB now accepts short hex codes (#EEE) (thanks beeglebug)
|
|
||||||
* Updated: State functions (preload, update, render, etc) are now passed the current game as a parameter (thanks beeglebug)
|
|
||||||
* Updated: If your game is running in Canvas (not WebGL) you can now set Stage.backgroundColor to rgba style CSS strings, allowing for semi-transparent game backgrounds.
|
|
||||||
* Updated: event.preventDefault() has been added to all Mouse event handlers.
|
|
||||||
* Updated: Sprite.deltaX/Y removed due to non-use. prevX/Y values moved to Sprite._cache.prevX/Y.
|
|
||||||
* Updated: Due to missing extends parameter the Sprite prototype was picking up functions from classes it never meant to (Button, TilemapLayer), now fully isolated.
|
|
||||||
* Fixed issue 135 - Added typeof checks into most ArcadePhysics functions to avoid errors with zero values.
|
|
||||||
* Fixed issue 136 - distanceTo using worldX/Y instead of x/y.
|
|
||||||
* Fixed lots of examples where the cursor keys / space bar were not locked from moving the browser page (if you find any more, please tell us!)
|
|
||||||
* Fixed issue 149 - Starling XML files now load properly again, also created an Example to show use of them (thanks haden)
|
|
||||||
* Fixed an issue where if the Starling XML file didn't contain a frameX/Y value it would crash on import.
|
|
||||||
* Fixed the Multiple Animations Example - it's now a lovely underwater scene :)
|
|
||||||
* Fixed issue 141 - If a Sprite is dragged and you release the Pointer while not over the Sprite, it will think it's still over it (thanks Paratron)
|
|
||||||
* Fixed issue 88 - Incorrect game.input.x/y values on click with scaled stage (thanks DrHackenstein)
|
|
||||||
* Fixed issue 143 - Entering full screen mode made the Input x/y coordinates go wrong.
|
|
||||||
|
|
||||||
Version 1.1.1 - October 26th 2013
|
|
||||||
|
|
||||||
* Quick patch to get Phaser.AUTO working again on Firefox / Android.
|
|
||||||
* Any key added via addKey now automatically adds it to the capture list.
|
|
||||||
|
|
||||||
Version 1.1 - October 25th 2013
|
|
||||||
|
|
||||||
What's New:
|
|
||||||
|
|
||||||
* JSDoc is go! We've added jsdoc3 blocks to every property and function, in every file and published the API docs to the docs folder.
|
|
||||||
* Brand new Example system (no more php!) and over 150 examples to learn from too.
|
|
||||||
* New TypeScript definitions file generated (in the build folder - thanks to TomTom1229 for manually enhancing this).
|
|
||||||
* New Grunt based build system added (thanks to Florent Cailhol)
|
|
||||||
* New: Phaser.Animation.generateFrameNames - really useful when creating animation data from texture atlases using file names, not indexes.
|
|
||||||
* Added Sprite.play as a handy short-cut to play an animation already loaded onto a Sprite.
|
|
||||||
* Added Canvas.setUserSelect() to disable touchCallouts and user selections within the canvas.
|
|
||||||
* Added Keyboard.addKey() which creates a new Phaser.Key object that can be polled for updates, pressed states, etc. See the 2 new examples showing use.
|
|
||||||
* Added Button.freezeFrames boolean. Stops the frames being set on mouse events if true.
|
|
||||||
* Extended the Loader 404 error to display the url of the file that didn't load as well as the key.
|
|
||||||
* New: Direction constants have been added to Sprites and adjust based on body motion.
|
|
||||||
* Brand new Sprite.update loop handler. Combined with the transform cache fix and further optimisations this is now much quicker to execute.
|
|
||||||
* Added Keyboard.createCursorKeys() which creates an object with 4 Key objects inside it mapped to up, down, left and right. See the new example in the input folder.
|
|
||||||
* Added Body.skipQuadTree boolean for more fine-grained control over when a body is added to the World QuadTree.
|
|
||||||
* Re-implemented Angular Velocity and Angular Acceleration on the Sprite.body and created 2 new examples to show use.
|
|
||||||
* Added Sprite.fixedToCamera boolean. A Sprite that is fixed to the camera doesn't move with the world, but has its x/y coordinates relative to the top-left of the camera.
|
|
||||||
* Added Group.createMultiple - useful when you need to create a Group of identical sprites for pooling, such as bullets.
|
|
||||||
* Added Group.total. Same as Group.length, but more in line with the rest of the Group naming.
|
|
||||||
* Added Sprite.outOfBoundsKill boolean flag. Will automatically kill a sprite that leaves the game World bounds (off by default).
|
|
||||||
* Lots of changes and fixes in ArcadePhysics, including:
|
|
||||||
* Functions with "mouse" in the title have been updated to "pointer" to more accurately reflect what they do.
|
|
||||||
* New velocity functions: moveToObject, moveToPointer, moveToXY
|
|
||||||
* New acceleration functions: accelerateToObject, accelerateToPointer, accelerateToXY
|
|
||||||
* New distance functions: distanceBetween, distanceToXY, distanceToPointer
|
|
||||||
* New angle functions: angleBetween, angleToXY, angleToPointer
|
|
||||||
* velocityFromAngle and velocityFromRotation added with examples created.
|
|
||||||
* Added killOnComplete parameter to Animation.play. Really useful in situations where you want a Sprite to animate once then kill itself on complete, like an explosion effect.
|
|
||||||
* Added Sprite.loadTexture(key, frame) which allows you to load a new texture set into an existing sprite rather than having to create a new sprite.
|
|
||||||
* Added Sprite.destroy back in again and made it a lot more robust at cleaning up child objects.
|
|
||||||
* Added 'return this' to all the core Loader functions so you can chain load calls if you so wish.
|
|
||||||
* Added Text.destroy() and BitmapText.destroy(), also updated Group.remove to make it more bullet-proof when an element doesn't have any events.
|
|
||||||
* Added Phaser.Utils.shuffle to shuffle an array.
|
|
||||||
* Added Graphics.destroy, x, y and updated angle functions.
|
|
||||||
* Added AnimationManager.refreshFrame - will reset the texture being used for a Sprite (useful after a crop rect clear)
|
|
||||||
* Added Physics.overlap(sprite1, sprite2) for quick body vs. body overlap tests with no separation performed.
|
|
||||||
* On a busy page it's possible for the game to boot with an incorrect stage offset x/y which can cause input events to be calculated wrong. A new property has been added to Stage to combat this issue: Stage.checkOffsetInterval. By default it will check the canvas offset every 2500ms and adjust it accordingly. You can set the value to 'false' to disable the check entirely, or set a higher or lower value. We recommend that you get the value quite low during your games preloader, but once the game has fully loaded hopefully the containing page will have settled down, so it's probably safe to disable the check entirely.
|
|
||||||
* Added Rectangle.floorAll to floor all values in a Rectangle (x, y, width and height).
|
|
||||||
|
|
||||||
What's changed:
|
|
||||||
|
|
||||||
* Renamed Phaser.Text.text to Phaser.Text.content to avoid conflict and overwrite from Pixi local var.
|
|
||||||
* Renamed Phaser.Text.style to Phaser.Text.font to avoid conflict and overwrite from Pixi local var.
|
|
||||||
* Phaser.Button now sets useHandCursor to true by default.
|
|
||||||
* Change: When you start a new State all active tweens are now purged.
|
|
||||||
* When the game boots it will now by default disable user-select and touch action events on the game canvas.
|
|
||||||
* Moved LinkedList.dump to Debug.dumpLinkedList(list)
|
|
||||||
* Phaser.Animation.Frame is now Phaser.Frame
|
|
||||||
* Phaser.Animation.FrameData is now Phaser.FrameData
|
|
||||||
* Phaser.Animation.Parser is now Phaser.AnimationParser (also the file has renamed from Parser.js to AnimationParser.js)
|
|
||||||
* Phaser.Loader.Parser is now Phaser.LoaderParser (also the file has renamed from Parser.js to LoaderParser.js)
|
|
||||||
* Change: We've removed the scrollFactor property from all Game Objects. Sorry, but the new Camera system doesn't work with it and it caused all kinds of issues anyway. We will sort out a replacement for it at a later date.
|
|
||||||
* Change: World now extends Phaser.Group. As a result we've updated GameObjectFactory and other classes that linked to it. If you have anywhere in your code that used to reference world.group you can just remove 'group' from that. So before, world.group.add() is now just world.add().
|
|
||||||
* Change: The Camera has been completely revamped. Rather than adjusting the position of all display objects (bad) it now just shifts the position of the single world container (good!), this is much quicker and also stops the game objects positions from self-adjusting all the time, allowing for them to be properly nested with other containers.
|
|
||||||
* Made Sprite.body optional and added in checks, so you can safely null the Sprite body object if using your own physics system and not impact rendering.
|
|
||||||
* Moved the Camera update checks to World.postUpdate, so all the sprites get the correct adjusted camera position.
|
|
||||||
* The default Game.antialias value is now 'true', so graphics will be smoothed automatically in canvas. Disable it via the Game constructor or Canvas utils.
|
|
||||||
* Phaser.Group now automatically calls updateTransform on any child added to it (avoids temp. frame glitches when new objects are rendered on their first frame).
|
|
||||||
|
|
||||||
What has been updated:
|
|
||||||
|
|
||||||
* Complete overhaul of Physics.Arcade.Body - now significantly more stable and faster too.
|
|
||||||
* Updated ArcadePhysics.separateX/Y to use new body system - much better results now.
|
|
||||||
* Added World.postUpdate - all sprite position changes, as a result of physics, happen here before the render.
|
|
||||||
* Added Animation.paused - can be set to true/false.
|
|
||||||
* Added support for Body.maxVelocity (thanks cocoademon)
|
|
||||||
* InputHandler now creates the _pointerData array on creation and populates with one empty set of values, so pointerOver etc all work before a start call.
|
|
||||||
* Removed the callbackContext parameter from Group.callAll because it's no longer needed.
|
|
||||||
* Updated Group.forEach, forEachAlive and forEachDead so you can now pass as many parameters as you want, which will all be given to the callback after the child.
|
|
||||||
* Updated build script so it can be run from the command-line and includes UMD wrappers (thanks iaincarsberg)
|
|
||||||
* World.randomX/Y now returns values anywhere in the world.bounds range (if set, otherwise 0), including negative values.
|
|
||||||
* Updated InputHandler to use Math.round rather than Math.floor when snapping an object during drag.
|
|
||||||
* If you didn't provide the useNumericIndex parameter then AnimationManager.add will set the value by looking at the datatype of the first element in the frames array.
|
|
||||||
* Group.create now sets the visible and alive properties of the Sprite to the same value as the 'exists' parameter.
|
|
||||||
* World.randomX/Y now works with negative World.bounds values.
|
|
||||||
* Tweens .to will now always return the parent (thanks powerfear)
|
|
||||||
* You can now pass a PIXI.Texture to Sprite (you also need to pass a Phaser.Frame as the frame parameter) but this is useful for Sprites sharing joint canvases.
|
|
||||||
* Group.alpha is now exposed publically and changes the Group container object (not the children directly, who can still have their own alpha values)
|
|
||||||
* Device.webGL uses new inspection code to accurately catch more webGL capable devices.
|
|
||||||
* Debug.renderSpriteBody updated to use a the new Sprite.Body.screenX/Y properties.
|
|
||||||
* Additional checks added to AnimationManager.frame/frameName on the given values.
|
|
||||||
* You can now null a Sprite.crop and it will clear down the crop rect area correctly.
|
|
||||||
* Phaser.Time physicsElapsed delta timer clamp added. Stops rogue iOS / slow mobile timer errors causing crazy high deltas.
|
|
||||||
* Animation.generateFrameNames can now work in reverse, so the start/stop values can create frames that increment or decrement respectively.
|
|
||||||
* Loader updated to use xhr.responseText when loading json, csv or text files. xhr.response is still used for Web Audio binary files (thanks bubba)
|
|
||||||
* Input.onDown and onUp events now dispatch the original event that triggered them (i.e. a MouseEvent or TouchEvent) as the 2nd parameter, after the Pointer (thanks rezoner)
|
|
||||||
* Updated Sprite.crop significantly. Values are now cached, stopping constant Texture frame updates and you can do sprite.crop.width++ for example (thanks haden)
|
|
||||||
* Change: Sprite.crop needs to be enabled with sprite.cropEnabled = true.
|
|
||||||
* Sprite.loadTexture now works correctly with static images, RenderTextures and Animations.
|
|
||||||
* Lots of fixes within Sprite.bounds. The bounds is now correct regardless of rotation, anchor or scale of the Sprite or any of its parent objects.
|
|
||||||
|
|
||||||
What has been fixed:
|
|
||||||
|
|
||||||
* QuadTree bug found in 1.0.5 now fixed. The QuadTree is updated properly now using localTransform values.
|
|
||||||
* Fixed the Bounce.In and Bounce.InOut tweens (thanks XekeDeath)
|
|
||||||
* Fixed an issue in Animation.update where if the game was paused it would get an insane delta timer throwing a uuid error.
|
|
||||||
* Added PixiPatch.js to patch in a few essential features until Pixi is updated.
|
|
||||||
* Fixed issue in Animation.play where the given frameRate and loop values wouldn't overwrite those set on construction.
|
|
||||||
* Fixed small bug stopping Tween.pause / resume from resuming correctly when called directly.
|
|
||||||
* Fixed an issue where Tweens.removeAll wasn't clearing tweens in the addition queue.
|
|
||||||
* Fixed Particle Emitters when using Emitter width/height (thanks XekeDeath)
|
|
||||||
* Made animation looping more robust when skipping frames (thanks XekeDeath)
|
|
||||||
* Fix for incorrect new particle positioning (issue #73) (thanks cottonflop)
|
|
||||||
* Fixed issue in Sound.play where if you gave a missing marker it would play the whole sound sprite instead.
|
|
||||||
* Button.setFrames will set the current frame based on the button state immediately.
|
|
||||||
* Loaded.setPreloadSprite now rounds the width/height values and starts from 1. This fixes canvas draw errors in IE9/10 and Firefox.
|
|
||||||
* Fixed issue causing Keyboard.justPressed to always fire (thanks stemkoski)
|
|
||||||
* Fixed bug in LinkedList#remove that could cause first to point to a dead node (thanks onedayitwillmake)
|
|
||||||
* Fixed Cache.addDefaultImage so the default image works in Canvas as well as WebGL. Updated to a new image (32x32 black square with green outline)
|
|
||||||
* Fixed a bug in the Sprite transform cache check that caused the skew/scale cache to get constantly invalidated - now only updates as needed, significant performance increase!
|
|
||||||
* Fixed typo in StageScaleMode so it's not pageAlignVeritcally any longer, but pageAlignVertically.
|
|
||||||
* Fixed issue in Group.countLiving / countDead where the value was off by one (thanks mjablonski)
|
|
||||||
* Fixed issue with a jittery Camera if you moved a Sprite via velocity instead of x/y placement.
|
|
||||||
* Fixed the RandomDataGenerator.sow method so if you give in the same seed you'll now get the same results (thanks Hsaka)
|
|
||||||
* Fixed Issue #101 (Mouse Button 0 is not recognised, thanks rezoner)
|
|
||||||
* Fixed an issue where creating an animation with just one frame with an index of zero would cause a UUID error (thanks SYNYST3R1)
|
|
||||||
* Fixed Rectangle.union (thanks andron77)
|
|
||||||
* Fixed Sound.resume so it now correctly resumes playback from the point it was paused (fixes issue 51, thanks Yora).
|
|
||||||
* Fixed issue 105 where a dragged object that was destroyed would cause an Input error (thanks onedayitwillmake)
|
|
||||||
* Fixed Issue 111 - calling Kill on a Phaser.Graphics instance causes error on undefined events.
|
|
||||||
* Game.destroy will now stop the raf from running as well as close down all input related event listeners (issue 92, thanks astrism)
|
|
||||||
* Pixel Perfect click detection now works even if the Sprite is part of a texture atlas.
|
|
||||||
|
|
||||||
![Tanks](http://www.photonstorm.com/wp-content/uploads/2013/10/phaser_tanks-640x480.png)
|
![Tanks](http://www.photonstorm.com/wp-content/uploads/2013/10/phaser_tanks-640x480.png)
|
||||||
|
|
||||||
Outstanding Tasks
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
* TODY: Loader conflict if 2 keys are the same even if they are in different packages (i.e. you can't use "title" for both and image and sound file).
|
|
||||||
* TODO: d-pad example (http://www.html5gamedevs.com/topic/1574-gameinputondown-question/)
|
|
||||||
* TODO: more touch input examples (http://www.html5gamedevs.com/topic/1556-mobile-touch-event/)
|
|
||||||
* TODO: Sound.addMarker hh:mm:ss:ms
|
|
||||||
* TODO: swap state (non-destructive shift)
|
|
||||||
* TODO: rotation offset
|
|
||||||
* TODO: Look at HiDPI Canvas settings
|
|
||||||
|
|
||||||
How to Build
|
How to Build
|
||||||
------------
|
------------
|
||||||
|
|
||||||
A Grunt script has been provided that will build Phaser from source as well as the examples. Run `grunt` in the phaser folder for a list of command-line options.
|
We provide a fully compiled version of Phaser in the `build` directory, in both plain and minified formats.
|
||||||
|
|
||||||
|
We also provide a Grunt script that will build Phaser from source along with all the examples.
|
||||||
|
|
||||||
|
Run `grunt` in the phaser folder for a list of command-line options.
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
@ -316,6 +148,7 @@ Road Map
|
||||||
|
|
||||||
The 1.1 release was a massive under-taking, but we're really happy with how Phaser is progressing. It's becoming more solid and versatile with each iteration. Here is what's on our road map for future versions:
|
The 1.1 release was a massive under-taking, but we're really happy with how Phaser is progressing. It's becoming more solid and versatile with each iteration. Here is what's on our road map for future versions:
|
||||||
|
|
||||||
|
* Enhance the State Management, so you can perform non-destructive State swaps and persistence.
|
||||||
* Integration with an advanced physics system. We've been experimenting with p2.js but have yet to conclude our research.
|
* Integration with an advanced physics system. We've been experimenting with p2.js but have yet to conclude our research.
|
||||||
* A more advanced Particle system, one that can render to a single canvas (rather than spawn hundreds of Sprites), more advanced effects, etc.
|
* A more advanced Particle system, one that can render to a single canvas (rather than spawn hundreds of Sprites), more advanced effects, etc.
|
||||||
* Massively enhance the audio side of Phaser. Although it does what it does well, it could do with taking more advantage of Web Audio - echo effects, positional sound, etc.
|
* Massively enhance the audio side of Phaser. Although it does what it does well, it could do with taking more advantage of Web Audio - echo effects, positional sound, etc.
|
||||||
|
@ -328,6 +161,15 @@ The 1.1 release was a massive under-taking, but we're really happy with how Phas
|
||||||
* Flash CC HTML5 export integration.
|
* Flash CC HTML5 export integration.
|
||||||
* Game parameters stored in Google Docs.
|
* Game parameters stored in Google Docs.
|
||||||
* More advanced tile map features. Better support for advanced Tiled features and also I want to add full support for DAME tilemaps.
|
* More advanced tile map features. Better support for advanced Tiled features and also I want to add full support for DAME tilemaps.
|
||||||
|
* Add a d-pad example (http://www.html5gamedevs.com/topic/1574-gameinputondown-question/)
|
||||||
|
* Create more touch input examples (http://www.html5gamedevs.com/topic/1556-mobile-touch-event/)
|
||||||
|
* Look at HiDPI Canvas settings.
|
||||||
|
|
||||||
|
Some specific features / issues we will address soon:
|
||||||
|
|
||||||
|
* Loader conflict if 2 keys are the same even if they are in different packages (i.e. you can't use "title" for both and image and sound file).
|
||||||
|
* Sound.addMarker hh:mm:ss:ms.
|
||||||
|
* Add support for a rotation offset.
|
||||||
|
|
||||||
Learn By Example
|
Learn By Example
|
||||||
----------------
|
----------------
|
||||||
|
@ -365,26 +207,7 @@ Please add them to the [Issue Tracker][1] with as much info as possible.
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
The MIT License (MIT)
|
Phaser is released under the (http://opensource.org/licenses/MIT) MIT License.
|
||||||
|
|
||||||
Copyright (c) 2013 Richard Davey, Photon Storm Ltd.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
[1]: https://github.com/photonstorm/phaser/issues
|
[1]: https://github.com/photonstorm/phaser/issues
|
||||||
[phaser]: https://github.com/photonstorm/phaser
|
[phaser]: https://github.com/photonstorm/phaser
|
||||||
|
|
163
changelog.md
163
changelog.md
|
@ -1,6 +1,169 @@
|
||||||
Change Log
|
Change Log
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
Version 1.1.2 - November 1st 2013
|
||||||
|
|
||||||
|
* New: You'll now find a complete Basic project Template in the resources/Project Templates folder. Will add more complex ones soon.
|
||||||
|
* New: Phaser.Button now has the ability to set over/out/up/down sound effects so they play automatically based on those events.
|
||||||
|
* New: Added init method to plugins, to be called as they are added to the PluginManager (thanks beeglebug)
|
||||||
|
* New: Physics.Body now has a center property (issue 142, thanks MikeMnD)
|
||||||
|
* New: Lots of fixes across Full Screen Mode support. Input now works, scaling restores properly, world scale is correct and anti-alias support added.
|
||||||
|
* New: Added Group.cursor. This points to the first item added to a Group. You can move the cursor with Group.next() and Group.previous().
|
||||||
|
* New: Added Tween.isTweening(object) to check if an object is currently being tweened or not (thanks mikehamil10)
|
||||||
|
* New: Added getMagnitude, setMagnitude, normalize and isZero methods to Point (thanks beeglebug)
|
||||||
|
* New/Change: Group.callAll now supports nested functions and a context, making it really powerful!
|
||||||
|
* Updated: Fixed a few final bugs in the Sprite body and bounds calculations, in turn this resolved the Tilemap collision issues in the 1.1 release.
|
||||||
|
* Updated: Finished documentation for the Phaser.Button class.
|
||||||
|
* Updated: Fixed the Invaders game sample and enhanced it.
|
||||||
|
* Updated: Fixed the Star Struck game sample and enhanced it.
|
||||||
|
* Updated: If you pause an Animation, when you next play it it'll resume (un-pause itself).
|
||||||
|
* Updated: hexToRGB now accepts short hex codes (#EEE) (thanks beeglebug)
|
||||||
|
* Updated: State functions (preload, update, render, etc) are now passed the current game as a parameter (thanks beeglebug)
|
||||||
|
* Updated: If your game is running in Canvas (not WebGL) you can now set Stage.backgroundColor to rgba style CSS strings, allowing for semi-transparent game backgrounds.
|
||||||
|
* Updated: event.preventDefault() has been added to all Mouse event handlers.
|
||||||
|
* Updated: Sprite.deltaX/Y removed due to non-use. prevX/Y values moved to Sprite._cache.prevX/Y.
|
||||||
|
* Updated: Due to missing extends parameter the Sprite prototype was picking up functions from classes it never meant to (Button, TilemapLayer), now fully isolated.
|
||||||
|
* Fixed issue 135 - Added typeof checks into most ArcadePhysics functions to avoid errors with zero values.
|
||||||
|
* Fixed issue 136 - distanceTo using worldX/Y instead of x/y.
|
||||||
|
* Fixed lots of examples where the cursor keys / space bar were not locked from moving the browser page (if you find any more, please tell us!)
|
||||||
|
* Fixed issue 149 - Starling XML files now load properly again, also created an Example to show use of them (thanks haden)
|
||||||
|
* Fixed an issue where if the Starling XML file didn't contain a frameX/Y value it would crash on import.
|
||||||
|
* Fixed the Multiple Animations Example - it's now a lovely underwater scene :)
|
||||||
|
* Fixed issue 141 - If a Sprite is dragged and you release the Pointer while not over the Sprite, it will think it's still over it (thanks Paratron)
|
||||||
|
* Fixed issue 88 - Incorrect game.input.x/y values on click with scaled stage (thanks DrHackenstein)
|
||||||
|
* Fixed issue 143 - Entering full screen mode made the Input x/y coordinates go wrong.
|
||||||
|
|
||||||
|
Version 1.1.1 - October 26th 2013
|
||||||
|
|
||||||
|
* Quick patch to get Phaser.AUTO working again on Firefox / Android.
|
||||||
|
* Any key added via addKey now automatically adds it to the capture list.
|
||||||
|
|
||||||
|
Version 1.1 - October 25th 2013
|
||||||
|
|
||||||
|
What's New:
|
||||||
|
|
||||||
|
* JSDoc is go! We've added jsdoc3 blocks to every property and function, in every file and published the API docs to the docs folder.
|
||||||
|
* Brand new Example system (no more php!) and over 150 examples to learn from too.
|
||||||
|
* New TypeScript definitions file generated (in the build folder - thanks to TomTom1229 for manually enhancing this).
|
||||||
|
* New Grunt based build system added (thanks to Florent Cailhol)
|
||||||
|
* New: Phaser.Animation.generateFrameNames - really useful when creating animation data from texture atlases using file names, not indexes.
|
||||||
|
* Added Sprite.play as a handy short-cut to play an animation already loaded onto a Sprite.
|
||||||
|
* Added Canvas.setUserSelect() to disable touchCallouts and user selections within the canvas.
|
||||||
|
* Added Keyboard.addKey() which creates a new Phaser.Key object that can be polled for updates, pressed states, etc. See the 2 new examples showing use.
|
||||||
|
* Added Button.freezeFrames boolean. Stops the frames being set on mouse events if true.
|
||||||
|
* Extended the Loader 404 error to display the url of the file that didn't load as well as the key.
|
||||||
|
* New: Direction constants have been added to Sprites and adjust based on body motion.
|
||||||
|
* Brand new Sprite.update loop handler. Combined with the transform cache fix and further optimisations this is now much quicker to execute.
|
||||||
|
* Added Keyboard.createCursorKeys() which creates an object with 4 Key objects inside it mapped to up, down, left and right. See the new example in the input folder.
|
||||||
|
* Added Body.skipQuadTree boolean for more fine-grained control over when a body is added to the World QuadTree.
|
||||||
|
* Re-implemented Angular Velocity and Angular Acceleration on the Sprite.body and created 2 new examples to show use.
|
||||||
|
* Added Sprite.fixedToCamera boolean. A Sprite that is fixed to the camera doesn't move with the world, but has its x/y coordinates relative to the top-left of the camera.
|
||||||
|
* Added Group.createMultiple - useful when you need to create a Group of identical sprites for pooling, such as bullets.
|
||||||
|
* Added Group.total. Same as Group.length, but more in line with the rest of the Group naming.
|
||||||
|
* Added Sprite.outOfBoundsKill boolean flag. Will automatically kill a sprite that leaves the game World bounds (off by default).
|
||||||
|
* Lots of changes and fixes in ArcadePhysics, including:
|
||||||
|
* Functions with "mouse" in the title have been updated to "pointer" to more accurately reflect what they do.
|
||||||
|
* New velocity functions: moveToObject, moveToPointer, moveToXY
|
||||||
|
* New acceleration functions: accelerateToObject, accelerateToPointer, accelerateToXY
|
||||||
|
* New distance functions: distanceBetween, distanceToXY, distanceToPointer
|
||||||
|
* New angle functions: angleBetween, angleToXY, angleToPointer
|
||||||
|
* velocityFromAngle and velocityFromRotation added with examples created.
|
||||||
|
* Added killOnComplete parameter to Animation.play. Really useful in situations where you want a Sprite to animate once then kill itself on complete, like an explosion effect.
|
||||||
|
* Added Sprite.loadTexture(key, frame) which allows you to load a new texture set into an existing sprite rather than having to create a new sprite.
|
||||||
|
* Added Sprite.destroy back in again and made it a lot more robust at cleaning up child objects.
|
||||||
|
* Added 'return this' to all the core Loader functions so you can chain load calls if you so wish.
|
||||||
|
* Added Text.destroy() and BitmapText.destroy(), also updated Group.remove to make it more bullet-proof when an element doesn't have any events.
|
||||||
|
* Added Phaser.Utils.shuffle to shuffle an array.
|
||||||
|
* Added Graphics.destroy, x, y and updated angle functions.
|
||||||
|
* Added AnimationManager.refreshFrame - will reset the texture being used for a Sprite (useful after a crop rect clear)
|
||||||
|
* Added Physics.overlap(sprite1, sprite2) for quick body vs. body overlap tests with no separation performed.
|
||||||
|
* On a busy page it's possible for the game to boot with an incorrect stage offset x/y which can cause input events to be calculated wrong. A new property has been added to Stage to combat this issue: Stage.checkOffsetInterval. By default it will check the canvas offset every 2500ms and adjust it accordingly. You can set the value to 'false' to disable the check entirely, or set a higher or lower value. We recommend that you get the value quite low during your games preloader, but once the game has fully loaded hopefully the containing page will have settled down, so it's probably safe to disable the check entirely.
|
||||||
|
* Added Rectangle.floorAll to floor all values in a Rectangle (x, y, width and height).
|
||||||
|
|
||||||
|
What's changed:
|
||||||
|
|
||||||
|
* Renamed Phaser.Text.text to Phaser.Text.content to avoid conflict and overwrite from Pixi local var.
|
||||||
|
* Renamed Phaser.Text.style to Phaser.Text.font to avoid conflict and overwrite from Pixi local var.
|
||||||
|
* Phaser.Button now sets useHandCursor to true by default.
|
||||||
|
* Change: When you start a new State all active tweens are now purged.
|
||||||
|
* When the game boots it will now by default disable user-select and touch action events on the game canvas.
|
||||||
|
* Moved LinkedList.dump to Debug.dumpLinkedList(list)
|
||||||
|
* Phaser.Animation.Frame is now Phaser.Frame
|
||||||
|
* Phaser.Animation.FrameData is now Phaser.FrameData
|
||||||
|
* Phaser.Animation.Parser is now Phaser.AnimationParser (also the file has renamed from Parser.js to AnimationParser.js)
|
||||||
|
* Phaser.Loader.Parser is now Phaser.LoaderParser (also the file has renamed from Parser.js to LoaderParser.js)
|
||||||
|
* Change: We've removed the scrollFactor property from all Game Objects. Sorry, but the new Camera system doesn't work with it and it caused all kinds of issues anyway. We will sort out a replacement for it at a later date.
|
||||||
|
* Change: World now extends Phaser.Group. As a result we've updated GameObjectFactory and other classes that linked to it. If you have anywhere in your code that used to reference world.group you can just remove 'group' from that. So before, world.group.add() is now just world.add().
|
||||||
|
* Change: The Camera has been completely revamped. Rather than adjusting the position of all display objects (bad) it now just shifts the position of the single world container (good!), this is much quicker and also stops the game objects positions from self-adjusting all the time, allowing for them to be properly nested with other containers.
|
||||||
|
* Made Sprite.body optional and added in checks, so you can safely null the Sprite body object if using your own physics system and not impact rendering.
|
||||||
|
* Moved the Camera update checks to World.postUpdate, so all the sprites get the correct adjusted camera position.
|
||||||
|
* The default Game.antialias value is now 'true', so graphics will be smoothed automatically in canvas. Disable it via the Game constructor or Canvas utils.
|
||||||
|
* Phaser.Group now automatically calls updateTransform on any child added to it (avoids temp. frame glitches when new objects are rendered on their first frame).
|
||||||
|
|
||||||
|
What has been updated:
|
||||||
|
|
||||||
|
* Complete overhaul of Physics.Arcade.Body - now significantly more stable and faster too.
|
||||||
|
* Updated ArcadePhysics.separateX/Y to use new body system - much better results now.
|
||||||
|
* Added World.postUpdate - all sprite position changes, as a result of physics, happen here before the render.
|
||||||
|
* Added Animation.paused - can be set to true/false.
|
||||||
|
* Added support for Body.maxVelocity (thanks cocoademon)
|
||||||
|
* InputHandler now creates the _pointerData array on creation and populates with one empty set of values, so pointerOver etc all work before a start call.
|
||||||
|
* Removed the callbackContext parameter from Group.callAll because it's no longer needed.
|
||||||
|
* Updated Group.forEach, forEachAlive and forEachDead so you can now pass as many parameters as you want, which will all be given to the callback after the child.
|
||||||
|
* Updated build script so it can be run from the command-line and includes UMD wrappers (thanks iaincarsberg)
|
||||||
|
* World.randomX/Y now returns values anywhere in the world.bounds range (if set, otherwise 0), including negative values.
|
||||||
|
* Updated InputHandler to use Math.round rather than Math.floor when snapping an object during drag.
|
||||||
|
* If you didn't provide the useNumericIndex parameter then AnimationManager.add will set the value by looking at the datatype of the first element in the frames array.
|
||||||
|
* Group.create now sets the visible and alive properties of the Sprite to the same value as the 'exists' parameter.
|
||||||
|
* World.randomX/Y now works with negative World.bounds values.
|
||||||
|
* Tweens .to will now always return the parent (thanks powerfear)
|
||||||
|
* You can now pass a PIXI.Texture to Sprite (you also need to pass a Phaser.Frame as the frame parameter) but this is useful for Sprites sharing joint canvases.
|
||||||
|
* Group.alpha is now exposed publically and changes the Group container object (not the children directly, who can still have their own alpha values)
|
||||||
|
* Device.webGL uses new inspection code to accurately catch more webGL capable devices.
|
||||||
|
* Debug.renderSpriteBody updated to use a the new Sprite.Body.screenX/Y properties.
|
||||||
|
* Additional checks added to AnimationManager.frame/frameName on the given values.
|
||||||
|
* You can now null a Sprite.crop and it will clear down the crop rect area correctly.
|
||||||
|
* Phaser.Time physicsElapsed delta timer clamp added. Stops rogue iOS / slow mobile timer errors causing crazy high deltas.
|
||||||
|
* Animation.generateFrameNames can now work in reverse, so the start/stop values can create frames that increment or decrement respectively.
|
||||||
|
* Loader updated to use xhr.responseText when loading json, csv or text files. xhr.response is still used for Web Audio binary files (thanks bubba)
|
||||||
|
* Input.onDown and onUp events now dispatch the original event that triggered them (i.e. a MouseEvent or TouchEvent) as the 2nd parameter, after the Pointer (thanks rezoner)
|
||||||
|
* Updated Sprite.crop significantly. Values are now cached, stopping constant Texture frame updates and you can do sprite.crop.width++ for example (thanks haden)
|
||||||
|
* Change: Sprite.crop needs to be enabled with sprite.cropEnabled = true.
|
||||||
|
* Sprite.loadTexture now works correctly with static images, RenderTextures and Animations.
|
||||||
|
* Lots of fixes within Sprite.bounds. The bounds is now correct regardless of rotation, anchor or scale of the Sprite or any of its parent objects.
|
||||||
|
|
||||||
|
What has been fixed:
|
||||||
|
|
||||||
|
* QuadTree bug found in 1.0.5 now fixed. The QuadTree is updated properly now using localTransform values.
|
||||||
|
* Fixed the Bounce.In and Bounce.InOut tweens (thanks XekeDeath)
|
||||||
|
* Fixed an issue in Animation.update where if the game was paused it would get an insane delta timer throwing a uuid error.
|
||||||
|
* Added PixiPatch.js to patch in a few essential features until Pixi is updated.
|
||||||
|
* Fixed issue in Animation.play where the given frameRate and loop values wouldn't overwrite those set on construction.
|
||||||
|
* Fixed small bug stopping Tween.pause / resume from resuming correctly when called directly.
|
||||||
|
* Fixed an issue where Tweens.removeAll wasn't clearing tweens in the addition queue.
|
||||||
|
* Fixed Particle Emitters when using Emitter width/height (thanks XekeDeath)
|
||||||
|
* Made animation looping more robust when skipping frames (thanks XekeDeath)
|
||||||
|
* Fix for incorrect new particle positioning (issue #73) (thanks cottonflop)
|
||||||
|
* Fixed issue in Sound.play where if you gave a missing marker it would play the whole sound sprite instead.
|
||||||
|
* Button.setFrames will set the current frame based on the button state immediately.
|
||||||
|
* Loaded.setPreloadSprite now rounds the width/height values and starts from 1. This fixes canvas draw errors in IE9/10 and Firefox.
|
||||||
|
* Fixed issue causing Keyboard.justPressed to always fire (thanks stemkoski)
|
||||||
|
* Fixed bug in LinkedList#remove that could cause first to point to a dead node (thanks onedayitwillmake)
|
||||||
|
* Fixed Cache.addDefaultImage so the default image works in Canvas as well as WebGL. Updated to a new image (32x32 black square with green outline)
|
||||||
|
* Fixed a bug in the Sprite transform cache check that caused the skew/scale cache to get constantly invalidated - now only updates as needed, significant performance increase!
|
||||||
|
* Fixed typo in StageScaleMode so it's not pageAlignVeritcally any longer, but pageAlignVertically.
|
||||||
|
* Fixed issue in Group.countLiving / countDead where the value was off by one (thanks mjablonski)
|
||||||
|
* Fixed issue with a jittery Camera if you moved a Sprite via velocity instead of x/y placement.
|
||||||
|
* Fixed the RandomDataGenerator.sow method so if you give in the same seed you'll now get the same results (thanks Hsaka)
|
||||||
|
* Fixed Issue #101 (Mouse Button 0 is not recognised, thanks rezoner)
|
||||||
|
* Fixed an issue where creating an animation with just one frame with an index of zero would cause a UUID error (thanks SYNYST3R1)
|
||||||
|
* Fixed Rectangle.union (thanks andron77)
|
||||||
|
* Fixed Sound.resume so it now correctly resumes playback from the point it was paused (fixes issue 51, thanks Yora).
|
||||||
|
* Fixed issue 105 where a dragged object that was destroyed would cause an Input error (thanks onedayitwillmake)
|
||||||
|
* Fixed Issue 111 - calling Kill on a Phaser.Graphics instance causes error on undefined events.
|
||||||
|
* Game.destroy will now stop the raf from running as well as close down all input related event listeners (issue 92, thanks astrism)
|
||||||
|
* Pixel Perfect click detection now works even if the Sprite is part of a texture atlas.
|
||||||
|
|
||||||
Version 1.0.6 (September 24th 2013)
|
Version 1.0.6 (September 24th 2013)
|
||||||
|
|
||||||
* Added check into Pointer.move to always consider a Sprite that has pixelPerfect enabled, regardless of render ID.
|
* Added check into Pointer.move to always consider a Sprite that has pixelPerfect enabled, regardless of render ID.
|
||||||
|
|
190
examples/assets/sprites/atlas json array trimmed.tps
Normal file
190
examples/assets/sprites/atlas json array trimmed.tps
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<data version="1.0">
|
||||||
|
<struct type="Settings">
|
||||||
|
<key>fileFormatVersion</key>
|
||||||
|
<int>1</int>
|
||||||
|
<key>variation</key>
|
||||||
|
<string>main</string>
|
||||||
|
<key>verbose</key>
|
||||||
|
<false/>
|
||||||
|
<key>autoSDSettings</key>
|
||||||
|
<array/>
|
||||||
|
<key>allowRotation</key>
|
||||||
|
<false/>
|
||||||
|
<key>quiet</key>
|
||||||
|
<false/>
|
||||||
|
<key>premultiplyAlpha</key>
|
||||||
|
<false/>
|
||||||
|
<key>shapeDebug</key>
|
||||||
|
<false/>
|
||||||
|
<key>dpi</key>
|
||||||
|
<uint>72</uint>
|
||||||
|
<key>dataFormat</key>
|
||||||
|
<string>json-array</string>
|
||||||
|
<key>textureFileName</key>
|
||||||
|
<filename>atlas_json_array_trimmed.png</filename>
|
||||||
|
<key>flipPVR</key>
|
||||||
|
<false/>
|
||||||
|
<key>ditherType</key>
|
||||||
|
<enum type="SettingsBase::DitherType">NearestNeighbour</enum>
|
||||||
|
<key>backgroundColor</key>
|
||||||
|
<uint>0</uint>
|
||||||
|
<key>libGdx</key>
|
||||||
|
<struct type="LibGDX">
|
||||||
|
<key>filtering</key>
|
||||||
|
<struct type="LibGDXFiltering">
|
||||||
|
<key>x</key>
|
||||||
|
<enum type="LibGDXFiltering::Filtering">Linear</enum>
|
||||||
|
<key>y</key>
|
||||||
|
<enum type="LibGDXFiltering::Filtering">Linear</enum>
|
||||||
|
</struct>
|
||||||
|
</struct>
|
||||||
|
<key>shapePadding</key>
|
||||||
|
<uint>2</uint>
|
||||||
|
<key>jpgQuality</key>
|
||||||
|
<uint>80</uint>
|
||||||
|
<key>pngOptimizationLevel</key>
|
||||||
|
<uint>0</uint>
|
||||||
|
<key>textureSubPath</key>
|
||||||
|
<string></string>
|
||||||
|
<key>textureFormat</key>
|
||||||
|
<enum type="SettingsBase::TextureFormat">png</enum>
|
||||||
|
<key>borderPadding</key>
|
||||||
|
<uint>2</uint>
|
||||||
|
<key>maxTextureSize</key>
|
||||||
|
<QSize>
|
||||||
|
<key>width</key>
|
||||||
|
<int>1024</int>
|
||||||
|
<key>height</key>
|
||||||
|
<int>1024</int>
|
||||||
|
</QSize>
|
||||||
|
<key>fixedTextureSize</key>
|
||||||
|
<QSize>
|
||||||
|
<key>width</key>
|
||||||
|
<int>-1</int>
|
||||||
|
<key>height</key>
|
||||||
|
<int>-1</int>
|
||||||
|
</QSize>
|
||||||
|
<key>reduceBorderArtifacts</key>
|
||||||
|
<false/>
|
||||||
|
<key>algorithmSettings</key>
|
||||||
|
<struct type="AlgorithmSettings">
|
||||||
|
<key>algorithm</key>
|
||||||
|
<enum type="AlgorithmSettings::AlgorithmId">MaxRects</enum>
|
||||||
|
<key>freeSizeMode</key>
|
||||||
|
<enum type="AlgorithmSettings::AlgorithmFreeSizeMode">Best</enum>
|
||||||
|
<key>sizeConstraints</key>
|
||||||
|
<enum type="AlgorithmSettings::SizeConstraints">POT</enum>
|
||||||
|
<key>forceSquared</key>
|
||||||
|
<false/>
|
||||||
|
<key>forceWordAligned</key>
|
||||||
|
<false/>
|
||||||
|
<key>maxRects</key>
|
||||||
|
<struct type="AlgorithmMaxRectsSettings">
|
||||||
|
<key>heuristic</key>
|
||||||
|
<enum type="AlgorithmMaxRectsSettings::Heuristic">Best</enum>
|
||||||
|
</struct>
|
||||||
|
<key>basic</key>
|
||||||
|
<struct type="AlgorithmBasicSettings">
|
||||||
|
<key>sortBy</key>
|
||||||
|
<enum type="AlgorithmBasicSettings::SortBy">Best</enum>
|
||||||
|
<key>order</key>
|
||||||
|
<enum type="AlgorithmBasicSettings::Order">Ascending</enum>
|
||||||
|
</struct>
|
||||||
|
</struct>
|
||||||
|
<key>andEngine</key>
|
||||||
|
<struct type="AndEngine">
|
||||||
|
<key>minFilter</key>
|
||||||
|
<enum type="AndEngine::MinFilter">Linear</enum>
|
||||||
|
<key>packageName</key>
|
||||||
|
<string>Texture</string>
|
||||||
|
<key>javaFileName</key>
|
||||||
|
<filename>atlas_json_array_trimmed.java</filename>
|
||||||
|
<key>wrap</key>
|
||||||
|
<struct type="AndEngineWrap">
|
||||||
|
<key>s</key>
|
||||||
|
<enum type="AndEngineWrap::Wrap">Clamp</enum>
|
||||||
|
<key>t</key>
|
||||||
|
<enum type="AndEngineWrap::Wrap">Clamp</enum>
|
||||||
|
</struct>
|
||||||
|
<key>magFilter</key>
|
||||||
|
<enum type="AndEngine::MagFilter">MagLinear</enum>
|
||||||
|
</struct>
|
||||||
|
<key>dataFileName</key>
|
||||||
|
<filename>atlas_json_array_trimmed.json</filename>
|
||||||
|
<key>multiPack</key>
|
||||||
|
<false/>
|
||||||
|
<key>mainExtension</key>
|
||||||
|
<string></string>
|
||||||
|
<key>forceIdenticalLayout</key>
|
||||||
|
<false/>
|
||||||
|
<key>outputFormat</key>
|
||||||
|
<enum type="SettingsBase::OutputFormat">RGBA8888</enum>
|
||||||
|
<key>contentProtection</key>
|
||||||
|
<struct type="ContentProtection">
|
||||||
|
<key>key</key>
|
||||||
|
<string></string>
|
||||||
|
</struct>
|
||||||
|
<key>autoAliasEnabled</key>
|
||||||
|
<true/>
|
||||||
|
<key>trimSpriteNames</key>
|
||||||
|
<true/>
|
||||||
|
<key>globalSpriteSettings</key>
|
||||||
|
<struct type="SpriteSettings">
|
||||||
|
<key>scale</key>
|
||||||
|
<double>1</double>
|
||||||
|
<key>scaleMode</key>
|
||||||
|
<enum type="ScaleMode">Smooth</enum>
|
||||||
|
<key>innerPadding</key>
|
||||||
|
<uint>0</uint>
|
||||||
|
<key>extrude</key>
|
||||||
|
<uint>0</uint>
|
||||||
|
<key>trimThreshold</key>
|
||||||
|
<uint>1</uint>
|
||||||
|
<key>trimMode</key>
|
||||||
|
<enum type="SpriteSettings::TrimMode">Trim</enum>
|
||||||
|
<key>heuristicMask</key>
|
||||||
|
<false/>
|
||||||
|
</struct>
|
||||||
|
<key>fileList</key>
|
||||||
|
<array>
|
||||||
|
<filename>../pics/titan_mech.png</filename>
|
||||||
|
<filename>../pics/shocktroopers_lulu2.png</filename>
|
||||||
|
<filename>../pics/spyro.png</filename>
|
||||||
|
<filename>../pics/contra3.png</filename>
|
||||||
|
<filename>../pics/cactuar.png</filename>
|
||||||
|
<filename>../pics/contra1.png</filename>
|
||||||
|
<filename>../pics/nanoha_taiken_blue.png</filename>
|
||||||
|
<filename>../pics/ladycop.png</filename>
|
||||||
|
<filename>darkwing_crazy.png</filename>
|
||||||
|
<filename>oz_pov_melting_disk.png</filename>
|
||||||
|
<filename>sonic_havok_sanity.png</filename>
|
||||||
|
<filename>slime.png</filename>
|
||||||
|
<filename>wizball.png</filename>
|
||||||
|
<filename>phaser-dude.png</filename>
|
||||||
|
<filename>pangball.png</filename>
|
||||||
|
<filename>thrust_ship.png</filename>
|
||||||
|
<filename>tomato.png</filename>
|
||||||
|
<filename>onion.png</filename>
|
||||||
|
<filename>pepper.png</filename>
|
||||||
|
<filename>pineapple.png</filename>
|
||||||
|
<filename>diamond.png</filename>
|
||||||
|
<filename>eggplant.png</filename>
|
||||||
|
<filename>firstaid.png</filename>
|
||||||
|
<filename>melon.png</filename>
|
||||||
|
<filename>mushroom.png</filename>
|
||||||
|
<filename>phaser_tiny.png</filename>
|
||||||
|
<filename>carrot.png</filename>
|
||||||
|
</array>
|
||||||
|
<key>ignoreFileList</key>
|
||||||
|
<array/>
|
||||||
|
<key>replaceList</key>
|
||||||
|
<array/>
|
||||||
|
<key>ignoredWarnings</key>
|
||||||
|
<array/>
|
||||||
|
<key>commonDivisorX</key>
|
||||||
|
<uint>1</uint>
|
||||||
|
<key>commonDivisorY</key>
|
||||||
|
<uint>1</uint>
|
||||||
|
</struct>
|
||||||
|
</data>
|
228
examples/assets/sprites/atlas_json_array_trimmed.json
Normal file
228
examples/assets/sprites/atlas_json_array_trimmed.json
Normal file
|
@ -0,0 +1,228 @@
|
||||||
|
{"frames": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"filename": "cactuar",
|
||||||
|
"frame": {"x":2,"y":205,"w":213,"h":159},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": true,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":213,"h":159},
|
||||||
|
"sourceSize": {"w":231,"h":175}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "carrot",
|
||||||
|
"frame": {"x":217,"y":247,"w":22,"h":21},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":22,"h":21},
|
||||||
|
"sourceSize": {"w":22,"h":21}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "contra1",
|
||||||
|
"frame": {"x":160,"y":366,"w":83,"h":169},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":83,"h":169},
|
||||||
|
"sourceSize": {"w":83,"h":169}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "contra3",
|
||||||
|
"frame": {"x":2,"y":2,"w":246,"h":201},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":246,"h":201},
|
||||||
|
"sourceSize": {"w":246,"h":201}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "darkwing_crazy",
|
||||||
|
"frame": {"x":431,"y":364,"w":53,"h":49},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":53,"h":49},
|
||||||
|
"sourceSize": {"w":53,"h":49}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "diamond",
|
||||||
|
"frame": {"x":194,"y":571,"w":32,"h":28},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":32,"h":28},
|
||||||
|
"sourceSize": {"w":32,"h":28}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "eggplant",
|
||||||
|
"frame": {"x":491,"y":72,"w":16,"h":21},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":21},
|
||||||
|
"sourceSize": {"w":16,"h":21}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "firstaid",
|
||||||
|
"frame": {"x":160,"y":547,"w":32,"h":32},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":32,"h":32},
|
||||||
|
"sourceSize": {"w":32,"h":32}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "ladycop",
|
||||||
|
"frame": {"x":2,"y":736,"w":87,"h":231},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":87,"h":231},
|
||||||
|
"sourceSize": {"w":87,"h":231}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "melon",
|
||||||
|
"frame": {"x":217,"y":344,"w":20,"h":20},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":20,"h":20},
|
||||||
|
"sourceSize": {"w":20,"h":20}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "mushroom",
|
||||||
|
"frame": {"x":217,"y":300,"w":21,"h":21},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":21,"h":21},
|
||||||
|
"sourceSize": {"w":21,"h":21}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "nanoha_taiken_blue",
|
||||||
|
"frame": {"x":2,"y":366,"w":156,"h":224},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":156,"h":224},
|
||||||
|
"sourceSize": {"w":156,"h":224}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "onion",
|
||||||
|
"frame": {"x":217,"y":323,"w":21,"h":19},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":21,"h":19},
|
||||||
|
"sourceSize": {"w":21,"h":19}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "oz_pov_melting_disk",
|
||||||
|
"frame": {"x":431,"y":246,"w":62,"h":116},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":62,"h":116},
|
||||||
|
"sourceSize": {"w":62,"h":116}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "pangball",
|
||||||
|
"frame": {"x":195,"y":537,"w":32,"h":32},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":32,"h":32},
|
||||||
|
"sourceSize": {"w":32,"h":32}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "pepper",
|
||||||
|
"frame": {"x":491,"y":2,"w":19,"h":24},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":19,"h":24},
|
||||||
|
"sourceSize": {"w":19,"h":24}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "phaser-dude",
|
||||||
|
"frame": {"x":217,"y":205,"w":27,"h":40},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":27,"h":40},
|
||||||
|
"sourceSize": {"w":27,"h":40}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "phaser_tiny",
|
||||||
|
"frame": {"x":160,"y":537,"w":33,"h":8},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":33,"h":8},
|
||||||
|
"sourceSize": {"w":33,"h":8}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "pineapple",
|
||||||
|
"frame": {"x":491,"y":47,"w":16,"h":23},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":16,"h":23},
|
||||||
|
"sourceSize": {"w":16,"h":23}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "shocktroopers_lulu2",
|
||||||
|
"frame": {"x":229,"y":546,"w":131,"h":188},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": true,
|
||||||
|
"spriteSourceSize": {"x":1,"y":0,"w":131,"h":188},
|
||||||
|
"sourceSize": {"w":133,"h":188}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "slime",
|
||||||
|
"frame": {"x":431,"y":415,"w":48,"h":52},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":48,"h":52},
|
||||||
|
"sourceSize": {"w":48,"h":52}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "sonic_havok_sanity",
|
||||||
|
"frame": {"x":403,"y":469,"w":98,"h":167},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":98,"h":167},
|
||||||
|
"sourceSize": {"w":98,"h":167}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "spyro",
|
||||||
|
"frame": {"x":245,"y":430,"w":156,"h":114},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": true,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":156,"h":114},
|
||||||
|
"sourceSize": {"w":176,"h":130}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "thrust_ship",
|
||||||
|
"frame": {"x":217,"y":270,"w":21,"h":28},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":21,"h":28},
|
||||||
|
"sourceSize": {"w":21,"h":28}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "titan_mech",
|
||||||
|
"frame": {"x":250,"y":2,"w":239,"h":242},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":239,"h":242},
|
||||||
|
"sourceSize": {"w":239,"h":242}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "tomato",
|
||||||
|
"frame": {"x":491,"y":28,"w":18,"h":17},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": false,
|
||||||
|
"spriteSourceSize": {"x":0,"y":0,"w":18,"h":17},
|
||||||
|
"sourceSize": {"w":18,"h":17}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename": "wizball",
|
||||||
|
"frame": {"x":246,"y":246,"w":183,"h":182},
|
||||||
|
"rotated": false,
|
||||||
|
"trimmed": true,
|
||||||
|
"spriteSourceSize": {"x":4,"y":2,"w":183,"h":182},
|
||||||
|
"sourceSize": {"w":195,"h":188}
|
||||||
|
}],
|
||||||
|
"meta": {
|
||||||
|
"app": "http://www.codeandweb.com/texturepacker ",
|
||||||
|
"version": "1.0",
|
||||||
|
"image": "atlas_json_array_trimmed.png",
|
||||||
|
"format": "RGBA8888",
|
||||||
|
"size": {"w":512,"h":1024},
|
||||||
|
"scale": "1",
|
||||||
|
"smartupdate": "$TexturePacker:SmartUpdate:c3013af70e8e46c48c1f140e4eb1a651:1/1$"
|
||||||
|
}
|
||||||
|
}
|
BIN
examples/assets/sprites/atlas_json_array_trimmed.png
Normal file
BIN
examples/assets/sprites/atlas_json_array_trimmed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 173 KiB |
|
@ -59,7 +59,7 @@ function update() {
|
||||||
ufo.angle = -15;
|
ufo.angle = -15;
|
||||||
leftBtn.alpha = 0.6;
|
leftBtn.alpha = 0.6;
|
||||||
}
|
}
|
||||||
else if (game.input.keyboard.isDown(Phaser.Keyboard.RIGHT)
|
else if (game.input.keyboard.isDown(Phaser.Keyboard.RIGHT))
|
||||||
{
|
{
|
||||||
ufo.x += speed;
|
ufo.x += speed;
|
||||||
ufo.angle = 15;
|
ufo.angle = 15;
|
||||||
|
|
51
examples/wip/pixelpick atlas trimmed.js
Normal file
51
examples/wip/pixelpick atlas trimmed.js
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
|
||||||
|
var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload, create: create });
|
||||||
|
|
||||||
|
function preload() {
|
||||||
|
|
||||||
|
game.load.atlas('atlas', 'assets/sprites/atlas_json_array_trimmed.png', 'assets/sprites/atlas_json_array_trimmed.json');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var wizball;
|
||||||
|
// var chick;
|
||||||
|
// var mech;
|
||||||
|
// var robot;
|
||||||
|
// var cop;
|
||||||
|
|
||||||
|
function create() {
|
||||||
|
|
||||||
|
game.stage.backgroundColor = '#404040';
|
||||||
|
|
||||||
|
// This demonstrates pixel perfect click detection even if using sprites in a texture atlas.
|
||||||
|
|
||||||
|
// chick = game.add.sprite(64, 64, 'atlas');
|
||||||
|
// chick.frameName = 'budbrain_chick.png';
|
||||||
|
// chick.inputEnabled = true;
|
||||||
|
// chick.input.pixelPerfect = true;
|
||||||
|
// chick.input.useHandCursor = true;
|
||||||
|
|
||||||
|
// cop = game.add.sprite(600, 64, 'atlas');
|
||||||
|
// cop.frameName = 'ladycop.png';
|
||||||
|
// cop.inputEnabled = true;
|
||||||
|
// cop.input.pixelPerfect = true;
|
||||||
|
// cop.input.useHandCursor = true;
|
||||||
|
|
||||||
|
// robot = game.add.sprite(50, 300, 'atlas');
|
||||||
|
// robot.frameName = 'robot.png';
|
||||||
|
// robot.inputEnabled = true;
|
||||||
|
// robot.input.pixelPerfect = true;
|
||||||
|
// robot.input.useHandCursor = true;
|
||||||
|
|
||||||
|
wizball = game.add.sprite(100, 400, 'atlas', 'wizball');
|
||||||
|
wizball.inputEnabled = true;
|
||||||
|
wizball.input.pixelPerfect = true;
|
||||||
|
wizball.input.useHandCursor = true;
|
||||||
|
|
||||||
|
// mech = game.add.sprite(250, 100, 'atlas');
|
||||||
|
// mech.frameName = 'titan_mech.png';
|
||||||
|
// mech.inputEnabled = true;
|
||||||
|
// mech.input.pixelPerfect = true;
|
||||||
|
// mech.input.useHandCursor = true;
|
||||||
|
|
||||||
|
}
|
|
@ -534,12 +534,13 @@ Phaser.InputHandler.prototype = {
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description.
|
* Runs a pixel perfect check against the given x/y coordinates of the Sprite this InputHandler is bound to.
|
||||||
* @method Phaser.InputHandler#checkPixel
|
* It compares the alpha value of the pixel and if >= InputHandler.pixelPerfectAlpha it returns true.
|
||||||
* @param {Description} x - Description.
|
* @method Phaser.InputHandler#checkPixel
|
||||||
* @param {Description} y - Description.
|
* @param {number} x - The x coordinate to check.
|
||||||
* @return {boolean}
|
* @param {number} y - The y coordinate to check.
|
||||||
*/
|
* @return {boolean} true if there is the alpha of the pixel is >= InputHandler.pixelPerfectAlpha
|
||||||
|
*/
|
||||||
checkPixel: function (x, y) {
|
checkPixel: function (x, y) {
|
||||||
|
|
||||||
// Grab a pixel from our image into the hitCanvas and then test it
|
// Grab a pixel from our image into the hitCanvas and then test it
|
||||||
|
@ -547,8 +548,6 @@ Phaser.InputHandler.prototype = {
|
||||||
{
|
{
|
||||||
this.game.input.hitContext.clearRect(0, 0, 1, 1);
|
this.game.input.hitContext.clearRect(0, 0, 1, 1);
|
||||||
|
|
||||||
// This will fail if the image is part of a texture atlas - need to modify the x/y values here
|
|
||||||
|
|
||||||
x += this.sprite.texture.frame.x;
|
x += this.sprite.texture.frame.x;
|
||||||
y += this.sprite.texture.frame.y;
|
y += this.sprite.texture.frame.y;
|
||||||
|
|
||||||
|
|
|
@ -172,19 +172,19 @@ Phaser.Physics.Arcade.prototype = {
|
||||||
// If you're wondering why the velocity is halved and applied twice, read this: http://www.niksula.hut.fi/~hkankaan/Homepages/gravity.html
|
// If you're wondering why the velocity is halved and applied twice, read this: http://www.niksula.hut.fi/~hkankaan/Homepages/gravity.html
|
||||||
|
|
||||||
// Rotation
|
// Rotation
|
||||||
this._velocityDelta = (this.computeVelocity(0, body, body.angularVelocity, body.angularAcceleration, body.angularDrag, body.maxAngular) - body.angularVelocity) / 2;
|
this._velocityDelta = (this.computeVelocity(0, body, body.angularVelocity, body.angularAcceleration, body.angularDrag, body.maxAngular) - body.angularVelocity) * this.game.time.physicsElapsed * 0.5 * 60;
|
||||||
body.angularVelocity += this._velocityDelta;
|
body.angularVelocity += this._velocityDelta;
|
||||||
body.rotation += (body.angularVelocity * this.game.time.physicsElapsed);
|
body.rotation += (body.angularVelocity * this.game.time.physicsElapsed);
|
||||||
body.angularVelocity += this._velocityDelta;
|
body.angularVelocity += this._velocityDelta;
|
||||||
|
|
||||||
// Horizontal
|
// Horizontal
|
||||||
this._velocityDelta = (this.computeVelocity(1, body, body.velocity.x, body.acceleration.x, body.drag.x, body.maxVelocity.x) - body.velocity.x) / 2;
|
this._velocityDelta = (this.computeVelocity(1, body, body.velocity.x, body.acceleration.x, body.drag.x, body.maxVelocity.x) - body.velocity.x) * this.game.time.physicsElapsed * 0.5 * 60;
|
||||||
body.velocity.x += this._velocityDelta;
|
body.velocity.x += this._velocityDelta;
|
||||||
body.x += (body.velocity.x * this.game.time.physicsElapsed);
|
body.x += (body.velocity.x * this.game.time.physicsElapsed);
|
||||||
body.velocity.x += this._velocityDelta;
|
body.velocity.x += this._velocityDelta;
|
||||||
|
|
||||||
// Vertical
|
// Vertical
|
||||||
this._velocityDelta = (this.computeVelocity(2, body, body.velocity.y, body.acceleration.y, body.drag.y, body.maxVelocity.y) - body.velocity.y) / 2;
|
this._velocityDelta = (this.computeVelocity(2, body, body.velocity.y, body.acceleration.y, body.drag.y, body.maxVelocity.y) - body.velocity.y) * this.game.time.physicsElapsed * 0.5 * 60;
|
||||||
body.velocity.y += this._velocityDelta;
|
body.velocity.y += this._velocityDelta;
|
||||||
body.y += (body.velocity.y * this.game.time.physicsElapsed);
|
body.y += (body.velocity.y * this.game.time.physicsElapsed);
|
||||||
body.velocity.y += this._velocityDelta;
|
body.velocity.y += this._velocityDelta;
|
||||||
|
|
Loading…
Reference in a new issue