From ffd5ddc5343348e83bf1bfd08bc436a71ad85086 Mon Sep 17 00:00:00 2001 From: photonstorm Date: Wed, 23 Oct 2013 14:00:28 +0100 Subject: [PATCH] Tidying up the repo and adding in new documentation. --- {docs2/out => docs}/Animation.js.html | 23 +- {docs2/out => docs}/AnimationManager.js.html | 48 +- {docs2/out => docs}/AnimationParser.js.html | 2 +- {docs2/out => docs}/Cache.js.html | 125 +- {docs2/out => docs}/Camera.js.html | 168 +- {docs2/out => docs}/Canvas.js.html | 3 +- {docs2/out => docs}/Circle.js.html | 2 +- {docs2/out => docs}/Color.js.html | 2 +- {docs2/out => docs}/Debug.js.html | 85 +- {docs2/out => docs}/Device.js.html | 5 +- {docs2/out => docs}/Easing.js.html | 2 +- {docs2/out => docs}/Emitter.js.html | 2 +- {docs2/out => docs}/Frame.js.html | 2 +- {docs2/out => docs}/FrameData.js.html | 9 +- {docs2/out => docs}/Game.js.html | 12 +- {docs2/out => docs}/Group.js.html | 104 +- {docs2/out => docs}/Input.js.html | 2 +- {docs2/out => docs}/InputHandler.js.html | 10 +- {docs2/out => docs}/Intro.js.html | 2 +- {docs2/out => docs}/Key.js.html | 2 +- {docs2/out => docs}/Keyboard.js.html | 36 +- {docs2/out => docs}/LinkedList.js.html | 2 +- {docs2/out => docs}/Loader.js.html | 129 +- {docs2/out => docs}/LoaderParser.js.html | 2 +- {docs2/out => docs}/MSPointer.js.html | 2 +- {docs2/out => docs}/Math.js.html | 75 +- {docs2/out => docs}/Mouse.js.html | 2 +- {docs2/out => docs}/Net.js.html | 2 +- {docs2/out => docs}/Particles.js.html | 2 +- {docs2/out => docs}/Phaser.Animation.html | 175 +- .../out => docs}/Phaser.AnimationManager.html | 241 +- .../out => docs}/Phaser.AnimationParser.html | 2 +- {docs2/out => docs}/Phaser.Cache.html | 780 ++++- {docs2/out => docs}/Phaser.Camera.html | 278 +- {docs2/out => docs}/Phaser.Canvas.html | 22 +- {docs2/out => docs}/Phaser.Circle.html | 2 +- {docs2/out => docs}/Phaser.Color.html | 2 +- {docs2/out => docs}/Phaser.Device.html | 6 +- {docs2/out => docs}/Phaser.Easing.Back.html | 2 +- {docs2/out => docs}/Phaser.Easing.Bounce.html | 2 +- .../out => docs}/Phaser.Easing.Circular.html | 2 +- {docs2/out => docs}/Phaser.Easing.Cubic.html | 2 +- .../out => docs}/Phaser.Easing.Elastic.html | 2 +- .../Phaser.Easing.Exponential.html | 2 +- {docs2/out => docs}/Phaser.Easing.Linear.html | 2 +- .../out => docs}/Phaser.Easing.Quadratic.html | 2 +- .../out => docs}/Phaser.Easing.Quartic.html | 2 +- .../out => docs}/Phaser.Easing.Quintic.html | 2 +- .../Phaser.Easing.Sinusoidal.html | 2 +- {docs2/out => docs}/Phaser.Easing.html | 2 +- {docs2/out => docs}/Phaser.Frame.html | 2 +- {docs2/out => docs}/Phaser.FrameData.html | 4 +- {docs2/out => docs}/Phaser.Game.html | 76 +- {docs2/out => docs}/Phaser.Group.html | 664 +++- {docs2/out => docs}/Phaser.Input.html | 2 +- {docs2/out => docs}/Phaser.InputHandler.html | 2 +- {docs2/out => docs}/Phaser.Key.html | 2 +- {docs2/out => docs}/Phaser.Keyboard.html | 116 +- {docs2/out => docs}/Phaser.LinkedList.html | 2 +- {docs2/out => docs}/Phaser.Loader.html | 466 ++- {docs2/out => docs}/Phaser.LoaderParser.html | 2 +- {docs2/out => docs}/Phaser.MSPointer.html | 2 +- {docs2/out => docs}/Phaser.Math.html | 251 +- {docs2/out => docs}/Phaser.Mouse.html | 2 +- {docs2/out => docs}/Phaser.Net.html | 2 +- .../Phaser.Particles.Arcade.Emitter.html | 563 +++- {docs2/out => docs}/Phaser.Particles.html | 2 +- {docs2/out => docs}/Phaser.Plugin.html | 2 +- {docs2/out => docs}/Phaser.PluginManager.html | 2 +- {docs2/out => docs}/Phaser.Point.html | 44 +- {docs2/out => docs}/Phaser.Pointer.html | 20 +- {docs2/out => docs}/Phaser.QuadTree.html | 2 +- .../Phaser.RandomDataGenerator.html | 24 +- {docs2/out => docs}/Phaser.Rectangle.html | 31 +- .../Phaser.RequestAnimationFrame.html | 2 +- {docs2/out => docs}/Phaser.Signal.html | 2 +- {docs2/out => docs}/Phaser.Sound.html | 2 +- {docs2/out => docs}/Phaser.SoundManager.html | 2 +- {docs2/out => docs}/Phaser.Stage.html | 2 +- .../out => docs}/Phaser.StageScaleMode.html | 6 +- {docs2/out => docs}/Phaser.State.html | 2 +- {docs2/out => docs}/Phaser.StateManager.html | 2 +- {docs2/out => docs}/Phaser.Time.html | 2 +- {docs2/out => docs}/Phaser.Touch.html | 2 +- {docs2/out => docs}/Phaser.Tween.html | 36 +- {docs2/out => docs}/Phaser.TweenManager.html | 2 +- {docs2/out => docs}/Phaser.Utils.Debug.html | 32 +- {docs2/out => docs}/Phaser.Utils.html | 82 +- {docs2/out => docs}/Phaser.World.html | 385 +-- {docs2/out => docs}/Phaser.html | 2 +- {docs2/out => docs}/Phaser.js.html | 4 +- {docs2/out => docs}/Plugin.js.html | 2 +- {docs2/out => docs}/PluginManager.js.html | 2 +- {docs2/out => docs}/Point.js.html | 4 +- {docs2/out => docs}/Pointer.js.html | 8 +- {docs2/out => docs}/QuadTree.js.html | 2 +- .../out => docs}/RandomDataGenerator.js.html | 9 +- {docs2/out => docs}/Rectangle.js.html | 14 +- .../RequestAnimationFrame.js.html | 2 +- {docs2/out => docs}/Signal.js.html | 2 +- {docs2/out => docs}/SignalBinding.html | 2 +- {docs2/out => docs}/SignalBinding.js.html | 2 +- {docs2/out => docs}/Sound.js.html | 2 +- {docs2/out => docs}/SoundManager.js.html | 2 +- {docs2/out => docs}/Stage.js.html | 2 +- {docs2/out => docs}/StageScaleMode.js.html | 8 +- {docs2/out => docs}/State.js.html | 2 +- {docs2/out => docs}/StateManager.js.html | 2 +- {docs2/out => docs}/Time.js.html | 2 +- {docs2/out => docs}/Touch.js.html | 2 +- {docs2/out => docs}/Tween.js.html | 20 +- {docs2/out => docs}/TweenManager.js.html | 2 +- {docs2/out => docs}/Utils.js.html | 18 +- {docs2/out => docs}/World.js.html | 246 +- docs/build/build dev.bat | 1 + docs/build/build master.bat | 1 + docs/build/conf.json | 58 + docs2/conf.json => docs/build/conf_dev.json | 20 +- .../build}/docstrap-master/.gitignore | 0 .../build}/docstrap-master/.npmignore | 0 .../build}/docstrap-master/Gruntfile.js | 0 .../build}/docstrap-master/LICENSE.md | 0 .../build}/docstrap-master/README.md | 0 .../build}/docstrap-master/bower.json | 0 .../build}/docstrap-master/component.json | 0 .../build}/docstrap-master/fixtures/car.js | 0 .../fixtures/example.conf.json | 0 .../build}/docstrap-master/fixtures/other.js | 0 .../build}/docstrap-master/fixtures/person.js | 0 .../fixtures/tutorials/Brush Teeth.md | 0 .../fixtures/tutorials/Drive Car.md | 0 .../build}/docstrap-master/package.json | 0 .../docstrap-master/styles/bootswatch.less | 0 .../build}/docstrap-master/styles/main.less | 0 .../docstrap-master/styles/variables.less | 0 .../docstrap-master/template/jsdoc.conf.json | 0 .../docstrap-master/template/publish.js | 0 .../static/img/glyphicons-halflings-white.png | Bin .../static/img/glyphicons-halflings.png | Bin .../template/static/scripts/URI.js | 0 .../static/scripts/bootstrap-dropdown.js | 0 .../template/static/scripts/bootstrap-tab.js | 0 .../static/scripts/jquery.localScroll.js | 0 .../template/static/scripts/jquery.min.js | 0 .../static/scripts/jquery.scrollTo.js | 0 .../static/scripts/jquery.sunlight.js | 0 .../scripts/prettify/Apache-License-2.0.txt | 0 .../static/scripts/prettify/jquery.min.js | 0 .../static/scripts/prettify/lang-css.js | 0 .../static/scripts/prettify/prettify.js | 0 .../scripts/sunlight-plugin.doclinks.js | 0 .../scripts/sunlight-plugin.linenumbers.js | 0 .../static/scripts/sunlight-plugin.menu.js | 0 .../static/scripts/sunlight.javascript.js | 0 .../template/static/scripts/sunlight.js | 0 .../template/static/scripts/toc.js | 0 .../template/static/styles/darkstrap.css | 0 .../static/styles/prettify-tomorrow.css | 0 .../template/static/styles/site.amelia.css | 0 .../template/static/styles/site.cerulean.css | 0 .../template/static/styles/site.cosmo.css | 0 .../template/static/styles/site.cyborg.css | 0 .../template/static/styles/site.darkstrap.css | 0 .../template/static/styles/site.flatly.css | 0 .../template/static/styles/site.journal.css | 0 .../template/static/styles/site.readable.css | 0 .../template/static/styles/site.simplex.css | 0 .../template/static/styles/site.slate.css | 0 .../template/static/styles/site.spacelab.css | 0 .../template/static/styles/site.spruce.css | 0 .../template/static/styles/site.superhero.css | 0 .../template/static/styles/site.united.css | 0 .../template/static/styles/sunlight.dark.css | 0 .../static/styles/sunlight.default.css | 0 .../template/tmpl/container.tmpl | 0 .../template/tmpl/details.tmpl | 0 .../template/tmpl/example.tmpl | 0 .../template/tmpl/examples.tmpl | 0 .../template/tmpl/exceptions.tmpl | 0 .../docstrap-master/template/tmpl/fires.tmpl | 0 .../docstrap-master/template/tmpl/layout.tmpl | 0 .../template/tmpl/mainpage.tmpl | 0 .../template/tmpl/members.tmpl | 0 .../docstrap-master/template/tmpl/method.tmpl | 0 .../docstrap-master/template/tmpl/params.tmpl | 0 .../template/tmpl/properties.tmpl | 0 .../template/tmpl/returns.tmpl | 0 .../template/tmpl/sections.tmpl | 0 .../docstrap-master/template/tmpl/source.tmpl | 0 .../template/tmpl/tutorial.tmpl | 0 .../docstrap-master/template/tmpl/type.tmpl | 0 {docs2/out => docs}/classes.list.html | 2 +- {docs2/out => docs}/global.html | 4 +- .../img/glyphicons-halflings-white.png | Bin .../out => docs}/img/glyphicons-halflings.png | Bin {docs2/out => docs}/index.html | 2 +- {docs2/out => docs}/namespaces.list.html | 2 +- {docs2/out => docs}/scripts/URI.js | 0 .../scripts/bootstrap-dropdown.js | 0 {docs2/out => docs}/scripts/bootstrap-tab.js | 0 .../scripts/jquery.localScroll.js | 0 {docs2/out => docs}/scripts/jquery.min.js | 0 .../out => docs}/scripts/jquery.scrollTo.js | 0 .../out => docs}/scripts/jquery.sunlight.js | 0 .../scripts/prettify/Apache-License-2.0.txt | 0 .../scripts/prettify/jquery.min.js | 0 .../out => docs}/scripts/prettify/lang-css.js | 0 .../out => docs}/scripts/prettify/prettify.js | 0 .../scripts/sunlight-plugin.doclinks.js | 0 .../scripts/sunlight-plugin.linenumbers.js | 0 .../scripts/sunlight-plugin.menu.js | 0 .../scripts/sunlight.javascript.js | 0 {docs2/out => docs}/scripts/sunlight.js | 0 {docs2/out => docs}/scripts/toc.js | 0 {docs2/out => docs}/styles/darkstrap.css | 0 .../out => docs}/styles/prettify-tomorrow.css | 0 {docs2/out => docs}/styles/site.amelia.css | 0 {docs2/out => docs}/styles/site.cerulean.css | 0 {docs2/out => docs}/styles/site.cosmo.css | 0 {docs2/out => docs}/styles/site.cyborg.css | 0 {docs2/out => docs}/styles/site.darkstrap.css | 0 {docs2/out => docs}/styles/site.flatly.css | 0 {docs2/out => docs}/styles/site.journal.css | 0 {docs2/out => docs}/styles/site.readable.css | 0 {docs2/out => docs}/styles/site.simplex.css | 0 {docs2/out => docs}/styles/site.slate.css | 0 {docs2/out => docs}/styles/site.spacelab.css | 0 {docs2/out => docs}/styles/site.spruce.css | 0 {docs2/out => docs}/styles/site.superhero.css | 0 {docs2/out => docs}/styles/site.united.css | 0 {docs2/out => docs}/styles/sunlight.dark.css | 0 .../out => docs}/styles/sunlight.default.css | 0 docs2/Documentation Checklist.xlsx | Bin 5746 -> 0 bytes docs2/Hello Phaser/index.html | 37 - docs2/Hello Phaser/logo.png | Bin 180337 -> 0 bytes docs2/Hello Phaser/phaser-min.js | 1 - docs2/jsdoc_work.txt | 74 - ...mationManager-Phaser.AnimationManager.html | 707 ----- docs2/out/AnimationManager.html | 220 -- docs2/out/Back.html | 874 ----- docs2/out/Bounce.html | 874 ----- docs2/out/Circular.html | 874 ----- docs2/out/Cubic.html | 874 ----- docs2/out/Elastic.html | 874 ----- docs2/out/Exponential.html | 874 ----- docs2/out/Linear.html | 592 ---- docs2/out/Parser.js.html | 617 ---- docs2/out/Parser.js_.html | 381 --- docs2/out/Phaser.Animation.Frame.html | 2815 ----------------- docs2/out/Phaser.Animation.FrameData.html | 1762 ----------- docs2/out/Phaser.Animation.Parser.html | 1269 -------- docs2/out/Phaser.Loader.Parser.html | 548 ---- .../PluginManager-Phaser.PluginManager.html | 599 ---- docs2/out/PluginManager.html | 300 -- docs2/out/Quadratic.html | 874 ----- docs2/out/Quartic.html | 874 ----- docs2/out/Quintic.html | 874 ----- docs2/out/Sinusoidal.html | 874 ----- docs2/out/Utils.html | 502 --- docs2/out/Utils_.html | 513 --- docs2/out/module-Phaser.html | 441 --- docs2/out/module-Tween-Phaser.Tween.html | 1070 ------- .../out/module-Tween-Phaser.TweenManager.html | 746 ----- docs2/out/module-Tween.html | 458 --- docs2/out/modules.list.html | 676 ---- docs2/out/scripts/linenumber.js | 17 - docs2/out/styles/jsdoc-default.css | 283 -- docs2/out/styles/prettify-jsdoc.css | 111 - docs2/tags.txt | 47 - {plugins2 => plugins}/CSS3Filters.js | 0 {plugins2 => plugins}/ColorHarmony.js | 0 {plugins2 => plugins}/SamplePlugin.js | 0 .../2D Text/Phaser Logo 2D Vector Outline.fla | Bin .../PNG/Phaser Logo Print Quality.png | Bin .../PNG/Phaser Logo Web Quality.png | Bin .../PNG/Phaser Logo iPad Resolution.png | Bin .../Phaser Logo/PNG/Phaser-Logo-Small.png | Bin .../Pixel Art/Phaser-Logo-Sizes.png | Bin .../Pixel Art/phaser_pixel_large_shaded.png | Bin .../Pixel Art/phaser_pixel_medium_flat.png | Bin .../Pixel Art/phaser_pixel_medium_shaded.png | Bin .../Pixel Art/phaser_pixel_small_flat.png | Bin .../Phaser Logo/Vector/Phaser Logo.eps | Bin .../Phaser Logo/Vector/Phaser Logo.fla | Bin .../Screen Shots/phaser-cybernoid.png | Bin .../Screen Shots/phaser_balls.png | Bin .../Screen Shots/phaser_blaster.png | Bin .../Screen Shots/phaser_cams.png | Bin .../Screen Shots/phaser_desert.png | Bin .../Screen Shots/phaser_fixed_camera.png | Bin .../Screen Shots/phaser_fruit.png | Bin .../Screen Shots/phaser_fruit_particles.png | Bin .../Screen Shots/phaser_mapdraw.png | Bin .../Screen Shots/phaser_mario_combo.png | Bin .../Screen Shots/phaser_particles.png | Bin .../Screen Shots/phaser_platformer.png | Bin .../Screen Shots/phaser_quadtree.png | Bin .../Screen Shots/phaser_rotate4.png | Bin .../Screen Shots/phaser_scrollfactor.png | Bin .../Screen Shots/phaser_sprite_bounds.png | Bin .../Screen Shots/phaser_tanks.png | Bin .../Screen Shots/phaser_tilemap.png | Bin .../Screen Shots/phaser_tilemap_collision.png | Bin .../Screen Shots/phaser_tilemap_debug.png | Bin .../wip}/01_phaser-arcade.jpg | Bin .../wip}/02_phaser-newsletter.jpg | Bin .../wip}/Physics Comparison.xlsx | Bin .../wip}/phaser-manual_2013-08-27.pdf | Bin {docs2/WIP => resources/wip}/phaser_copy.doc | Bin .../phaser_onscreen-controls_1-arcade.png | Bin .../wip}/phaser_onscreen-controls_2-dpad.png | Bin .../phaser_onscreen-controls_3-generic.png | Bin .../wip/sprites}/avoid-digits.png | Bin .../wip/sprites}/avoid-panel.png | Bin .../wip/sprites}/avoid-sheet.png | Bin .../wip/sprites}/avoidmock4x2.png | Bin .../wip/sprites}/box-01.png | Bin .../wip/sprites}/box-02.png | Bin .../wip/sprites}/breakout2c.png | Bin .../wip/sprites}/phaser checkboxes.gif | Bin .../wip/sprites}/phaser power tools.gif | Bin .../wip/sprites}/phaser sprites10.gif | Bin {docs2 => resources}/zwoptex-phaser.template | 0 wip/physics/AdvancedPhysics.js | 269 -- wip/physics/AdvancedPhysics.ts | 386 --- wip/physics/ArcadePhysics.js | 19 - wip/physics/ArcadePhysics.ts | 1121 ------- wip/physics/Body.js | 416 --- wip/physics/Body.ts | 657 ---- wip/physics/BodyUtils.ts | 94 - wip/physics/Bounds.js | 201 -- wip/physics/Bounds.ts | 199 -- wip/physics/Collision.js | 373 --- wip/physics/Collision.ts | 559 ---- wip/physics/Contact.js | 32 - wip/physics/Contact.ts | 62 - wip/physics/ContactSolver.js | 269 -- wip/physics/ContactSolver.ts | 386 --- wip/physics/Manager.js | 67 - wip/physics/Manager.ts | 86 - wip/physics/Plane.js | 23 - wip/physics/Plane.ts | 28 - wip/physics/Space.js | 500 --- wip/physics/Space.ts | 823 ----- wip/physics/Transform.js | 53 - wip/physics/Transform.ts | 83 - wip/physics/TransformUtils.js | 39 - wip/physics/TransformUtils.ts | 43 - wip/physics/joints/IJoint.js | 3 - wip/physics/joints/IJoint.js.map | 1 - wip/physics/joints/IJoint.ts | 43 - wip/physics/joints/Joint.js | 41 - wip/physics/joints/Joint.js.map | 1 - wip/physics/joints/Joint.ts | 64 - wip/physics/shapes/Box.js | 59 - wip/physics/shapes/Box.js.map | 1 - wip/physics/shapes/Box.ts | 45 - wip/physics/shapes/Circle.js | 87 - wip/physics/shapes/Circle.js.map | 1 - wip/physics/shapes/Circle.ts | 105 - wip/physics/shapes/IShape.js | 3 - wip/physics/shapes/IShape.js.map | 1 - wip/physics/shapes/IShape.ts | 47 - wip/physics/shapes/Poly.js | 206 -- wip/physics/shapes/Poly.js.map | 1 - wip/physics/shapes/Poly.ts | 299 -- wip/physics/shapes/Segment.js | 141 - wip/physics/shapes/Segment.js.map | 1 - wip/physics/shapes/Segment.ts | 204 -- wip/physics/shapes/Shape.js | 33 - wip/physics/shapes/Shape.js.map | 1 - wip/physics/shapes/Shape.ts | 62 - wip/physics/shapes/Triangle.js | 51 - wip/physics/shapes/Triangle.js.map | 1 - wip/physics/shapes/Triangle.ts | 32 - 375 files changed, 4617 insertions(+), 32924 deletions(-) rename {docs2/out => docs}/Animation.js.html (96%) rename {docs2/out => docs}/AnimationManager.js.html (92%) rename {docs2/out => docs}/AnimationParser.js.html (99%) rename {docs2/out => docs}/Cache.js.html (88%) rename {docs2/out => docs}/Camera.js.html (81%) rename {docs2/out => docs}/Canvas.js.html (99%) rename {docs2/out => docs}/Circle.js.html (99%) rename {docs2/out => docs}/Color.js.html (99%) rename {docs2/out => docs}/Debug.js.html (94%) rename {docs2/out => docs}/Device.js.html (98%) rename {docs2/out => docs}/Easing.js.html (99%) rename {docs2/out => docs}/Emitter.js.html (99%) rename {docs2/out => docs}/Frame.js.html (99%) rename {docs2/out => docs}/FrameData.js.html (98%) rename {docs2/out => docs}/Game.js.html (99%) rename {docs2/out => docs}/Group.js.html (94%) rename {docs2/out => docs}/Input.js.html (99%) rename {docs2/out => docs}/InputHandler.js.html (99%) rename {docs2/out => docs}/Intro.js.html (99%) rename {docs2/out => docs}/Key.js.html (99%) rename {docs2/out => docs}/Keyboard.js.html (95%) rename {docs2/out => docs}/LinkedList.js.html (99%) rename {docs2/out => docs}/Loader.js.html (91%) rename {docs2/out => docs}/LoaderParser.js.html (99%) rename {docs2/out => docs}/MSPointer.js.html (99%) rename {docs2/out => docs}/Math.js.html (97%) rename {docs2/out => docs}/Mouse.js.html (99%) rename {docs2/out => docs}/Net.js.html (99%) rename {docs2/out => docs}/Particles.js.html (99%) rename {docs2/out => docs}/Phaser.Animation.html (92%) rename {docs2/out => docs}/Phaser.AnimationManager.html (91%) rename {docs2/out => docs}/Phaser.AnimationParser.html (99%) rename {docs2/out => docs}/Phaser.Cache.html (87%) rename {docs2/out => docs}/Phaser.Camera.html (90%) rename {docs2/out => docs}/Phaser.Canvas.html (98%) rename {docs2/out => docs}/Phaser.Circle.html (99%) rename {docs2/out => docs}/Phaser.Color.html (99%) rename {docs2/out => docs}/Phaser.Device.html (99%) rename {docs2/out => docs}/Phaser.Easing.Back.html (99%) rename {docs2/out => docs}/Phaser.Easing.Bounce.html (99%) rename {docs2/out => docs}/Phaser.Easing.Circular.html (99%) rename {docs2/out => docs}/Phaser.Easing.Cubic.html (99%) rename {docs2/out => docs}/Phaser.Easing.Elastic.html (99%) rename {docs2/out => docs}/Phaser.Easing.Exponential.html (99%) rename {docs2/out => docs}/Phaser.Easing.Linear.html (99%) rename {docs2/out => docs}/Phaser.Easing.Quadratic.html (99%) rename {docs2/out => docs}/Phaser.Easing.Quartic.html (99%) rename {docs2/out => docs}/Phaser.Easing.Quintic.html (99%) rename {docs2/out => docs}/Phaser.Easing.Sinusoidal.html (99%) rename {docs2/out => docs}/Phaser.Easing.html (99%) rename {docs2/out => docs}/Phaser.Frame.html (99%) rename {docs2/out => docs}/Phaser.FrameData.html (99%) rename {docs2/out => docs}/Phaser.Game.html (97%) rename {docs2/out => docs}/Phaser.Group.html (89%) rename {docs2/out => docs}/Phaser.Input.html (99%) rename {docs2/out => docs}/Phaser.InputHandler.html (99%) rename {docs2/out => docs}/Phaser.Key.html (99%) rename {docs2/out => docs}/Phaser.Keyboard.html (95%) rename {docs2/out => docs}/Phaser.LinkedList.html (99%) rename {docs2/out => docs}/Phaser.Loader.html (89%) rename {docs2/out => docs}/Phaser.LoaderParser.html (99%) rename {docs2/out => docs}/Phaser.MSPointer.html (99%) rename {docs2/out => docs}/Phaser.Math.html (97%) rename {docs2/out => docs}/Phaser.Mouse.html (99%) rename {docs2/out => docs}/Phaser.Net.html (99%) rename {docs2/out => docs}/Phaser.Particles.Arcade.Emitter.html (94%) rename {docs2/out => docs}/Phaser.Particles.html (99%) rename {docs2/out => docs}/Phaser.Plugin.html (99%) rename {docs2/out => docs}/Phaser.PluginManager.html (99%) rename {docs2/out => docs}/Phaser.Point.html (98%) rename {docs2/out => docs}/Phaser.Pointer.html (99%) rename {docs2/out => docs}/Phaser.QuadTree.html (99%) rename {docs2/out => docs}/Phaser.RandomDataGenerator.html (98%) rename {docs2/out => docs}/Phaser.Rectangle.html (99%) rename {docs2/out => docs}/Phaser.RequestAnimationFrame.html (99%) rename {docs2/out => docs}/Phaser.Signal.html (99%) rename {docs2/out => docs}/Phaser.Sound.html (99%) rename {docs2/out => docs}/Phaser.SoundManager.html (99%) rename {docs2/out => docs}/Phaser.Stage.html (99%) rename {docs2/out => docs}/Phaser.StageScaleMode.html (99%) rename {docs2/out => docs}/Phaser.State.html (99%) rename {docs2/out => docs}/Phaser.StateManager.html (99%) rename {docs2/out => docs}/Phaser.Time.html (99%) rename {docs2/out => docs}/Phaser.Touch.html (99%) rename {docs2/out => docs}/Phaser.Tween.html (97%) rename {docs2/out => docs}/Phaser.TweenManager.html (99%) rename {docs2/out => docs}/Phaser.Utils.Debug.html (99%) rename {docs2/out => docs}/Phaser.Utils.html (92%) rename {docs2/out => docs}/Phaser.World.html (91%) rename {docs2/out => docs}/Phaser.html (99%) rename {docs2/out => docs}/Phaser.js.html (98%) rename {docs2/out => docs}/Plugin.js.html (99%) rename {docs2/out => docs}/PluginManager.js.html (99%) rename {docs2/out => docs}/Point.js.html (99%) rename {docs2/out => docs}/Pointer.js.html (99%) rename {docs2/out => docs}/QuadTree.js.html (99%) rename {docs2/out => docs}/RandomDataGenerator.js.html (98%) rename {docs2/out => docs}/Rectangle.js.html (98%) rename {docs2/out => docs}/RequestAnimationFrame.js.html (99%) rename {docs2/out => docs}/Signal.js.html (99%) rename {docs2/out => docs}/SignalBinding.html (99%) rename {docs2/out => docs}/SignalBinding.js.html (99%) rename {docs2/out => docs}/Sound.js.html (99%) rename {docs2/out => docs}/SoundManager.js.html (99%) rename {docs2/out => docs}/Stage.js.html (99%) rename {docs2/out => docs}/StageScaleMode.js.html (99%) rename {docs2/out => docs}/State.js.html (99%) rename {docs2/out => docs}/StateManager.js.html (99%) rename {docs2/out => docs}/Time.js.html (99%) rename {docs2/out => docs}/Touch.js.html (99%) rename {docs2/out => docs}/Tween.js.html (98%) rename {docs2/out => docs}/TweenManager.js.html (99%) rename {docs2/out => docs}/Utils.js.html (96%) rename {docs2/out => docs}/World.js.html (70%) create mode 100644 docs/build/build dev.bat create mode 100644 docs/build/build master.bat create mode 100644 docs/build/conf.json rename docs2/conf.json => docs/build/conf_dev.json (63%) rename {docs2 => docs/build}/docstrap-master/.gitignore (100%) rename {docs2 => docs/build}/docstrap-master/.npmignore (100%) rename {docs2 => docs/build}/docstrap-master/Gruntfile.js (100%) rename {docs2 => docs/build}/docstrap-master/LICENSE.md (100%) rename {docs2 => docs/build}/docstrap-master/README.md (100%) rename {docs2 => docs/build}/docstrap-master/bower.json (100%) rename {docs2 => docs/build}/docstrap-master/component.json (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/car.js (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/example.conf.json (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/other.js (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/person.js (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/tutorials/Brush Teeth.md (100%) rename {docs2 => docs/build}/docstrap-master/fixtures/tutorials/Drive Car.md (100%) rename {docs2 => docs/build}/docstrap-master/package.json (100%) rename {docs2 => docs/build}/docstrap-master/styles/bootswatch.less (100%) rename {docs2 => docs/build}/docstrap-master/styles/main.less (100%) rename {docs2 => docs/build}/docstrap-master/styles/variables.less (100%) rename {docs2 => docs/build}/docstrap-master/template/jsdoc.conf.json (100%) rename {docs2 => docs/build}/docstrap-master/template/publish.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/img/glyphicons-halflings-white.png (100%) rename {docs2 => docs/build}/docstrap-master/template/static/img/glyphicons-halflings.png (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/URI.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/bootstrap-dropdown.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/bootstrap-tab.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/jquery.localScroll.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/jquery.min.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/jquery.scrollTo.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/jquery.sunlight.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/prettify/Apache-License-2.0.txt (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/prettify/jquery.min.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/prettify/lang-css.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/prettify/prettify.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/sunlight-plugin.doclinks.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/sunlight-plugin.linenumbers.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/sunlight-plugin.menu.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/sunlight.javascript.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/sunlight.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/scripts/toc.js (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/darkstrap.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/prettify-tomorrow.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.amelia.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.cerulean.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.cosmo.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.cyborg.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.darkstrap.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.flatly.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.journal.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.readable.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.simplex.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.slate.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.spacelab.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.spruce.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.superhero.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/site.united.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/sunlight.dark.css (100%) rename {docs2 => docs/build}/docstrap-master/template/static/styles/sunlight.default.css (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/container.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/details.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/example.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/examples.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/exceptions.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/fires.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/layout.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/mainpage.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/members.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/method.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/params.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/properties.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/returns.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/sections.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/source.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/tutorial.tmpl (100%) rename {docs2 => docs/build}/docstrap-master/template/tmpl/type.tmpl (100%) rename {docs2/out => docs}/classes.list.html (99%) rename {docs2/out => docs}/global.html (98%) rename {docs2/out => docs}/img/glyphicons-halflings-white.png (100%) rename {docs2/out => docs}/img/glyphicons-halflings.png (100%) rename {docs2/out => docs}/index.html (99%) rename {docs2/out => docs}/namespaces.list.html (99%) rename {docs2/out => docs}/scripts/URI.js (100%) rename {docs2/out => docs}/scripts/bootstrap-dropdown.js (100%) rename {docs2/out => docs}/scripts/bootstrap-tab.js (100%) rename {docs2/out => docs}/scripts/jquery.localScroll.js (100%) rename {docs2/out => docs}/scripts/jquery.min.js (100%) rename {docs2/out => docs}/scripts/jquery.scrollTo.js (100%) rename {docs2/out => docs}/scripts/jquery.sunlight.js (100%) rename {docs2/out => docs}/scripts/prettify/Apache-License-2.0.txt (100%) rename {docs2/out => docs}/scripts/prettify/jquery.min.js (100%) rename {docs2/out => docs}/scripts/prettify/lang-css.js (100%) rename {docs2/out => docs}/scripts/prettify/prettify.js (100%) rename {docs2/out => docs}/scripts/sunlight-plugin.doclinks.js (100%) rename {docs2/out => docs}/scripts/sunlight-plugin.linenumbers.js (100%) rename {docs2/out => docs}/scripts/sunlight-plugin.menu.js (100%) rename {docs2/out => docs}/scripts/sunlight.javascript.js (100%) rename {docs2/out => docs}/scripts/sunlight.js (100%) rename {docs2/out => docs}/scripts/toc.js (100%) rename {docs2/out => docs}/styles/darkstrap.css (100%) rename {docs2/out => docs}/styles/prettify-tomorrow.css (100%) rename {docs2/out => docs}/styles/site.amelia.css (100%) rename {docs2/out => docs}/styles/site.cerulean.css (100%) rename {docs2/out => docs}/styles/site.cosmo.css (100%) rename {docs2/out => docs}/styles/site.cyborg.css (100%) rename {docs2/out => docs}/styles/site.darkstrap.css (100%) rename {docs2/out => docs}/styles/site.flatly.css (100%) rename {docs2/out => docs}/styles/site.journal.css (100%) rename {docs2/out => docs}/styles/site.readable.css (100%) rename {docs2/out => docs}/styles/site.simplex.css (100%) rename {docs2/out => docs}/styles/site.slate.css (100%) rename {docs2/out => docs}/styles/site.spacelab.css (100%) rename {docs2/out => docs}/styles/site.spruce.css (100%) rename {docs2/out => docs}/styles/site.superhero.css (100%) rename {docs2/out => docs}/styles/site.united.css (100%) rename {docs2/out => docs}/styles/sunlight.dark.css (100%) rename {docs2/out => docs}/styles/sunlight.default.css (100%) delete mode 100644 docs2/Documentation Checklist.xlsx delete mode 100644 docs2/Hello Phaser/index.html delete mode 100644 docs2/Hello Phaser/logo.png delete mode 100644 docs2/Hello Phaser/phaser-min.js delete mode 100644 docs2/jsdoc_work.txt delete mode 100644 docs2/out/AnimationManager-Phaser.AnimationManager.html delete mode 100644 docs2/out/AnimationManager.html delete mode 100644 docs2/out/Back.html delete mode 100644 docs2/out/Bounce.html delete mode 100644 docs2/out/Circular.html delete mode 100644 docs2/out/Cubic.html delete mode 100644 docs2/out/Elastic.html delete mode 100644 docs2/out/Exponential.html delete mode 100644 docs2/out/Linear.html delete mode 100644 docs2/out/Parser.js.html delete mode 100644 docs2/out/Parser.js_.html delete mode 100644 docs2/out/Phaser.Animation.Frame.html delete mode 100644 docs2/out/Phaser.Animation.FrameData.html delete mode 100644 docs2/out/Phaser.Animation.Parser.html delete mode 100644 docs2/out/Phaser.Loader.Parser.html delete mode 100644 docs2/out/PluginManager-Phaser.PluginManager.html delete mode 100644 docs2/out/PluginManager.html delete mode 100644 docs2/out/Quadratic.html delete mode 100644 docs2/out/Quartic.html delete mode 100644 docs2/out/Quintic.html delete mode 100644 docs2/out/Sinusoidal.html delete mode 100644 docs2/out/Utils.html delete mode 100644 docs2/out/Utils_.html delete mode 100644 docs2/out/module-Phaser.html delete mode 100644 docs2/out/module-Tween-Phaser.Tween.html delete mode 100644 docs2/out/module-Tween-Phaser.TweenManager.html delete mode 100644 docs2/out/module-Tween.html delete mode 100644 docs2/out/modules.list.html delete mode 100644 docs2/out/scripts/linenumber.js delete mode 100644 docs2/out/styles/jsdoc-default.css delete mode 100644 docs2/out/styles/prettify-jsdoc.css delete mode 100644 docs2/tags.txt rename {plugins2 => plugins}/CSS3Filters.js (100%) rename {plugins2 => plugins}/ColorHarmony.js (100%) rename {plugins2 => plugins}/SamplePlugin.js (100%) rename {docs2 => resources}/Phaser Logo/2D Text/Phaser Logo 2D Vector Outline.fla (100%) rename {docs2 => resources}/Phaser Logo/PNG/Phaser Logo Print Quality.png (100%) rename {docs2 => resources}/Phaser Logo/PNG/Phaser Logo Web Quality.png (100%) rename {docs2 => resources}/Phaser Logo/PNG/Phaser Logo iPad Resolution.png (100%) rename {docs2 => resources}/Phaser Logo/PNG/Phaser-Logo-Small.png (100%) rename {docs2 => resources}/Phaser Logo/Pixel Art/Phaser-Logo-Sizes.png (100%) rename {docs2 => resources}/Phaser Logo/Pixel Art/phaser_pixel_large_shaded.png (100%) rename {docs2 => resources}/Phaser Logo/Pixel Art/phaser_pixel_medium_flat.png (100%) rename {docs2 => resources}/Phaser Logo/Pixel Art/phaser_pixel_medium_shaded.png (100%) rename {docs2 => resources}/Phaser Logo/Pixel Art/phaser_pixel_small_flat.png (100%) rename {docs2 => resources}/Phaser Logo/Vector/Phaser Logo.eps (100%) rename {docs2 => resources}/Phaser Logo/Vector/Phaser Logo.fla (100%) rename {docs2 => resources}/Screen Shots/phaser-cybernoid.png (100%) rename {docs2 => resources}/Screen Shots/phaser_balls.png (100%) rename {docs2 => resources}/Screen Shots/phaser_blaster.png (100%) rename {docs2 => resources}/Screen Shots/phaser_cams.png (100%) rename {docs2 => resources}/Screen Shots/phaser_desert.png (100%) rename {docs2 => resources}/Screen Shots/phaser_fixed_camera.png (100%) rename {docs2 => resources}/Screen Shots/phaser_fruit.png (100%) rename {docs2 => resources}/Screen Shots/phaser_fruit_particles.png (100%) rename {docs2 => resources}/Screen Shots/phaser_mapdraw.png (100%) rename {docs2 => resources}/Screen Shots/phaser_mario_combo.png (100%) rename {docs2 => resources}/Screen Shots/phaser_particles.png (100%) rename {docs2 => resources}/Screen Shots/phaser_platformer.png (100%) rename {docs2 => resources}/Screen Shots/phaser_quadtree.png (100%) rename {docs2 => resources}/Screen Shots/phaser_rotate4.png (100%) rename {docs2 => resources}/Screen Shots/phaser_scrollfactor.png (100%) rename {docs2 => resources}/Screen Shots/phaser_sprite_bounds.png (100%) rename {docs2 => resources}/Screen Shots/phaser_tanks.png (100%) rename {docs2 => resources}/Screen Shots/phaser_tilemap.png (100%) rename {docs2 => resources}/Screen Shots/phaser_tilemap_collision.png (100%) rename {docs2 => resources}/Screen Shots/phaser_tilemap_debug.png (100%) rename {docs2/WIP => resources/wip}/01_phaser-arcade.jpg (100%) rename {docs2/WIP => resources/wip}/02_phaser-newsletter.jpg (100%) rename {docs2/WIP => resources/wip}/Physics Comparison.xlsx (100%) rename {docs2/WIP => resources/wip}/phaser-manual_2013-08-27.pdf (100%) rename {docs2/WIP => resources/wip}/phaser_copy.doc (100%) rename {docs2/WIP => resources/wip}/phaser_onscreen-controls_1-arcade.png (100%) rename {docs2/WIP => resources/wip}/phaser_onscreen-controls_2-dpad.png (100%) rename {docs2/WIP => resources/wip}/phaser_onscreen-controls_3-generic.png (100%) rename {docs2/Resources => resources/wip/sprites}/avoid-digits.png (100%) rename {docs2/Resources => resources/wip/sprites}/avoid-panel.png (100%) rename {docs2/Resources => resources/wip/sprites}/avoid-sheet.png (100%) rename {docs2/Resources => resources/wip/sprites}/avoidmock4x2.png (100%) rename {docs2/Resources => resources/wip/sprites}/box-01.png (100%) rename {docs2/Resources => resources/wip/sprites}/box-02.png (100%) rename {docs2/Resources => resources/wip/sprites}/breakout2c.png (100%) rename {docs2/Resources => resources/wip/sprites}/phaser checkboxes.gif (100%) rename {docs2/Resources => resources/wip/sprites}/phaser power tools.gif (100%) rename {docs2/Resources => resources/wip/sprites}/phaser sprites10.gif (100%) rename {docs2 => resources}/zwoptex-phaser.template (100%) delete mode 100644 wip/physics/AdvancedPhysics.js delete mode 100644 wip/physics/AdvancedPhysics.ts delete mode 100644 wip/physics/ArcadePhysics.js delete mode 100644 wip/physics/ArcadePhysics.ts delete mode 100644 wip/physics/Body.js delete mode 100644 wip/physics/Body.ts delete mode 100644 wip/physics/BodyUtils.ts delete mode 100644 wip/physics/Bounds.js delete mode 100644 wip/physics/Bounds.ts delete mode 100644 wip/physics/Collision.js delete mode 100644 wip/physics/Collision.ts delete mode 100644 wip/physics/Contact.js delete mode 100644 wip/physics/Contact.ts delete mode 100644 wip/physics/ContactSolver.js delete mode 100644 wip/physics/ContactSolver.ts delete mode 100644 wip/physics/Manager.js delete mode 100644 wip/physics/Manager.ts delete mode 100644 wip/physics/Plane.js delete mode 100644 wip/physics/Plane.ts delete mode 100644 wip/physics/Space.js delete mode 100644 wip/physics/Space.ts delete mode 100644 wip/physics/Transform.js delete mode 100644 wip/physics/Transform.ts delete mode 100644 wip/physics/TransformUtils.js delete mode 100644 wip/physics/TransformUtils.ts delete mode 100644 wip/physics/joints/IJoint.js delete mode 100644 wip/physics/joints/IJoint.js.map delete mode 100644 wip/physics/joints/IJoint.ts delete mode 100644 wip/physics/joints/Joint.js delete mode 100644 wip/physics/joints/Joint.js.map delete mode 100644 wip/physics/joints/Joint.ts delete mode 100644 wip/physics/shapes/Box.js delete mode 100644 wip/physics/shapes/Box.js.map delete mode 100644 wip/physics/shapes/Box.ts delete mode 100644 wip/physics/shapes/Circle.js delete mode 100644 wip/physics/shapes/Circle.js.map delete mode 100644 wip/physics/shapes/Circle.ts delete mode 100644 wip/physics/shapes/IShape.js delete mode 100644 wip/physics/shapes/IShape.js.map delete mode 100644 wip/physics/shapes/IShape.ts delete mode 100644 wip/physics/shapes/Poly.js delete mode 100644 wip/physics/shapes/Poly.js.map delete mode 100644 wip/physics/shapes/Poly.ts delete mode 100644 wip/physics/shapes/Segment.js delete mode 100644 wip/physics/shapes/Segment.js.map delete mode 100644 wip/physics/shapes/Segment.ts delete mode 100644 wip/physics/shapes/Shape.js delete mode 100644 wip/physics/shapes/Shape.js.map delete mode 100644 wip/physics/shapes/Shape.ts delete mode 100644 wip/physics/shapes/Triangle.js delete mode 100644 wip/physics/shapes/Triangle.js.map delete mode 100644 wip/physics/shapes/Triangle.ts diff --git a/docs2/out/Animation.js.html b/docs/Animation.js.html similarity index 96% rename from docs2/out/Animation.js.html rename to docs/Animation.js.html index 10581936..9e79967b 100644 --- a/docs2/out/Animation.js.html +++ b/docs/Animation.js.html @@ -382,6 +382,11 @@ Phaser.Animation = function (game, parent, name, frameData, frames, delay, loope */ this.looped = looped; + /** + * @property {boolean} looped - The loop state of the Animation. + */ + this.killOnComplete = false; + /** * @property {boolean} isFinished - The finished state of the Animation. Set to true once playback completes, false during playback. * @default @@ -443,10 +448,11 @@ Phaser.Animation.prototype = { * @method Phaser.Animation#play * @memberof Phaser.Animation * @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used. - * @param {boolean} [loop=null] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed. * @return {Phaser.Animation} - A reference to this Animation instance. */ - play: function (frameRate, loop) { + play: function (frameRate, loop, killOnComplete) { if (typeof frameRate === 'number') { @@ -460,6 +466,12 @@ Phaser.Animation.prototype = { this.looped = loop; } + if (typeof killOnComplete !== 'undefined') + { + // Remove the parent sprite once the animation has finished? + this.killOnComplete = killOnComplete; + } + this.isPlaying = true; this.isFinished = false; @@ -621,6 +633,11 @@ Phaser.Animation.prototype = { this._parent.events.onAnimationComplete.dispatch(this._parent, this); } + if (this.killOnComplete) + { + this._parent.kill(); + } + } }; @@ -765,7 +782,7 @@ Phaser.Animation.generateFrameNames = function (prefix, min, max, suffix, zeroPa Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/AnimationManager.js.html b/docs/AnimationManager.js.html similarity index 92% rename from docs2/out/AnimationManager.js.html rename to docs/AnimationManager.js.html index 2bc72698..e6f07a55 100644 --- a/docs2/out/AnimationManager.js.html +++ b/docs/AnimationManager.js.html @@ -359,6 +359,12 @@ Phaser.AnimationManager = function (sprite) { */ this.updateIfVisible = true; + /** + * @property {boolean} isLoaded - Set to true once animation data has been loaded. + * @default + */ + this.isLoaded = false; + /** * @property {Phaser.FrameData} _frameData - A temp. var for holding the currently playing Animations FrameData. * @private @@ -394,6 +400,7 @@ Phaser.AnimationManager.prototype = { this._frameData = frameData; this.frame = 0; + this.isLoaded = true; }, @@ -420,7 +427,19 @@ Phaser.AnimationManager.prototype = { frameRate = frameRate || 60; if (typeof loop === 'undefined') { loop = false; } - if (typeof useNumericIndex === 'undefined') { useNumericIndex = true; } + + // If they didn't set the useNumericIndex then let's at least try and guess it + if (typeof useNumericIndex === 'undefined') + { + if (frames && typeof frames[0] === 'number') + { + useNumericIndex = true; + } + else + { + useNumericIndex = false; + } + } // Create the signals the AnimationManager will emit if (this.sprite.events.onAnimationStart == null) @@ -484,10 +503,11 @@ Phaser.AnimationManager.prototype = { * @method Phaser.AnimationManager#play * @param {string} name - The name of the animation to be played, e.g. "fire", "walk", "jump". * @param {number} [frameRate=null] - The framerate to play the animation at. The speed is given in frames per second. If not provided the previously set frameRate of the Animation is used. - * @param {boolean} [loop=null] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [loop=false] - Should the animation be looped after playback. If not provided the previously set loop value of the Animation is used. + * @param {boolean} [killOnComplete=false] - If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed. * @return {Phaser.Animation} A reference to playing Animation instance. */ - play: function (name, frameRate, loop) { + play: function (name, frameRate, loop, killOnComplete) { if (this._anims[name]) { @@ -495,13 +515,13 @@ Phaser.AnimationManager.prototype = { { if (this.currentAnim.isPlaying == false) { - return this.currentAnim.play(frameRate, loop); + return this.currentAnim.play(frameRate, loop, killOnComplete); } } else { this.currentAnim = this._anims[name]; - return this.currentAnim.play(frameRate, loop); + return this.currentAnim.play(frameRate, loop, killOnComplete); } } @@ -562,6 +582,18 @@ Phaser.AnimationManager.prototype = { }, + /** + * Refreshes the current frame data back to the parent Sprite and also resets the texture data. + * + * @method Phaser.AnimationManager#refreshFrame + */ + refreshFrame: function () { + + this.sprite.currentFrame = this.currentFrame; + this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]); + + }, + /** * Destroys all references this AnimationManager contains. Sets the _anims to a new object and nulls the current animation. * @@ -650,7 +682,7 @@ Object.defineProperty(Phaser.AnimationManager.prototype, "frame", { set: function (value) { - if (this._frameData && this._frameData.getFrame(value) !== null) + if (typeof value === 'number' && this._frameData && this._frameData.getFrame(value) !== null) { this.currentFrame = this._frameData.getFrame(value); this._frameIndex = value; @@ -679,7 +711,7 @@ Object.defineProperty(Phaser.AnimationManager.prototype, "frameName", { set: function (value) { - if (this._frameData && this._frameData.getFrameByName(value) !== null) + if (typeof value === 'string' && this._frameData && this._frameData.getFrameByName(value) !== null) { this.currentFrame = this._frameData.getFrameByName(value); this._frameIndex = this.currentFrame.index; @@ -714,7 +746,7 @@ Object.defineProperty(Phaser.AnimationManager.prototype, "frameName", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/AnimationParser.js.html b/docs/AnimationParser.js.html similarity index 99% rename from docs2/out/AnimationParser.js.html rename to docs/AnimationParser.js.html index 7bd92100..ebf468ab 100644 --- a/docs2/out/AnimationParser.js.html +++ b/docs/AnimationParser.js.html @@ -660,7 +660,7 @@ Phaser.AnimationParser = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Cache.js.html b/docs/Cache.js.html similarity index 88% rename from docs2/out/Cache.js.html rename to docs/Cache.js.html index cbdf8a80..07ba77c1 100644 --- a/docs2/out/Cache.js.html +++ b/docs/Cache.js.html @@ -379,6 +379,11 @@ Phaser.Cache = function (game) { */ this._tilemaps = {}; + /** + * @property {object} _tilesets - Tileset key-value container. + * @private + */ + this._tilesets = {}; this.addDefaultImage(); @@ -441,22 +446,44 @@ Phaser.Cache.prototype = { }, + /** + * Add a new tile set in to the cache. + * + * @method Phaser.Cache#addTileset + * @param {string} key - The unique key by which you will reference this object. + * @param {string} url - URL of this tile set file. + * @param {object} data - Extra tile set data. + * @param {number} tileWidth - Width of the sprite sheet. + * @param {number} tileHeight - Height of the sprite sheet. + * @param {number} tileMax - How many tiles stored in the sprite sheet. + * @param {number} [tileMargin=0] - If the tiles have been drawn with a margin, specify the amount here. + * @param {number} [tileSpacing=0] - If the tiles have been drawn with spacing between them, specify the amount here. + */ + addTileset: function (key, url, data, tileWidth, tileHeight, tileMax, tileMargin, tileSpacing) { + + this._tilesets[key] = { url: url, data: data, tileWidth: tileWidth, tileHeight: tileHeight, tileMargin: tileMargin, tileSpacing: tileSpacing }; + + PIXI.BaseTextureCache[key] = new PIXI.BaseTexture(data); + PIXI.TextureCache[key] = new PIXI.Texture(PIXI.BaseTextureCache[key]); + + this._tilesets[key].tileData = Phaser.TilemapParser.tileset(this.game, key, tileWidth, tileHeight, tileMax, tileMargin, tileSpacing); + + }, + /** * Add a new tilemap. * * @method Phaser.Cache#addTilemap * @param {string} key - The unique key by which you will reference this object. * @param {string} url - URL of the tilemap image. - * @param {object} data - Tilemap data. * @param {object} mapData - The tilemap data object. * @param {number} format - The format of the tilemap data. */ - addTilemap: function (key, url, data, mapData, format) { + addTilemap: function (key, url, mapData, format) { - this._tilemaps[key] = { url: url, data: data, spriteSheet: true, mapData: mapData, format: format }; + this._tilemaps[key] = { url: url, data: mapData, format: format }; - PIXI.BaseTextureCache[key] = new PIXI.BaseTexture(data); - PIXI.TextureCache[key] = new PIXI.Texture(PIXI.BaseTextureCache[key]); + this._tilemaps[key].layers = Phaser.TilemapParser.parse(this.game, mapData, format); }, @@ -520,16 +547,31 @@ Phaser.Cache.prototype = { */ addDefaultImage: function () { - this._images['__default'] = { url: null, data: null, spriteSheet: false }; + var img = new Image(); + img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg=="; + + this._images['__default'] = { url: null, data: img, spriteSheet: false }; this._images['__default'].frame = new Phaser.Frame(0, 0, 0, 32, 32, '', ''); - var base = new PIXI.BaseTexture(); - base.width = 32; - base.height = 32; - base.hasLoaded = true; // avoids a hanging event listener + PIXI.BaseTextureCache['__default'] = new PIXI.BaseTexture(img); + PIXI.TextureCache['__default'] = new PIXI.Texture(PIXI.BaseTextureCache['__default']); - PIXI.BaseTextureCache['__default'] = base; - PIXI.TextureCache['__default'] = new PIXI.Texture(base); + }, + + /** + * Add a new text data. + * + * @method Phaser.Cache#addText + * @param {string} key - Asset key for the text data. + * @param {string} url - URL of this text data file. + * @param {object} data - Extra text data. + */ + addText: function (key, url, data) { + + this._text[key] = { + url: url, + data: data + }; }, @@ -641,23 +683,6 @@ Phaser.Cache.prototype = { this._sounds[key].decoded = true; this._sounds[key].isDecoding = false; - }, - - /** - * Add a new text data. - * - * @method Phaser.Cache#addText - * @param {string} key - Asset key for the text data. - * @param {string} url - URL of this text data file. - * @param {object} data - Extra text data. - */ - addText: function (key, url, data) { - - this._text[key] = { - url: url, - data: data - }; - }, /** @@ -712,14 +737,50 @@ Phaser.Cache.prototype = { return null; }, + /** + * Get tile set image data by key. + * + * @method Phaser.Cache#getTileSetImage + * @param {string} key - Asset key of the image you want. + * @return {object} The image data you want. + */ + getTilesetImage: function (key) { + + if (this._tilesets[key]) + { + return this._tilesets[key].data; + } + + return null; + + }, + + /** + * Get tile set image data by key. + * + * @method Phaser.Cache#getTileset + * @param {string} key - Asset key of the image you want. + * @return {Phaser.Tileset} The tileset data. The tileset image is in the data property, the tile data in tileData. + */ + getTileset: function (key) { + + if (this._tilesets[key]) + { + return this._tilesets[key].tileData; + } + + return null; + + }, + /** * Get tilemap data by key. * * @method Phaser.Cache#getTilemap * @param {string} key - Asset key of the tilemap you want. - * @return {Phaser.Tilemap} The tilemap data. The tileset image is in the data property, the map data in mapData. + * @return {Object} The tilemap data. The tileset image is in the data property, the map data in mapData. */ - getTilemap: function (key) { + getTilemapData: function (key) { if (this._tilemaps[key]) { @@ -1077,7 +1138,7 @@ Phaser.Cache.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Camera.js.html b/docs/Camera.js.html similarity index 81% rename from docs2/out/Camera.js.html rename to docs/Camera.js.html index b627c6fc..df9a44e3 100644 --- a/docs2/out/Camera.js.html +++ b/docs/Camera.js.html @@ -340,7 +340,6 @@ * @param {number} width - The width of the view rectangle * @param {number} height - The height of the view rectangle */ - Phaser.Camera = function (game, id, x, y, width, height) { /** @@ -373,6 +372,14 @@ Phaser.Camera = function (game, id, x, y, width, height) { */ this.screenView = new Phaser.Rectangle(x, y, width, height); + /** + * The Camera is bound to this Rectangle and cannot move outside of it. By default it is enabled and set to the size of the World. + * The Rectangle can be located anywhere in the world and updated as often as you like. If you don't wish the Camera to be bound + * at all then set this to null. The values can be anything and are in World coordinates, with 0,0 being the center of the world. + * @property {Phaser.Rectangle} bounds - The Rectangle in which the Camera is bounded. Set to null to allow for movement anywhere. + */ + this.bounds = new Phaser.Rectangle(x, y, width, height); + /** * @property {Phaser.Rectangle} deadzone - Moving inside this Rectangle will not cause camera moving. */ @@ -401,6 +408,8 @@ Phaser.Camera = function (game, id, x, y, width, height) { * @default */ this._edge = 0; + + this.displayObject = null; }; @@ -468,18 +477,28 @@ Phaser.Camera.prototype = { break; } + }, + + /** + * Move the camera focus on a display object instantly. + * @method Phaser.Camera#focusOn + * @param {any} displayObject - The display object to focus the camera on. Must have visible x/y properties. + */ + focusOn: function (displayObject) { + + this.setPosition(Math.round(displayObject.x - this.view.halfWidth), Math.round(displayObject.y - this.view.halfHeight)); + }, /** - * Move the camera focus to a location instantly. + * Move the camera focus on a location instantly. * @method Phaser.Camera#focusOnXY * @param {number} x - X position. * @param {number} y - Y position. */ focusOnXY: function (x, y) { - this.view.x = Math.round(x - this.view.halfWidth); - this.view.y = Math.round(y - this.view.halfHeight); + this.setPosition(Math.round(x - this.view.halfWidth), Math.round(y - this.view.halfHeight)); }, @@ -489,47 +508,70 @@ Phaser.Camera.prototype = { */ update: function () { - // Add dirty flag - - if (this.target !== null) + if (this.target) { - if (this.deadzone) - { - this._edge = this.target.x - this.deadzone.x; - - if (this.view.x > this._edge) - { - this.view.x = this._edge; - } - - this._edge = this.target.x + this.target.width - this.deadzone.x - this.deadzone.width; - - if (this.view.x < this._edge) - { - this.view.x = this._edge; - } - - this._edge = this.target.y - this.deadzone.y; - - if (this.view.y > this._edge) - { - this.view.y = this._edge; - } - - this._edge = this.target.y + this.target.height - this.deadzone.y - this.deadzone.height; - - if (this.view.y < this._edge) - { - this.view.y = this._edge; - } - } - else - { - this.focusOnXY(this.target.x, this.target.y); - } + this.updateTarget(); } - this.checkWorldBounds(); + if (this.bounds) + { + this.checkBounds(); + } + + if (this.view.x !== -this.displayObject.position.x) + { + this.displayObject.position.x = -this.view.x; + } + + if (this.view.y !== -this.displayObject.position.y) + { + this.displayObject.position.y = -this.view.y; + } + + }, + + updateTarget: function () { + + if (this.deadzone) + { + this._edge = this.target.x - this.deadzone.x; + + if (this.view.x > this._edge) + { + this.view.x = this._edge; + } + + this._edge = this.target.x + this.target.width - this.deadzone.x - this.deadzone.width; + + if (this.view.x < this._edge) + { + this.view.x = this._edge; + } + + this._edge = this.target.y - this.deadzone.y; + + if (this.view.y > this._edge) + { + this.view.y = this._edge; + } + + this._edge = this.target.y + this.target.height - this.deadzone.y - this.deadzone.height; + + if (this.view.y < this._edge) + { + this.view.y = this._edge; + } + } + else + { + this.focusOnXY(this.target.x, this.target.y); + } + + }, + + setBoundsToWorld: function () { + + this.bounds.setTo(this.game.world.x, this.game.world.y, this.game.world.width, this.game.world.height); }, @@ -537,34 +579,34 @@ Phaser.Camera.prototype = { * Method called to ensure the camera doesn't venture outside of the game world. * @method Phaser.Camera#checkWorldBounds */ - checkWorldBounds: function () { + checkBounds: function () { this.atLimit.x = false; this.atLimit.y = false; - // Make sure we didn't go outside the cameras worldBounds - if (this.view.x < this.world.bounds.left) + // Make sure we didn't go outside the cameras bounds + if (this.view.x < this.bounds.x) { this.atLimit.x = true; - this.view.x = this.world.bounds.left; + this.view.x = this.bounds.x; } - if (this.view.x > this.world.bounds.right - this.width) + if (this.view.x > this.bounds.right - this.width) { this.atLimit.x = true; - this.view.x = (this.world.bounds.right - this.width) + 1; + this.view.x = (this.bounds.right - this.width) + 1; } - if (this.view.y < this.world.bounds.top) + if (this.view.y < this.bounds.top) { this.atLimit.y = true; - this.view.y = this.world.bounds.top; + this.view.y = this.bounds.top; } - if (this.view.y > this.world.bounds.bottom - this.height) + if (this.view.y > this.bounds.bottom - this.height) { this.atLimit.y = true; - this.view.y = (this.world.bounds.bottom - this.height) + 1; + this.view.y = (this.bounds.bottom - this.height) + 1; } this.view.floor(); @@ -583,7 +625,11 @@ Phaser.Camera.prototype = { this.view.x = x; this.view.y = y; - this.checkWorldBounds(); + + if (this.bounds) + { + this.checkBounds(); + } }, @@ -615,8 +661,13 @@ Object.defineProperty(Phaser.Camera.prototype, "x", { }, set: function (value) { + this.view.x = value; - this.checkWorldBounds(); + + if (this.bounds) + { + this.checkBounds(); + } } }); @@ -633,8 +684,13 @@ Object.defineProperty(Phaser.Camera.prototype, "y", { }, set: function (value) { + this.view.y = value; - this.checkWorldBounds(); + + if (this.bounds) + { + this.checkBounds(); + } } }); @@ -693,7 +749,7 @@ Object.defineProperty(Phaser.Camera.prototype, "height", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Canvas.js.html b/docs/Canvas.js.html similarity index 99% rename from docs2/out/Canvas.js.html rename to docs/Canvas.js.html index 331f0b84..8132f1f0 100644 --- a/docs2/out/Canvas.js.html +++ b/docs/Canvas.js.html @@ -344,6 +344,7 @@ Phaser.Canvas = { * @return {HTMLCanvasElement} The newly created <canvas> tag. */ create: function (width, height) { + width = width || 256; height = height || 256; @@ -597,7 +598,7 @@ Phaser.Canvas = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Circle.js.html b/docs/Circle.js.html similarity index 99% rename from docs2/out/Circle.js.html rename to docs/Circle.js.html index 930cf7fa..e4a6e022 100644 --- a/docs2/out/Circle.js.html +++ b/docs/Circle.js.html @@ -812,7 +812,7 @@ Phaser.Circle.intersectsRectangle = function (c, r) { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Color.js.html b/docs/Color.js.html similarity index 99% rename from docs2/out/Color.js.html rename to docs/Color.js.html index d1472e35..6604f3e7 100644 --- a/docs2/out/Color.js.html +++ b/docs/Color.js.html @@ -669,7 +669,7 @@ Phaser.Color = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Debug.js.html b/docs/Debug.js.html similarity index 94% rename from docs2/out/Debug.js.html rename to docs/Debug.js.html index 70765275..b6aa73f6 100644 --- a/docs2/out/Debug.js.html +++ b/docs/Debug.js.html @@ -399,17 +399,14 @@ Phaser.Utils.Debug.prototype = { return; } - x = x || null; - y = y || null; + if (typeof x !== 'number') { x = 0; } + if (typeof y !== 'number') { y = 0; } + color = color || 'rgb(255,255,255)'; - if (x && y) - { - this.currentX = x; - this.currentY = y; - this.currentColor = color; - } - + this.currentX = x; + this.currentY = y; + this.currentColor = color; this.currentAlpha = this.context.globalAlpha; this.context.save(); @@ -426,6 +423,7 @@ Phaser.Utils.Debug.prototype = { */ stop: function () { + this.context.restore(); this.context.globalAlpha = this.currentAlpha; @@ -621,6 +619,8 @@ Phaser.Utils.Debug.prototype = { this.start(x, y, color); this.line('Camera (' + camera.width + ' x ' + camera.height + ')'); this.line('X: ' + camera.x + ' Y: ' + camera.y); + this.line('Bounds x: ' + camera.bounds.x + ' Y: ' + camera.bounds.y + ' w: ' + camera.bounds.width + ' h: ' + camera.bounds.height); + this.line('View x: ' + camera.view.x + ' Y: ' + camera.view.y + ' w: ' + camera.view.width + ' h: ' + camera.view.height); this.stop(); }, @@ -777,9 +777,9 @@ Phaser.Utils.Debug.prototype = { this.start(x, y, color); this.line('Sprite: ' + ' (' + sprite.width + ' x ' + sprite.height + ') anchor: ' + sprite.anchor.x + ' x ' + sprite.anchor.y); - this.line('x: ' + sprite.x.toFixed(1) + ' y: ' + sprite.y.toFixed(1) + ' rotation: ' + sprite.rotation.toFixed(1)); - this.line('visible: ' + sprite.visible); - this.line('in camera: ' + sprite.inCamera); + this.line('x: ' + sprite.x.toFixed(1) + ' y: ' + sprite.y.toFixed(1)); + this.line('angle: ' + sprite.angle.toFixed(1) + ' rotation: ' + sprite.rotation.toFixed(1)); + this.line('visible: ' + sprite.visible + ' in camera: ' + sprite.inCamera); this.line('body x: ' + sprite.body.x.toFixed(1) + ' y: ' + sprite.body.y.toFixed(1)); // 0 = scaleX @@ -789,7 +789,6 @@ Phaser.Utils.Debug.prototype = { // 4 = scaleY // 5 = translateY - // this.line('id: ' + sprite._id); // this.line('scale x: ' + sprite.worldTransform[0]); // this.line('scale y: ' + sprite.worldTransform[4]); @@ -797,12 +796,13 @@ Phaser.Utils.Debug.prototype = { // this.line('ty: ' + sprite.worldTransform[5]); // this.line('skew x: ' + sprite.worldTransform[3]); // this.line('skew y: ' + sprite.worldTransform[1]); - this.line('dx: ' + sprite.body.deltaX()); - this.line('dy: ' + sprite.body.deltaY()); - this.line('sdx: ' + sprite.deltaX()); - this.line('sdy: ' + sprite.deltaY()); + this.line('deltaX: ' + sprite.body.deltaX()); + this.line('deltaY: ' + sprite.body.deltaY()); + // this.line('sdx: ' + sprite.deltaX()); + // this.line('sdy: ' + sprite.deltaY()); // this.line('inCamera: ' + this.game.renderer.spriteRenderer.inCamera(this.game.camera, sprite)); + this.stop(); }, @@ -832,6 +832,7 @@ Phaser.Utils.Debug.prototype = { this.line('scaleY: ' + sprite.worldTransform[4]); this.line('transX: ' + sprite.worldTransform[2]); this.line('transY: ' + sprite.worldTransform[5]); + this.stop(); }, @@ -861,8 +862,49 @@ Phaser.Utils.Debug.prototype = { this.line('scaleY: ' + sprite.localTransform[4]); this.line('transX: ' + sprite.localTransform[2]); this.line('transY: ' + sprite.localTransform[5]); - this.line('sX: ' + sprite._sx); - this.line('sY: ' + sprite._sy); + this.stop(); + + }, + + renderSpriteCoords: function (sprite, x, y, color) { + + if (this.context == null) + { + return; + } + + color = color || 'rgb(255, 255, 255)'; + + this.start(x, y, color); + + this.line(sprite.name); + this.line('x: ' + sprite.x); + this.line('y: ' + sprite.y); + this.line('local x: ' + sprite.localTransform[2]); + this.line('local y: ' + sprite.localTransform[5]); + this.line('world x: ' + sprite.worldTransform[2]); + this.line('world y: ' + sprite.worldTransform[5]); + + this.stop(); + + }, + + renderGroupInfo: function (group, x, y, color) { + + if (this.context == null) + { + return; + } + + color = color || 'rgb(255, 255, 255)'; + + this.start(x, y, color); + + this.line('Group (size: ' + group.length + ')'); + this.line('x: ' + group.x); + this.line('y: ' + group.y); + + this.stop(); }, @@ -907,8 +949,7 @@ Phaser.Utils.Debug.prototype = { this.start(0, 0, color); this.context.fillStyle = color; - // this.context.fillRect(sprite.body.x - sprite.body.deltaX(), sprite.body.y - sprite.body.deltaY(), sprite.body.width, sprite.body.height); - this.context.fillRect(sprite.body.x, sprite.body.y, sprite.body.width, sprite.body.height); + this.context.fillRect(sprite.body.screenX, sprite.body.screenY, sprite.body.width, sprite.body.height); this.stop(); @@ -1171,7 +1212,7 @@ Phaser.Utils.Debug.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Device.js.html b/docs/Device.js.html similarity index 98% rename from docs2/out/Device.js.html rename to docs/Device.js.html index d098e87b..87b2e6e7 100644 --- a/docs2/out/Device.js.html +++ b/docs/Device.js.html @@ -646,8 +646,7 @@ Phaser.Device.prototype = { this.file = !!window['File'] && !!window['FileReader'] && !!window['FileList'] && !!window['Blob']; this.fileSystem = !!window['requestFileSystem']; - this.webGL = ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(); - // this.webGL = !!window['WebGLRenderingContext']; + this.webGL = ( function () { try { var canvas = document.createElement( 'canvas' ); return !! window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); this.worker = !!window['Worker']; if ('ontouchstart' in document.documentElement || window.navigator.msPointerEnabled) { @@ -876,7 +875,7 @@ Phaser.Device.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Easing.js.html b/docs/Easing.js.html similarity index 99% rename from docs2/out/Easing.js.html rename to docs/Easing.js.html index 4f6714d1..d4c4e4b6 100644 --- a/docs2/out/Easing.js.html +++ b/docs/Easing.js.html @@ -903,7 +903,7 @@ Phaser.Easing = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Emitter.js.html b/docs/Emitter.js.html similarity index 99% rename from docs2/out/Emitter.js.html rename to docs/Emitter.js.html index 58892cf8..27495dba 100644 --- a/docs2/out/Emitter.js.html +++ b/docs/Emitter.js.html @@ -1017,7 +1017,7 @@ Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype, "bottom", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Frame.js.html b/docs/Frame.js.html similarity index 99% rename from docs2/out/Frame.js.html rename to docs/Frame.js.html index 50966e30..2eb620b6 100644 --- a/docs2/out/Frame.js.html +++ b/docs/Frame.js.html @@ -502,7 +502,7 @@ Phaser.Frame.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/FrameData.js.html b/docs/FrameData.js.html similarity index 98% rename from docs2/out/FrameData.js.html rename to docs/FrameData.js.html index 7651fbad..28919f5e 100644 --- a/docs2/out/FrameData.js.html +++ b/docs/FrameData.js.html @@ -383,7 +383,7 @@ Phaser.FrameData.prototype = { */ getFrame: function (index) { - if (this._frames[index]) + if (this._frames.length > index) { return this._frames[index]; } @@ -532,7 +532,10 @@ Phaser.FrameData.prototype = { } else { - output.push(this.getFrameByName(frames[i]).index); + if (this.getFrameByName(frames[i])) + { + output.push(this.getFrameByName(frames[i]).index); + } } } } @@ -576,7 +579,7 @@ Object.defineProperty(Phaser.FrameData.prototype, "total", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Game.js.html b/docs/Game.js.html similarity index 99% rename from docs2/out/Game.js.html rename to docs/Game.js.html index e1d8aa56..d0dc6451 100644 --- a/docs2/out/Game.js.html +++ b/docs/Game.js.html @@ -352,8 +352,9 @@ Phaser.Game = function (width, height, renderer, parent, state, transparent, ant renderer = renderer || Phaser.AUTO; parent = parent || ''; state = state || null; + if (typeof transparent == 'undefined') { transparent = false; } - if (typeof antialias == 'undefined') { antialias = false; } + if (typeof antialias == 'undefined') { antialias = true; } /** * @property {number} id - Phaser Game ID (for when Pixi supports multiple instances). @@ -620,14 +621,14 @@ Phaser.Game.prototype = { this.net = new Phaser.Net(this); this.debug = new Phaser.Utils.Debug(this); - this.load.onLoadComplete.add(this.loadComplete, this); - this.stage.boot(); this.world.boot(); this.input.boot(); this.sound.boot(); this.state.boot(); + this.load.onLoadComplete.add(this.loadComplete, this); + if (this.renderType == Phaser.CANVAS) { console.log('%cPhaser ' + Phaser.VERSION + ' initialized. Rendering to Canvas', 'color: #ffff33; background: #000000'); @@ -796,6 +797,9 @@ Object.defineProperty(Phaser.Game.prototype, "paused", { }); +/** +* "Deleted code is debugged code." - Jeff Sickel +*/ @@ -817,7 +821,7 @@ Object.defineProperty(Phaser.Game.prototype, "paused", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Group.js.html b/docs/Group.js.html similarity index 94% rename from docs2/out/Group.js.html rename to docs/Group.js.html index a291b5a3..a351026c 100644 --- a/docs2/out/Group.js.html +++ b/docs/Group.js.html @@ -335,13 +335,16 @@ * @param {Phaser.Game} game - A reference to the currently running game. * @param {*} parent - The parent Group or DisplayObjectContainer that will hold this group, if any. * @param {string} [name=group] - A name for this Group. Not used internally but useful for debugging. -* @param {boolean} [useStage=false] - Only the root World Group should use this value. +* @param {boolean} [useStage=false] - Should the DisplayObjectContainer this Group creates be added to the World (default, false) or direct to the Stage (true). */ Phaser.Group = function (game, parent, name, useStage) { - parent = parent || null; + if (typeof parent === 'undefined') + { + parent = game.world; + } - if (typeof useStage == 'undefined') + if (typeof useStage === 'undefined') { useStage = false; } @@ -393,7 +396,12 @@ Phaser.Group = function (game, parent, name, useStage) { * @default */ this.exists = true; - + + /** + * @property {Phaser.Point} scale - Replaces the PIXI.Point with a slightly more flexible one. + */ + this.scale = new Phaser.Point(1, 1); + }; Phaser.Group.prototype = { @@ -477,7 +485,7 @@ Phaser.Group.prototype = { * @param {number} y - The y coordinate to display the newly created Sprite at. The value is in relation to the Group.y point. * @param {string} key - The Game.cache key of the image that this Sprite will use. * @param {number|string} [frame] - If the Sprite image contains multiple frames you can specify which one to use here. - * @param {boolean} [exists] - The default exists state of the Sprite. + * @param {boolean} [exists=true] - The default exists state of the Sprite. * @return {Phaser.Sprite} The child that was created. */ create: function (x, y, key, frame, exists) { @@ -488,6 +496,8 @@ Phaser.Group.prototype = { child.group = this; child.exists = exists; + child.visible = exists; + child.alive = exists; if (child.events) { @@ -500,6 +510,40 @@ Phaser.Group.prototype = { }, + /** + * Automatically creates multiple Phaser.Sprite objects and adds them to the top of this Group. + * Useful if you need to quickly generate a pool of identical sprites, such as bullets. By default the sprites will be set to not exist + * and will be positioned at 0, 0 (relative to the Group.x/y) + * + * @method Phaser.Group#createMultiple + * @param {number} quantity - The number of Sprites to create. + * @param {string} key - The Game.cache key of the image that this Sprite will use. + * @param {number|string} [frame] - If the Sprite image contains multiple frames you can specify which one to use here. + * @param {boolean} [exists=false] - The default exists state of the Sprite. + */ + createMultiple: function (quantity, key, frame, exists) { + + if (typeof exists == 'undefined') { exists = false; } + + for (var i = 0; i < quantity; i++) + { + var child = new Phaser.Sprite(this.game, 0, 0, key, frame); + + child.group = this; + child.exists = exists; + child.visible = exists; + child.alive = exists; + + if (child.events) + { + child.events.onAddedToGroup.dispatch(child, this); + } + + this._container.addChild(child); + } + + }, + /** * Swaps the position of two children in this Group. * @@ -1125,7 +1169,7 @@ Phaser.Group.prototype = { */ countLiving: function () { - var total = -1; + var total = 0; if (this._container.children.length > 0 && this._container.first._iNext) { @@ -1142,6 +1186,10 @@ Phaser.Group.prototype = { } while (currentNode != this._container.last._iNext); } + else + { + total = -1; + } return total; @@ -1155,7 +1203,7 @@ Phaser.Group.prototype = { */ countDead: function () { - var total = -1; + var total = 0; if (this._container.children.length > 0 && this._container.first._iNext) { @@ -1172,6 +1220,10 @@ Phaser.Group.prototype = { } while (currentNode != this._container.last._iNext); } + else + { + total = -1; + } return total; @@ -1207,8 +1259,13 @@ Phaser.Group.prototype = { */ remove: function (child) { - child.events.onRemovedFromGroup.dispatch(child, this); + if (child.events) + { + child.events.onRemovedFromGroup.dispatch(child, this); + } + this._container.removeChild(child); + child.group = null; }, @@ -1377,6 +1434,19 @@ Phaser.Group.prototype = { }; +/** +* @name Phaser.Group#total +* @property {number} total - The total number of children in this Group, regardless of their alive state. +* @readonly +*/ +Object.defineProperty(Phaser.Group.prototype, "total", { + + get: function () { + return this._container.children.length; + } + +}); + /** * @name Phaser.Group#length * @property {number} length - The number of children in this Group. @@ -1476,6 +1546,22 @@ Object.defineProperty(Phaser.Group.prototype, "visible", { this._container.visible = value; } +}); + +/** +* @name Phaser.Group#alpha +* @property {number} alpha - The alpha value of the Group container. +*/ +Object.defineProperty(Phaser.Group.prototype, "alpha", { + + get: function () { + return this._container.alpha; + }, + + set: function (value) { + this._container.alpha = value; + } + }); @@ -1498,7 +1584,7 @@ Object.defineProperty(Phaser.Group.prototype, "visible", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Input.js.html b/docs/Input.js.html similarity index 99% rename from docs2/out/Input.js.html rename to docs/Input.js.html index 396c2a03..0b479b45 100644 --- a/docs2/out/Input.js.html +++ b/docs/Input.js.html @@ -1163,7 +1163,7 @@ Object.defineProperty(Phaser.Input.prototype, "worldY", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/InputHandler.js.html b/docs/InputHandler.js.html similarity index 99% rename from docs2/out/InputHandler.js.html rename to docs/InputHandler.js.html index 73c3b1f4..f83af112 100644 --- a/docs2/out/InputHandler.js.html +++ b/docs/InputHandler.js.html @@ -1050,8 +1050,8 @@ Phaser.InputHandler.prototype = { if (this.snapOnDrag) { - this.sprite.x = Math.floor(this.sprite.x / this.snapX) * this.snapX; - this.sprite.y = Math.floor(this.sprite.y / this.snapY) * this.snapY; + this.sprite.x = Math.round(this.sprite.x / this.snapX) * this.snapX; + this.sprite.y = Math.round(this.sprite.y / this.snapY) * this.snapY; } return true; @@ -1264,8 +1264,8 @@ Phaser.InputHandler.prototype = { if (this.snapOnRelease) { - this.sprite.x = Math.floor(this.sprite.x / this.snapX) * this.snapX; - this.sprite.y = Math.floor(this.sprite.y / this.snapY) * this.snapY; + this.sprite.x = Math.round(this.sprite.x / this.snapX) * this.snapX; + this.sprite.y = Math.round(this.sprite.y / this.snapY) * this.snapY; } this.sprite.events.onDragStop.dispatch(this.sprite, pointer); @@ -1394,7 +1394,7 @@ Phaser.InputHandler.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Intro.js.html b/docs/Intro.js.html similarity index 99% rename from docs2/out/Intro.js.html rename to docs/Intro.js.html index 0dc48941..c9eb4020 100644 --- a/docs2/out/Intro.js.html +++ b/docs/Intro.js.html @@ -371,7 +371,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Key.js.html b/docs/Key.js.html similarity index 99% rename from docs2/out/Key.js.html rename to docs/Key.js.html index 95bfed53..606b4622 100644 --- a/docs2/out/Key.js.html +++ b/docs/Key.js.html @@ -513,7 +513,7 @@ Phaser.Key.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Keyboard.js.html b/docs/Keyboard.js.html similarity index 95% rename from docs2/out/Keyboard.js.html rename to docs/Keyboard.js.html index fdde4632..28178681 100644 --- a/docs2/out/Keyboard.js.html +++ b/docs/Keyboard.js.html @@ -446,6 +446,23 @@ Phaser.Keyboard.prototype = { }, + /** + * Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right. + * + * @method Phaser.Keyboard#createCursorKeys + * @return {object} An object containing properties: up, down, left and right. Which can be polled like any other Phaser.Key object. + */ + createCursorKeys: function () { + + return { + up: this.addKey(Phaser.Keyboard.UP), + down: this.addKey(Phaser.Keyboard.DOWN), + left: this.addKey(Phaser.Keyboard.LEFT), + right: this.addKey(Phaser.Keyboard.RIGHT) + } + + }, + /** * Starts the Keyboard event listeners running (keydown and keyup). They are attached to the document.body. * This is called automatically by Phaser.Input and should not normally be invoked directly. @@ -609,8 +626,21 @@ Phaser.Keyboard.prototype = { this._hotkeys[event.keyCode].processKeyUp(event); } - this._keys[event.keyCode].isDown = false; - this._keys[event.keyCode].timeUp = this.game.time.now; + if (this._keys[event.keyCode]) + { + this._keys[event.keyCode].isDown = false; + this._keys[event.keyCode].timeUp = this.game.time.now; + } + else + { + // Not used this key before, so register it + this._keys[event.keyCode] = { + isDown: false, + timeDown: this.game.time.now, + timeUp: this.game.time.now, + duration: 0 + }; + } }, @@ -805,7 +835,7 @@ Phaser.Keyboard.NUM_LOCK = 144; Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/LinkedList.js.html b/docs/LinkedList.js.html similarity index 99% rename from docs2/out/LinkedList.js.html rename to docs/LinkedList.js.html index 3f82b5c7..ea65f1cf 100644 --- a/docs2/out/LinkedList.js.html +++ b/docs/LinkedList.js.html @@ -495,7 +495,7 @@ Phaser.LinkedList.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Loader.js.html b/docs/Loader.js.html similarity index 91% rename from docs2/out/Loader.js.html rename to docs/Loader.js.html index 24bcb861..1bbd6580 100644 --- a/docs2/out/Loader.js.html +++ b/docs/Loader.js.html @@ -574,6 +574,8 @@ Phaser.Loader.prototype = { this.addToFileList('image', key, url); } + return this; + }, /** @@ -593,6 +595,8 @@ Phaser.Loader.prototype = { this.addToFileList('text', key, url); } + return this; + }, /** @@ -603,7 +607,7 @@ Phaser.Loader.prototype = { * @param {string} url - URL of the sheet file. * @param {number} frameWidth - Width of each single frame. * @param {number} frameHeight - Height of each single frame. - * @param {number} frameMax - How many frames in this sprite sheet. + * @param {number} [frameMax=-1] - How many frames in this sprite sheet. If not specified it will divide the whole image into frames. */ spritesheet: function (key, url, frameWidth, frameHeight, frameMax) { @@ -614,6 +618,35 @@ Phaser.Loader.prototype = { this.addToFileList('spritesheet', key, url, { frameWidth: frameWidth, frameHeight: frameHeight, frameMax: frameMax }); } + return this; + + }, + + /** + * Add a new tile set to the loader. These are used in the rendering of tile maps. + * + * @method Phaser.Loader#tileset + * @param {string} key - Unique asset key of the tileset file. + * @param {string} url - URL of the tileset. + * @param {number} tileWidth - Width of each single tile in pixels. + * @param {number} tileHeight - Height of each single tile in pixels. + * @param {number} [tileMax=-1] - How many tiles in this tileset. If not specified it will divide the whole image into tiles. + * @param {number} [tileMargin=0] - If the tiles have been drawn with a margin, specify the amount here. + * @param {number} [tileSpacing=0] - If the tiles have been drawn with spacing between them, specify the amount here. + */ + tileset: function (key, url, tileWidth, tileHeight, tileMax, tileMargin, tileSpacing) { + + if (typeof tileMax === "undefined") { tileMax = -1; } + if (typeof tileMargin === "undefined") { tileMargin = 0; } + if (typeof tileSpacing === "undefined") { tileSpacing = 0; } + + if (this.checkKeyExists(key) === false) + { + this.addToFileList('tileset', key, url, { tileWidth: tileWidth, tileHeight: tileHeight, tileMax: tileMax, tileMargin: tileMargin, tileSpacing: tileSpacing }); + } + + return this; + }, /** @@ -633,6 +666,8 @@ Phaser.Loader.prototype = { this.addToFileList('audio', key, urls, { buffer: null, autoDecode: autoDecode }); } + return this; + }, /** @@ -645,18 +680,25 @@ Phaser.Loader.prototype = { * @param {object} [mapData] - An optional JSON data object (can be given in place of a URL). * @param {string} [format] - The format of the map data. */ - tilemap: function (key, tilesetURL, mapDataURL, mapData, format) { + tilemap: function (key, mapDataURL, mapData, format) { if (typeof mapDataURL === "undefined") { mapDataURL = null; } if (typeof mapData === "undefined") { mapData = null; } if (typeof format === "undefined") { format = Phaser.Tilemap.CSV; } + if (mapDataURL == null && mapData == null) + { + console.warn('Phaser.Loader.tilemap - Both mapDataURL and mapData are null. One must be set.'); + + return this; + } + if (this.checkKeyExists(key) === false) { // A URL to a json/csv file has been given if (mapDataURL) { - this.addToFileList('tilemap', key, tilesetURL, { mapDataURL: mapDataURL, format: format }); + this.addToFileList('tilemap', key, mapDataURL, { format: format }); } else { @@ -667,7 +709,7 @@ Phaser.Loader.prototype = { break; // An xml string or object has been given - case Phaser.Tilemap.JSON: + case Phaser.Tilemap.TILED_JSON: if (typeof mapData === 'string') { @@ -676,11 +718,13 @@ Phaser.Loader.prototype = { break; } - this.addToFileList('tilemap', key, tilesetURL, { mapDataURL: null, mapData: mapData, format: format }); + this.game.cache.addTilemap(key, null, mapData, format); } } + return this; + }, /** @@ -741,6 +785,8 @@ Phaser.Loader.prototype = { } } + return this; + }, /** @@ -753,7 +799,7 @@ Phaser.Loader.prototype = { */ atlasJSONArray: function (key, textureURL, atlasURL, atlasData) { - this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_JSON_ARRAY); + return this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_JSON_ARRAY); }, @@ -767,7 +813,7 @@ Phaser.Loader.prototype = { */ atlasJSONHash: function (key, textureURL, atlasURL, atlasData) { - this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_JSON_HASH); + return this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_JSON_HASH); }, @@ -781,7 +827,7 @@ Phaser.Loader.prototype = { */ atlasXML: function (key, textureURL, atlasURL, atlasData) { - this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_XML_STARLING); + return this.atlas(key, textureURL, atlasURL, atlasData, Phaser.Loader.TEXTURE_ATLAS_XML_STARLING); }, @@ -864,6 +910,8 @@ Phaser.Loader.prototype = { } + return this; + }, /** @@ -939,7 +987,7 @@ Phaser.Loader.prototype = { case 'spritesheet': case 'textureatlas': case 'bitmapfont': - case 'tilemap': + case 'tileset': file.data = new Image(); file.data.name = file.key; file.data.onload = function () { @@ -1002,6 +1050,29 @@ Phaser.Loader.prototype = { break; + case 'tilemap': + this._xhr.open("GET", this.baseURL + file.url, true); + this._xhr.responseType = "text"; + + if (file.format == Phaser.Tilemap.TILED_JSON) + { + this._xhr.onload = function () { + return _this.jsonLoadComplete(file.key); + }; + } + else if (file.format == Phaser.Tilemap.CSV) + { + this._xhr.onload = function () { + return _this.csvLoadComplete(file.key); + }; + } + + this._xhr.onerror = function () { + return _this.dataLoadError(file.key); + }; + this._xhr.send(); + break; + case 'text': this._xhr.open("GET", this.baseURL + file.url, true); this._xhr.responseType = "text"; @@ -1056,7 +1127,7 @@ Phaser.Loader.prototype = { this.onFileError.dispatch(key); - console.warn("Phaser.Loader error loading file: " + key); + console.warn("Phaser.Loader error loading file: " + key + ' from URL ' + this._fileList[key].url); this.nextFile(key, false); @@ -1094,37 +1165,9 @@ Phaser.Loader.prototype = { this.game.cache.addSpriteSheet(file.key, file.url, file.data, file.frameWidth, file.frameHeight, file.frameMax); break; - case 'tilemap': + case 'tileset': - if (file.mapDataURL == null) - { - this.game.cache.addTilemap(file.key, file.url, file.data, file.mapData, file.format); - } - else - { - // Load the JSON or CSV before carrying on with the next file - loadNext = false; - this._xhr.open("GET", this.baseURL + file.mapDataURL, true); - this._xhr.responseType = "text"; - - if (file.format == Phaser.Tilemap.JSON) - { - this._xhr.onload = function () { - return _this.jsonLoadComplete(file.key); - }; - } - else if (file.format == Phaser.Tilemap.CSV) - { - this._xhr.onload = function () { - return _this.csvLoadComplete(file.key); - }; - } - - this._xhr.onerror = function () { - return _this.dataLoadError(file.key); - }; - this._xhr.send(); - } + this.game.cache.addTileset(file.key, file.url, file.data, file.tileWidth, file.tileHeight, file.tileMax, file.tileMargin, file.tileSpacing); break; case 'textureatlas': @@ -1240,7 +1283,7 @@ Phaser.Loader.prototype = { if (file.type == 'tilemap') { - this.game.cache.addTilemap(file.key, file.url, file.data, data, file.format); + this.game.cache.addTilemap(file.key, file.url, data, file.format); } else { @@ -1262,7 +1305,7 @@ Phaser.Loader.prototype = { var data = this._xhr.response; var file = this._fileList[key]; - this.game.cache.addTilemap(file.key, file.url, file.data, data, file.format); + this.game.cache.addTilemap(file.key, file.url, data, file.format); this.nextFile(key, true); @@ -1405,7 +1448,7 @@ Phaser.Loader.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/LoaderParser.js.html b/docs/LoaderParser.js.html similarity index 99% rename from docs2/out/LoaderParser.js.html rename to docs/LoaderParser.js.html index 954aa275..d3378850 100644 --- a/docs2/out/LoaderParser.js.html +++ b/docs/LoaderParser.js.html @@ -424,7 +424,7 @@ Phaser.LoaderParser = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/MSPointer.js.html b/docs/MSPointer.js.html similarity index 99% rename from docs2/out/MSPointer.js.html rename to docs/MSPointer.js.html index b35087e0..86456654 100644 --- a/docs2/out/MSPointer.js.html +++ b/docs/MSPointer.js.html @@ -524,7 +524,7 @@ Phaser.MSPointer.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Math.js.html b/docs/Math.js.html similarity index 97% rename from docs2/out/Math.js.html rename to docs/Math.js.html index 2e64859e..4bc3ca48 100644 --- a/docs2/out/Math.js.html +++ b/docs/Math.js.html @@ -845,16 +845,21 @@ Phaser.Math = { wrap: function (value, min, max) { var range = max - min; + if (range <= 0) { return 0; } + var result = (value - min) % range; + if (result < 0) { result += range; } + return result + min; + }, /** @@ -1005,13 +1010,20 @@ Phaser.Math = { * @return {number} The new angle value, returns the same as the input angle if it was within bounds */ angleLimit: function (angle, min, max) { + var result = angle; - if (angle > max) { + + if (angle > max) + { result = max; - } else if (angle < min) { + } + else if (angle < min) + { result = min; } + return result; + }, /** @@ -1022,16 +1034,23 @@ Phaser.Math = { * @return {number} */ linearInterpolation: function (v, k) { + var m = v.length - 1; var f = m * k; var i = Math.floor(f); - if (k < 0) { + + if (k < 0) + { return this.linear(v[0], v[1], f); } - if (k > 1) { + + if (k > 1) + { return this.linear(v[m], v[m - 1], m - f); } + return this.linear(v[i], v[i + 1 > m ? m : i + 1], f - i); + }, /** @@ -1042,12 +1061,17 @@ Phaser.Math = { * @return {number} */ bezierInterpolation: function (v, k) { + var b = 0; var n = v.length - 1; - for (var i = 0; i <= n; i++) { + + for (var i = 0; i <= n; i++) + { b += Math.pow(1 - k, n - i) * Math.pow(k, i) * v[i] * this.bernstein(n, i); } + return b; + }, /** @@ -1063,20 +1087,31 @@ Phaser.Math = { var f = m * k; var i = Math.floor(f); - if (v[0] === v[m]) { - if (k < 0) { + if (v[0] === v[m]) + { + if (k < 0) + { i = Math.floor(f = m * (1 + k)); } + return this.catmullRom(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i); - } else { - if (k < 0) { + + } + else + { + if (k < 0) + { return v[0] - (this.catmullRom(v[0], v[0], v[1], v[1], -f) - v[0]); } - if (k > 1) { + + if (k > 1) + { return v[m] - (this.catmullRom(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]); } + return this.catmullRom(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i); } + }, /** @@ -1112,8 +1147,11 @@ Phaser.Math = { * @return {number} */ catmullRom: function (p0, p1, p2, p3, t) { + var v0 = (p2 - p0) * 0.5, v1 = (p3 - p1) * 0.5, t2 = t * t, t3 = t * t2; + return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1; + }, /** @@ -1328,6 +1366,21 @@ Phaser.Math = { return x < a ? a : x; }, + + /** + * Checks if two values are within the given tolerance of each other. + * + * @method Phaser.Math#within + * @param {number} a - The first number to check + * @param {number} b - The second number to check + * @param {number} tolerance - The tolerance. Anything equal to or less than this is considered within the range. + * @return {boolean} True if a is <= tolerance of b. + */ + within: function ( a, b, tolerance ) { + + return (Math.abs(a - b) <= tolerance); + + }, /** * Linear mapping from range <a1, a2> to range <b1, b2> @@ -1459,7 +1512,7 @@ Phaser.Math = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Mouse.js.html b/docs/Mouse.js.html similarity index 99% rename from docs2/out/Mouse.js.html rename to docs/Mouse.js.html index 9c2ac90e..9bc49546 100644 --- a/docs2/out/Mouse.js.html +++ b/docs/Mouse.js.html @@ -600,7 +600,7 @@ Phaser.Mouse.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Net.js.html b/docs/Net.js.html similarity index 99% rename from docs2/out/Net.js.html rename to docs/Net.js.html index fdf53fe8..0b179d32 100644 --- a/docs2/out/Net.js.html +++ b/docs/Net.js.html @@ -510,7 +510,7 @@ Phaser.Net.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Particles.js.html b/docs/Particles.js.html similarity index 99% rename from docs2/out/Particles.js.html rename to docs/Particles.js.html index 4b2c691a..32c12ac0 100644 --- a/docs2/out/Particles.js.html +++ b/docs/Particles.js.html @@ -415,7 +415,7 @@ Phaser.Particles.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Animation.html b/docs/Phaser.Animation.html similarity index 92% rename from docs2/out/Phaser.Animation.html rename to docs/Phaser.Animation.html index d2b20340..1e3288db 100644 --- a/docs2/out/Phaser.Animation.html +++ b/docs/Phaser.Animation.html @@ -698,7 +698,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -902,7 +902,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -1004,7 +1004,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -1211,7 +1211,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -1316,7 +1316,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -1421,7 +1421,109 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
+ + + + + + + + + + + + + + + +
+

killOnComplete

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
looped + + +boolean + + + +

The loop state of the Animation.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -1727,7 +1829,7 @@ It is created by the AnimationManager, consists of Animation.Frame objects and b
Source:
@@ -2007,7 +2109,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2076,7 +2178,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2145,7 +2247,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2173,7 +2275,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
-

play(frameRate, loop) → {Phaser.Animation}

+

play(frameRate, loop, killOnComplete) → {Phaser.Animation}

@@ -2285,7 +2387,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat - null + false @@ -2294,6 +2396,45 @@ You could use this function to generate those by doing: Phaser.Animation.generat + + + + killOnComplete + + + + + +boolean + + + + + + + + + <optional>
+ + + + + + + + + + + + false + + + + +

If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed.

+ + + @@ -2322,7 +2463,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2416,7 +2557,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2554,7 +2695,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2623,7 +2764,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat
Source:
@@ -2674,7 +2815,7 @@ You could use this function to generate those by doing: Phaser.Animation.generat Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.AnimationManager.html b/docs/Phaser.AnimationManager.html similarity index 91% rename from docs2/out/Phaser.AnimationManager.html rename to docs/Phaser.AnimationManager.html index 92c33b28..cc33f1bc 100644 --- a/docs2/out/Phaser.AnimationManager.html +++ b/docs/Phaser.AnimationManager.html @@ -662,7 +662,7 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single
Source:
@@ -764,7 +764,7 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single
Source:
@@ -866,7 +866,7 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single
Source:
@@ -968,7 +968,7 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single
Source:
@@ -1079,6 +1079,111 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single +
+ + + +
+ + + +
+

isLoaded

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
isLoaded + + +boolean + + + +

Set to true once animation data has been loaded.

+
+ + + + + + + + + + + + + + + + + + +
Default Value:
+
  • false
+ + + +
Source:
+
+ + + + + + +
@@ -1172,7 +1277,7 @@ Any Game Object such as Phaser.Sprite that supports animation contains a single
Source:
@@ -1666,7 +1771,7 @@ Animations added in this way are played back with the play function.

Source:
@@ -1758,7 +1863,7 @@ Animations added in this way are played back with the play function.

Source:
@@ -1786,7 +1891,7 @@ Animations added in this way are played back with the play function.

-

play(name, frameRate, loop) → {Phaser.Animation}

+

play(name, frameRate, loop, killOnComplete) → {Phaser.Animation}

@@ -1934,7 +2039,7 @@ If the requested animation is already playing this request will be ignored. If y - null + false @@ -1943,6 +2048,45 @@ If the requested animation is already playing this request will be ignored. If y + + + + killOnComplete + + + + + +boolean + + + + + + + + + <optional>
+ + + + + + + + + + + + false + + + + +

If set to true when the animation completes (only happens if loop=false) the parent Sprite will be killed.

+ + + @@ -1971,7 +2115,7 @@ If the requested animation is already playing this request will be ignored. If y
Source:
@@ -2017,6 +2161,75 @@ If the requested animation is already playing this request will be ignored. If y + + + + +
+

refreshFrame()

+ + +
+
+ + +
+

Refreshes the current frame data back to the parent Sprite and also resets the texture data.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + +
@@ -2172,7 +2385,7 @@ The currentAnim property of the AnimationManager is automatically set to the ani
Source:
@@ -2241,7 +2454,7 @@ The currentAnim property of the AnimationManager is automatically set to the ani
Source:
@@ -2437,7 +2650,7 @@ The currentAnim property of the AnimationManager is automatically set to the ani
Source:
@@ -2511,7 +2724,7 @@ The currentAnim property of the AnimationManager is automatically set to the ani Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.AnimationParser.html b/docs/Phaser.AnimationParser.html similarity index 99% rename from docs2/out/Phaser.AnimationParser.html rename to docs/Phaser.AnimationParser.html index 0b069c2f..4e3a2f84 100644 --- a/docs2/out/Phaser.AnimationParser.html +++ b/docs/Phaser.AnimationParser.html @@ -1308,7 +1308,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Cache.html b/docs/Phaser.Cache.html similarity index 87% rename from docs2/out/Phaser.Cache.html rename to docs/Phaser.Cache.html index e3e38b52..475edfe1 100644 --- a/docs2/out/Phaser.Cache.html +++ b/docs/Phaser.Cache.html @@ -659,7 +659,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -842,7 +842,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1006,7 +1006,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1075,7 +1075,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1239,7 +1239,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1380,7 +1380,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1590,7 +1590,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1823,7 +1823,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -1987,7 +1987,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -2197,7 +2197,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -2225,7 +2225,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
-

addTilemap(key, url, data, mapData, format)

+

addTilemap(key, url, mapData, format)

@@ -2311,29 +2311,6 @@ as images, sounds and data files as a result of Loader calls. Cache items use st - - - data - - - - - -object - - - - - - - - - -

Tilemap data.

- - - - mapData @@ -2407,7 +2384,394 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

addTileset(key, url, data, tileWidth, tileHeight, tileMax, tileMargin, tileSpacing)

+ + +
+
+ + +
+

Add a new tile set in to the cache.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
key + + +string + + + + + + + + + + + +

The unique key by which you will reference this object.

url + + +string + + + + + + + + + + + +

URL of this tile set file.

data + + +object + + + + + + + + + + + +

Extra tile set data.

tileWidth + + +number + + + + + + + + + + + +

Width of the sprite sheet.

tileHeight + + +number + + + + + + + + + + + +

Height of the sprite sheet.

tileMax + + +number + + + + + + + + + + + +

How many tiles stored in the sprite sheet.

tileMargin + + +number + + + + + + <optional>
+ + + + + +
+ + 0 + +

If the tiles have been drawn with a margin, specify the amount here.

tileSpacing + + +number + + + + + + <optional>
+ + + + + +
+ + 0 + +

If the tiles have been drawn with spacing between them, specify the amount here.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -2525,7 +2889,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -2689,7 +3053,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -2758,7 +3122,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -2876,7 +3240,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3017,7 +3381,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3158,7 +3522,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3299,7 +3663,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3440,7 +3804,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3581,7 +3945,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3673,7 +4037,7 @@ as images, sounds and data files as a result of Loader calls. Cache items use st
Source:
@@ -3815,7 +4179,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -3956,7 +4320,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4097,7 +4461,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4189,7 +4553,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4330,7 +4694,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4422,7 +4786,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4563,7 +4927,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4704,7 +5068,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4755,7 +5119,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
-

getTilemap(key) → {Phaser.Tilemap}

+

getTilemap(key) → {Object}

@@ -4845,7 +5209,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -4881,7 +5245,289 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
-Phaser.Tilemap +Object + + +
+
+ + + + + +
+ + + +
+

getTileset(key) → {Phaser.Tileset}

+ + +
+
+ + +
+

Get tile set image data by key.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Asset key of the image you want.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+

The tileset data. The tileset image is in the data property, the tile data in tileData.

+
+ + + +
+
+ Type +
+
+ +Phaser.Tileset + + +
+
+ + + + + +
+ + + +
+

getTileSetImage(key) → {object}

+ + +
+
+ + +
+

Get tile set image data by key.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
key + + +string + + + +

Asset key of the image you want.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+

The image data you want.

+
+ + + +
+
+ Type +
+
+ +object
@@ -4986,7 +5632,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5127,7 +5773,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5268,7 +5914,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5409,7 +6055,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5527,7 +6173,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5645,7 +6291,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5763,7 +6409,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5881,7 +6527,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -5999,7 +6645,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -6117,7 +6763,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys
Source:
@@ -6168,7 +6814,7 @@ Normally you don't call this directly but instead use getImageKeys, getSoundKeys Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Camera.html b/docs/Phaser.Camera.html similarity index 90% rename from docs2/out/Phaser.Camera.html rename to docs/Phaser.Camera.html index 629b1cc2..af7ae150 100644 --- a/docs2/out/Phaser.Camera.html +++ b/docs/Phaser.Camera.html @@ -544,7 +544,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -630,7 +630,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -690,7 +690,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -750,7 +750,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -810,7 +810,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -912,7 +912,115 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
+ + + + + + + +
+ + + +
+ + + +
+

bounds

+ + +
+
+ +
+

The Camera is bound to this Rectangle and cannot move outside of it. By default it is enabled and set to the size of the World. +The Rectangle can be located anywhere in the world and updated as often as you like. If you don't wish the Camera to be bound +at all then set this to null. The values can be anything and are in World coordinates, with 0,0 being the center of the world.

+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
bounds + + +Phaser.Rectangle + + + +

The Rectangle in which the Camera is bounded. Set to null to allow for movement anywhere.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -1014,7 +1122,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1116,7 +1224,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1222,7 +1330,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1327,7 +1435,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1429,7 +1537,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1534,7 +1642,7 @@ The game automatically creates a single Stage sized camera on boot. Move the cam
Source:
@@ -1643,7 +1751,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -1748,7 +1856,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -1854,7 +1962,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -1956,7 +2064,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -2062,7 +2170,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -2168,7 +2276,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -2233,7 +2341,125 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
+ + + + + + + +
+ + + + + + + + + + + + + +
+ + + +
+

focusOn(displayObject)

+ + +
+
+ + +
+

Move the camera focus on a display object instantly.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
displayObject + + +any + + + +

The display object to focus the camera on. Must have visible x/y properties.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -2269,7 +2495,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
-

Move the camera focus to a location instantly.

+

Move the camera focus on a location instantly.

@@ -2374,7 +2600,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -2535,7 +2761,7 @@ Objects outside of this view are not rendered (unless set to ignore the Camera,
Source:
@@ -2677,7 +2903,7 @@ without having to use game.camera.x and game.camera.y.

Source:
@@ -2818,7 +3044,7 @@ without having to use game.camera.x and game.camera.y.

Source:
@@ -2887,7 +3113,7 @@ without having to use game.camera.x and game.camera.y.

Source:
@@ -2938,7 +3164,7 @@ without having to use game.camera.x and game.camera.y.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Canvas.html b/docs/Phaser.Canvas.html similarity index 98% rename from docs2/out/Phaser.Canvas.html rename to docs/Phaser.Canvas.html index 2718c62a..14daba08 100644 --- a/docs2/out/Phaser.Canvas.html +++ b/docs/Phaser.Canvas.html @@ -560,7 +560,7 @@ If no parent is given it will be added as a child of the document.body.

Source:
@@ -865,7 +865,7 @@ If no parent is given it will be added as a child of the document.body.

Source:
@@ -1049,7 +1049,7 @@ If no parent is given it will be added as a child of the document.body.

Source:
@@ -1235,7 +1235,7 @@ If no parent is given it will be added as a child of the document.body.

Source:
@@ -1377,7 +1377,7 @@ Note that if this doesn't given the desired result then see the CanvasUtils.setS
Source:
@@ -1519,7 +1519,7 @@ Note that if this doesn't given the desired result then see the setSmoothingEnab
Source:
@@ -1687,7 +1687,7 @@ patchy on earlier browsers, especially on mobile.

Source:
@@ -1871,7 +1871,7 @@ patchy on earlier browsers, especially on mobile.

Source:
@@ -2150,7 +2150,7 @@ patchy on earlier browsers, especially on mobile.

Source:
@@ -2334,7 +2334,7 @@ patchy on earlier browsers, especially on mobile.

Source:
@@ -2408,7 +2408,7 @@ patchy on earlier browsers, especially on mobile.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Circle.html b/docs/Phaser.Circle.html similarity index 99% rename from docs2/out/Phaser.Circle.html rename to docs/Phaser.Circle.html index eee8dab7..46e4a9eb 100644 --- a/docs2/out/Phaser.Circle.html +++ b/docs/Phaser.Circle.html @@ -4188,7 +4188,7 @@ This method checks the radius distances between the two Circle objects to see if Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Color.html b/docs/Phaser.Color.html similarity index 99% rename from docs2/out/Phaser.Color.html rename to docs/Phaser.Color.html index 98a6f65b..484476f6 100644 --- a/docs2/out/Phaser.Color.html +++ b/docs/Phaser.Color.html @@ -3517,7 +3517,7 @@ RGB format information and HSL information. Each section starts on a newline, 3 Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Device.html b/docs/Phaser.Device.html similarity index 99% rename from docs2/out/Phaser.Device.html rename to docs/Phaser.Device.html index 75999d0f..f3bf6fd1 100644 --- a/docs2/out/Phaser.Device.html +++ b/docs/Phaser.Device.html @@ -4727,7 +4727,7 @@
Source:
@@ -4819,7 +4819,7 @@
Source:
@@ -4893,7 +4893,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Back.html b/docs/Phaser.Easing.Back.html similarity index 99% rename from docs2/out/Phaser.Easing.Back.html rename to docs/Phaser.Easing.Back.html index 2631979f..aea252ef 100644 --- a/docs2/out/Phaser.Easing.Back.html +++ b/docs/Phaser.Easing.Back.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Bounce.html b/docs/Phaser.Easing.Bounce.html similarity index 99% rename from docs2/out/Phaser.Easing.Bounce.html rename to docs/Phaser.Easing.Bounce.html index bcd2ea9f..23715df7 100644 --- a/docs2/out/Phaser.Easing.Bounce.html +++ b/docs/Phaser.Easing.Bounce.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Circular.html b/docs/Phaser.Easing.Circular.html similarity index 99% rename from docs2/out/Phaser.Easing.Circular.html rename to docs/Phaser.Easing.Circular.html index b257f4fe..58fba0c0 100644 --- a/docs2/out/Phaser.Easing.Circular.html +++ b/docs/Phaser.Easing.Circular.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Cubic.html b/docs/Phaser.Easing.Cubic.html similarity index 99% rename from docs2/out/Phaser.Easing.Cubic.html rename to docs/Phaser.Easing.Cubic.html index 26938598..892d2a19 100644 --- a/docs2/out/Phaser.Easing.Cubic.html +++ b/docs/Phaser.Easing.Cubic.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Elastic.html b/docs/Phaser.Easing.Elastic.html similarity index 99% rename from docs2/out/Phaser.Easing.Elastic.html rename to docs/Phaser.Easing.Elastic.html index 874d16c6..a346c298 100644 --- a/docs2/out/Phaser.Easing.Elastic.html +++ b/docs/Phaser.Easing.Elastic.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Exponential.html b/docs/Phaser.Easing.Exponential.html similarity index 99% rename from docs2/out/Phaser.Easing.Exponential.html rename to docs/Phaser.Easing.Exponential.html index cf97a610..6c07b7bf 100644 --- a/docs2/out/Phaser.Easing.Exponential.html +++ b/docs/Phaser.Easing.Exponential.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Linear.html b/docs/Phaser.Easing.Linear.html similarity index 99% rename from docs2/out/Phaser.Easing.Linear.html rename to docs/Phaser.Easing.Linear.html index bec902b2..d9790bea 100644 --- a/docs2/out/Phaser.Easing.Linear.html +++ b/docs/Phaser.Easing.Linear.html @@ -587,7 +587,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Quadratic.html b/docs/Phaser.Easing.Quadratic.html similarity index 99% rename from docs2/out/Phaser.Easing.Quadratic.html rename to docs/Phaser.Easing.Quadratic.html index 762c25e8..b1e44d6f 100644 --- a/docs2/out/Phaser.Easing.Quadratic.html +++ b/docs/Phaser.Easing.Quadratic.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Quartic.html b/docs/Phaser.Easing.Quartic.html similarity index 99% rename from docs2/out/Phaser.Easing.Quartic.html rename to docs/Phaser.Easing.Quartic.html index b5769b92..491b3306 100644 --- a/docs2/out/Phaser.Easing.Quartic.html +++ b/docs/Phaser.Easing.Quartic.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Quintic.html b/docs/Phaser.Easing.Quintic.html similarity index 99% rename from docs2/out/Phaser.Easing.Quintic.html rename to docs/Phaser.Easing.Quintic.html index fe8003c6..64fa5f1f 100644 --- a/docs2/out/Phaser.Easing.Quintic.html +++ b/docs/Phaser.Easing.Quintic.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.Sinusoidal.html b/docs/Phaser.Easing.Sinusoidal.html similarity index 99% rename from docs2/out/Phaser.Easing.Sinusoidal.html rename to docs/Phaser.Easing.Sinusoidal.html index be21a206..61b78478 100644 --- a/docs2/out/Phaser.Easing.Sinusoidal.html +++ b/docs/Phaser.Easing.Sinusoidal.html @@ -869,7 +869,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Easing.html b/docs/Phaser.Easing.html similarity index 99% rename from docs2/out/Phaser.Easing.html rename to docs/Phaser.Easing.html index d3b194c9..9ba392f2 100644 --- a/docs2/out/Phaser.Easing.html +++ b/docs/Phaser.Easing.html @@ -479,7 +479,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:59 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Frame.html b/docs/Phaser.Frame.html similarity index 99% rename from docs2/out/Phaser.Frame.html rename to docs/Phaser.Frame.html index 78174ce0..9f0ca9aa 100644 --- a/docs2/out/Phaser.Frame.html +++ b/docs/Phaser.Frame.html @@ -2854,7 +2854,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:46 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.FrameData.html b/docs/Phaser.FrameData.html similarity index 99% rename from docs2/out/Phaser.FrameData.html rename to docs/Phaser.FrameData.html index f1016736..b64379a2 100644 --- a/docs2/out/Phaser.FrameData.html +++ b/docs/Phaser.FrameData.html @@ -507,7 +507,7 @@
Source:
@@ -1801,7 +1801,7 @@ The frames are returned in the output array, or if none is provided in a new Arr Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Game.html b/docs/Phaser.Game.html similarity index 97% rename from docs2/out/Phaser.Game.html rename to docs/Phaser.Game.html index bfa2b6bc..704bea9a 100644 --- a/docs2/out/Phaser.Game.html +++ b/docs/Phaser.Game.html @@ -701,7 +701,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -803,7 +803,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -908,7 +908,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1013,7 +1013,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1118,7 +1118,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1223,7 +1223,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1328,7 +1328,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1433,7 +1433,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1535,7 +1535,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1637,7 +1637,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1742,7 +1742,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1847,7 +1847,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -1952,7 +1952,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2057,7 +2057,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2162,7 +2162,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2267,7 +2267,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2369,7 +2369,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2474,7 +2474,7 @@ providing quick access to common functions and handling the boot process.

Source:
@@ -2581,7 +2581,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -2686,7 +2686,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -2791,7 +2791,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -2896,7 +2896,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -2998,7 +2998,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3103,7 +3103,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3208,7 +3208,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3313,7 +3313,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3415,7 +3415,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3520,7 +3520,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3622,7 +3622,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3727,7 +3727,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3829,7 +3829,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3934,7 +3934,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -3999,7 +3999,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -4068,7 +4068,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -4137,7 +4137,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -4206,7 +4206,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -4324,7 +4324,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on
Source:
@@ -4375,7 +4375,7 @@ When a game is paused the onPause event is dispatched. When it is resumed the on Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Group.html b/docs/Phaser.Group.html similarity index 89% rename from docs2/out/Phaser.Group.html rename to docs/Phaser.Group.html index d6c1443b..2c75ea5e 100644 --- a/docs2/out/Phaser.Group.html +++ b/docs/Phaser.Group.html @@ -525,7 +525,7 @@ -

Only the root World Group should use this value.

+

Should the DisplayObjectContainer this Group creates be added to the World (default, false) or direct to the Stage (true).

@@ -600,6 +600,108 @@
+
+

alpha

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
alpha + + +number + + + +

The alpha value of the Group container.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + +

angle

@@ -690,7 +792,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -795,7 +897,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -897,7 +999,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -999,7 +1101,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -1101,7 +1203,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -1208,7 +1310,211 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
+ + + + + + + +
+ + + +
+ + + +
+

scale

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
scale + + +Phaser.Point + + + +

Replaces the PIXI.Point with a slightly more flexible one.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + +
+ + + +
+

<readonly> total

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
total + + +number + + + +

The total number of children in this Group, regardless of their alive state.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -1310,7 +1616,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -1412,7 +1718,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -1519,7 +1825,7 @@ This will have no impact on the x/y coordinates of its children, but it will upd
Source:
@@ -1626,7 +1932,7 @@ This will have no impact on the x/y coordinates of its children, but it will upd
Source:
@@ -1742,7 +2048,7 @@ that then see the addAt method.

Source:
@@ -1962,7 +2268,7 @@ Group.addAll('x', 10) will add 10 to the child.x value.

Source:
@@ -2104,7 +2410,7 @@ The child is added to the Group at the location specified by the index value, th
Source:
@@ -2245,7 +2551,7 @@ The child is added to the Group at the location specified by the index value, th
Source:
@@ -2430,7 +2736,7 @@ After the callback parameter you can add as many extra parameters as you like, w
Source:
@@ -2623,7 +2929,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -2692,7 +2998,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -2784,7 +3090,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -2870,6 +3176,8 @@ Useful if you don't need to create the Sprite instances before-hand.

+ Default + Description @@ -2903,6 +3211,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The x coordinate to display the newly created Sprite at. The value is in relation to the Group.x point.

@@ -2934,6 +3246,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The y coordinate to display the newly created Sprite at. The value is in relation to the Group.y point.

@@ -2965,6 +3281,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The Game.cache key of the image that this Sprite will use.

@@ -3001,6 +3321,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

If the Sprite image contains multiple frames you can specify which one to use here.

@@ -3034,6 +3358,12 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + true + + +

The default exists state of the Sprite.

@@ -3067,7 +3397,7 @@ Useful if you don't need to create the Sprite instances before-hand.

Source:
@@ -3113,6 +3443,256 @@ Useful if you don't need to create the Sprite instances before-hand.

+
+ + + +
+

createMultiple(quantity, key, frame, exists)

+ + +
+
+ + +
+

Automatically creates multiple Phaser.Sprite objects and adds them to the top of this Group. +Useful if you need to quickly generate a pool of identical sprites, such as bullets. By default the sprites will be set to not exist +and will be positioned at 0, 0 (relative to the Group.x/y)

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
quantity + + +number + + + + + + + + + + + +

The number of Sprites to create.

key + + +string + + + + + + + + + + + +

The Game.cache key of the image that this Sprite will use.

frame + + +number +| + +string + + + + + + <optional>
+ + + + + +
+ +

If the Sprite image contains multiple frames you can specify which one to use here.

exists + + +boolean + + + + + + <optional>
+ + + + + +
+ + false + +

The default exists state of the Sprite.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + +
@@ -3159,7 +3739,7 @@ Useful if you don't need to create the Sprite instances before-hand.

Source:
@@ -3347,7 +3927,7 @@ Group.divideAll('x', 2) will half the child.x value.

Source:
@@ -3485,7 +4065,7 @@ Group.divideAll('x', 2) will half the child.x value.

Source:
@@ -3651,7 +4231,7 @@ For example: Group.forEach(awardBonusGold, this, true, 100, 500)

Source:
@@ -3794,7 +4374,7 @@ For example: Group.forEachAlive(causeDamage, this, 500)

Source:
@@ -3937,7 +4517,7 @@ For example: Group.forEachDead(bringToLife, this)

Source:
@@ -4055,7 +4635,7 @@ For example: Group.forEachDead(bringToLife, this)

Source:
@@ -4148,7 +4728,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -4241,7 +4821,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -4382,7 +4962,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -4523,7 +5103,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -4687,7 +5267,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -4898,7 +5478,7 @@ Group.multiplyAll('x', 2) will x2 the child.x value.

Source:
@@ -5016,7 +5596,7 @@ Group.multiplyAll('x', 2) will x2 the child.x value.

Source:
@@ -5086,7 +5666,7 @@ The Group container remains on the display list.

Source:
@@ -5227,7 +5807,7 @@ The Group container remains on the display list.

Source:
@@ -5368,7 +5948,7 @@ The Group container remains on the display list.

Source:
@@ -5655,7 +6235,7 @@ The operation parameter controls how the new value is assigned to the property,
Source:
@@ -5898,7 +6478,7 @@ The operation parameter controls how the new value is assigned to the property,
Source:
@@ -6086,7 +6666,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Source:
@@ -6227,7 +6807,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Source:
@@ -6301,7 +6881,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:00 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Input.html b/docs/Phaser.Input.html similarity index 99% rename from docs2/out/Phaser.Input.html rename to docs/Phaser.Input.html index 4db98bf2..8b99dbb3 100644 --- a/docs2/out/Phaser.Input.html +++ b/docs/Phaser.Input.html @@ -7473,7 +7473,7 @@ If you need more then use this to create a new one, up to a maximum of 10.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.InputHandler.html b/docs/Phaser.InputHandler.html similarity index 99% rename from docs2/out/Phaser.InputHandler.html rename to docs/Phaser.InputHandler.html index 3c78611a..d69deb50 100644 --- a/docs2/out/Phaser.InputHandler.html +++ b/docs/Phaser.InputHandler.html @@ -7389,7 +7389,7 @@ This value is only set when the pointer is over this Sprite.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Key.html b/docs/Phaser.Key.html similarity index 99% rename from docs2/out/Phaser.Key.html rename to docs/Phaser.Key.html index d457c4b8..564ecb42 100644 --- a/docs2/out/Phaser.Key.html +++ b/docs/Phaser.Key.html @@ -2436,7 +2436,7 @@ If the key is up it holds the duration of the previous down session.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Keyboard.html b/docs/Phaser.Keyboard.html similarity index 95% rename from docs2/out/Phaser.Keyboard.html rename to docs/Phaser.Keyboard.html index 353ab542..ab37d5cd 100644 --- a/docs2/out/Phaser.Keyboard.html +++ b/docs/Phaser.Keyboard.html @@ -1438,7 +1438,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -1507,7 +1507,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -1530,6 +1530,98 @@ Pass in either a single keycode or an array/hash of keycodes.

+ + + + +
+

createCursorKeys() → {object}

+ + +
+
+ + +
+

Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right.

+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+

An object containing properties: up, down, left and right. Which can be polled like any other Phaser.Key object.

+
+ + + +
+
+ Type +
+
+ +object + + +
+
+ + + + +
@@ -1625,7 +1717,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -1821,7 +1913,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2017,7 +2109,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2158,7 +2250,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2276,7 +2368,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2512,7 +2604,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2581,7 +2673,7 @@ Pass in either a single keycode or an array/hash of keycodes.

Source:
@@ -2651,7 +2743,7 @@ This is called automatically by Phaser.Input and should not normally be invoked
Source:
@@ -2720,7 +2812,7 @@ This is called automatically by Phaser.Input and should not normally be invoked
Source:
@@ -2771,7 +2863,7 @@ This is called automatically by Phaser.Input and should not normally be invoked Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:47 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.LinkedList.html b/docs/Phaser.LinkedList.html similarity index 99% rename from docs2/out/Phaser.LinkedList.html rename to docs/Phaser.LinkedList.html index 05060e49..c67232b5 100644 --- a/docs2/out/Phaser.LinkedList.html +++ b/docs/Phaser.LinkedList.html @@ -1355,7 +1355,7 @@ The function must exist on the member.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Loader.html b/docs/Phaser.Loader.html similarity index 89% rename from docs2/out/Phaser.Loader.html rename to docs/Phaser.Loader.html index c566fd56..000cf34b 100644 --- a/docs2/out/Phaser.Loader.html +++ b/docs/Phaser.Loader.html @@ -2324,7 +2324,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -2488,7 +2488,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -2652,7 +2652,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -2816,7 +2816,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -2980,7 +2980,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -3205,7 +3205,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -3464,7 +3464,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -3582,7 +3582,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -3700,7 +3700,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -3818,7 +3818,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -4100,7 +4100,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -4169,7 +4169,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -4287,7 +4287,7 @@ If you do so the Sprite's width or height will be cropped based on the percentag
Source:
@@ -4559,7 +4559,7 @@ This allows you to easily make loading bars for games.

-

spritesheet(key, url, frameWidth, frameHeight, frameMax)

+

spritesheet(key, url, frameWidth, frameHeight, frameMax)

@@ -4589,8 +4589,12 @@ This allows you to easily make loading bars for games.

Type + Argument + + Default + Description @@ -4614,7 +4618,19 @@ This allows you to easily make loading bars for games.

+ + + + + + + + + + + +

Unique asset key of the sheet file.

@@ -4637,7 +4653,19 @@ This allows you to easily make loading bars for games.

+ + + + + + + + + + + +

URL of the sheet file.

@@ -4660,7 +4688,19 @@ This allows you to easily make loading bars for games.

+ + + + + + + + + + + +

Width of each single frame.

@@ -4683,7 +4723,19 @@ This allows you to easily make loading bars for games.

+ + + + + + + + + + + +

Height of each single frame.

@@ -4706,10 +4758,26 @@ This allows you to easily make loading bars for games.

+ + + <optional>
+ + + + + -

How many frames in this sprite sheet.

+ + + + -1 + + + + +

How many frames in this sprite sheet. If not specified it will divide the whole image into frames.

@@ -4741,7 +4809,7 @@ This allows you to easily make loading bars for games.

Source:
@@ -4810,7 +4878,7 @@ This allows you to easily make loading bars for games.

Source:
@@ -4974,7 +5042,7 @@ This allows you to easily make loading bars for games.

Source:
@@ -5232,7 +5300,363 @@ This allows you to easily make loading bars for games.

Source:
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

tileset(key, url, tileWidth, tileHeight, tileMax, tileMargin, tileSpacing)

+ + +
+
+ + +
+

Add a new tile set to the loader. These are used in the rendering of tile maps.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
key + + +string + + + + + + + + + + + +

Unique asset key of the tileset file.

url + + +string + + + + + + + + + + + +

URL of the tileset.

tileWidth + + +number + + + + + + + + + + + +

Width of each single tile in pixels.

tileHeight + + +number + + + + + + + + + + + +

Height of each single tile in pixels.

tileMax + + +number + + + + + + <optional>
+ + + + + +
+ + -1 + +

How many tiles in this tileset. If not specified it will divide the whole image into tiles.

tileMargin + + +number + + + + + + <optional>
+ + + + + +
+ + 0 + +

If the tiles have been drawn with a margin, specify the amount here.

tileSpacing + + +number + + + + + + <optional>
+ + + + + +
+ + 0 + +

If the tiles have been drawn with spacing between them, specify the amount here.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -5350,7 +5774,7 @@ This allows you to easily make loading bars for games.

Source:
@@ -5401,7 +5825,7 @@ This allows you to easily make loading bars for games.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.LoaderParser.html b/docs/Phaser.LoaderParser.html similarity index 99% rename from docs2/out/Phaser.LoaderParser.html rename to docs/Phaser.LoaderParser.html index 249b200f..ec747435 100644 --- a/docs2/out/Phaser.LoaderParser.html +++ b/docs/Phaser.LoaderParser.html @@ -587,7 +587,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.MSPointer.html b/docs/Phaser.MSPointer.html similarity index 99% rename from docs2/out/Phaser.MSPointer.html rename to docs/Phaser.MSPointer.html index b0be4c20..d3a56e77 100644 --- a/docs2/out/Phaser.MSPointer.html +++ b/docs/Phaser.MSPointer.html @@ -1620,7 +1620,7 @@ It will work only in Internet Explorer 10 and Windows Store or Windows Phone 8 a Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Math.html b/docs/Phaser.Math.html similarity index 97% rename from docs2/out/Phaser.Math.html rename to docs/Phaser.Math.html index b7bac697..499a808e 100644 --- a/docs2/out/Phaser.Math.html +++ b/docs/Phaser.Math.html @@ -765,7 +765,7 @@
Source:
@@ -1017,7 +1017,7 @@
Source:
@@ -1177,7 +1177,7 @@
Source:
@@ -1406,7 +1406,7 @@
Source:
@@ -1566,7 +1566,7 @@
Source:
@@ -1703,7 +1703,7 @@
Source:
@@ -2215,7 +2215,7 @@ Clamp value to range <a, b>

Source:
@@ -2375,7 +2375,7 @@ Clamp value to range <a, b>

Source:
@@ -2463,7 +2463,7 @@ Clamp value to range <a, b>

Source:
@@ -2619,7 +2619,7 @@ Clamp value to range <a, b>

Source:
@@ -2825,7 +2825,7 @@ Clamp value to range <a, b>

Source:
@@ -3035,7 +3035,7 @@ Clamp value to range <a, b>

Source:
@@ -3176,7 +3176,7 @@ Clamp value to range <a, b>

Source:
@@ -4424,7 +4424,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -4977,7 +4977,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -5118,7 +5118,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -5305,7 +5305,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -5465,7 +5465,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -5717,7 +5717,7 @@ Will return null if random selection is missing, or array has no entries.

Source:
@@ -5806,7 +5806,7 @@ See http://jsperf.com/m
Source:
@@ -6082,7 +6082,7 @@ See http://jsperf.com/m
Source:
@@ -6938,7 +6938,7 @@ absolute value the return for exact angle

Source:
@@ -7026,7 +7026,7 @@ absolute value the return for exact angle

Source:
@@ -7511,7 +7511,7 @@ The original stack is modified in the process. This effectively moves the positi
Source:
@@ -7652,7 +7652,7 @@ The original stack is modified in the process. This effectively moves the positi
Source:
@@ -7794,7 +7794,7 @@ The original stack is modified in the process. This effectively moves the positi
Source:
@@ -8004,7 +8004,7 @@ you should get the results via getSinTable() and getCosTable(). This generator i
Source:
@@ -8191,7 +8191,7 @@ you should get the results via getSinTable() and getCosTable(). This generator i
Source:
@@ -8374,7 +8374,7 @@ you should get the results via getSinTable() and getCosTable(). This generator i
Source:
@@ -9368,6 +9368,193 @@ you should get the results via getSinTable() and getCosTable(). This generator i +
+ + + +
+

within(a, b, tolerance) → {boolean}

+ + +
+
+ + +
+

Checks if two values are within the given tolerance of each other.

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
a + + +number + + + +

The first number to check

b + + +number + + + +

The second number to check

tolerance + + +number + + + +

The tolerance. Anything equal to or less than this is considered within the range.

+ + + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + +
Returns:
+ + +
+

True if a is <= tolerance of b.

+
+ + + +
+
+ Type +
+
+ +boolean + + +
+
+ + + + +
@@ -9637,7 +9824,7 @@ Should be called whenever the angle is updated on the Sprite to stop it from goi
Source:
@@ -9825,7 +10012,7 @@ Should be called whenever the angle is updated on the Sprite to stop it from goi
Source:
@@ -9899,7 +10086,7 @@ Should be called whenever the angle is updated on the Sprite to stop it from goi Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:01 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Mouse.html b/docs/Phaser.Mouse.html similarity index 99% rename from docs2/out/Phaser.Mouse.html rename to docs/Phaser.Mouse.html index 59e78675..1527a2b5 100644 --- a/docs2/out/Phaser.Mouse.html +++ b/docs/Phaser.Mouse.html @@ -2166,7 +2166,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Net.html b/docs/Phaser.Net.html similarity index 99% rename from docs2/out/Phaser.Net.html rename to docs/Phaser.Net.html index 2a6eeb0d..368ad77b 100644 --- a/docs2/out/Phaser.Net.html +++ b/docs/Phaser.Net.html @@ -1245,7 +1245,7 @@ Optionally you can redirect to the new url, or just return it as a string.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Particles.Arcade.Emitter.html b/docs/Phaser.Particles.Arcade.Emitter.html similarity index 94% rename from docs2/out/Phaser.Particles.Arcade.Emitter.html rename to docs/Phaser.Particles.Arcade.Emitter.html index ba5e1e19..4851dc76 100644 --- a/docs2/out/Phaser.Particles.Arcade.Emitter.html +++ b/docs/Phaser.Particles.Arcade.Emitter.html @@ -811,7 +811,7 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
@@ -1669,7 +1669,7 @@ Emitter.emitX and Emitter.emitY control the emission location relative to the x/
Source:
@@ -2092,7 +2092,7 @@ Emitter.emitX and Emitter.emitY control the emission location relative to the x/
Source:
@@ -3598,7 +3598,114 @@ This will have no impact on the rotation value of its children, but it will upda
Source:
+ + + + + + + + + + + + + + + +
+

scale

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
scale + + +Phaser.Point + + + +

Replaces the PIXI.Point with a slightly more flexible one.

+
+ + + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
@@ -3709,6 +3816,113 @@ This will have no impact on the rotation value of its children, but it will upda +
+ + + +
+ + + +
+

<readonly> total

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
total + + +number + + + +

The total number of children in this Group, regardless of their alive state.

+
+ + + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
+ + + + + + +
@@ -4548,7 +4762,7 @@ that then see the addAt method.

Source:
@@ -4773,7 +4987,7 @@ Group.addAll('x', 10) will add 10 to the child.x value.

Source:
@@ -4920,7 +5134,7 @@ The child is added to the Group at the location specified by the index value, th
Source:
@@ -5184,7 +5398,7 @@ The child is added to the Group at the location specified by the index value, th
Source:
@@ -5374,7 +5588,7 @@ After the callback parameter you can add as many extra parameters as you like, w
Source:
@@ -5572,7 +5786,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -5646,7 +5860,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -5743,7 +5957,7 @@ After the existsValue parameter you can add as many parameters as you like, whic
Source:
@@ -5829,6 +6043,8 @@ Useful if you don't need to create the Sprite instances before-hand.

+ Default + Description @@ -5862,6 +6078,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The x coordinate to display the newly created Sprite at. The value is in relation to the Group.x point.

@@ -5893,6 +6113,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The y coordinate to display the newly created Sprite at. The value is in relation to the Group.y point.

@@ -5924,6 +6148,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

The Game.cache key of the image that this Sprite will use.

@@ -5960,6 +6188,10 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + +

If the Sprite image contains multiple frames you can specify which one to use here.

@@ -5993,6 +6225,12 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + true + + +

The default exists state of the Sprite.

@@ -6031,7 +6269,7 @@ Useful if you don't need to create the Sprite instances before-hand.

Source:
@@ -6077,6 +6315,261 @@ Useful if you don't need to create the Sprite instances before-hand.

+ + + + +
+

createMultiple(quantity, key, frame, exists)

+ + +
+
+ + +
+

Automatically creates multiple Phaser.Sprite objects and adds them to the top of this Group. +Useful if you need to quickly generate a pool of identical sprites, such as bullets. By default the sprites will be set to not exist +and will be positioned at 0, 0 (relative to the Group.x/y)

+
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeArgumentDefaultDescription
quantity + + +number + + + + + + + + + + + +

The number of Sprites to create.

key + + +string + + + + + + + + + + + +

The Game.cache key of the image that this Sprite will use.

frame + + +number +| + +string + + + + + + <optional>
+ + + + + +
+ +

If the Sprite image contains multiple frames you can specify which one to use here.

exists + + +boolean + + + + + + <optional>
+ + + + + +
+ + false + +

The default exists state of the Sprite.

+ + + + +
+ + + + + + + +
Inherited From:
+
+ + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + + + + +
@@ -6128,7 +6621,7 @@ Useful if you don't need to create the Sprite instances before-hand.

Source:
@@ -6321,7 +6814,7 @@ Group.divideAll('x', 2) will half the child.x value.

Source:
@@ -6464,7 +6957,7 @@ Group.divideAll('x', 2) will half the child.x value.

Source:
@@ -6704,7 +7197,7 @@ For example: Group.forEach(awardBonusGold, this, true, 100, 500)

Source:
@@ -6852,7 +7345,7 @@ For example: Group.forEachAlive(causeDamage, this, 500)

Source:
@@ -7000,7 +7493,7 @@ For example: Group.forEachDead(bringToLife, this)

Source:
@@ -7123,7 +7616,7 @@ For example: Group.forEachDead(bringToLife, this)

Source:
@@ -7221,7 +7714,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -7319,7 +7812,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -7465,7 +7958,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -7611,7 +8104,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -7780,7 +8273,7 @@ This is handy for checking if everything has been wiped out, or choosing a squad
Source:
@@ -8286,7 +8779,7 @@ Group.multiplyAll('x', 2) will x2 the child.x value.

Source:
@@ -8409,7 +8902,7 @@ Group.multiplyAll('x', 2) will x2 the child.x value.

Source:
@@ -8484,7 +8977,7 @@ The Group container remains on the display list.

Source:
@@ -8630,7 +9123,7 @@ The Group container remains on the display list.

Source:
@@ -8776,7 +9269,7 @@ The Group container remains on the display list.

Source:
@@ -9138,7 +9631,7 @@ The operation parameter controls how the new value is assigned to the property,
Source:
@@ -9386,7 +9879,7 @@ The operation parameter controls how the new value is assigned to the property,
Source:
@@ -10330,7 +10823,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Source:
@@ -10476,7 +10969,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Source:
@@ -10619,7 +11112,7 @@ Group.subAll('x', 10) will minus 10 from the child.x value.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Particles.html b/docs/Phaser.Particles.html similarity index 99% rename from docs2/out/Phaser.Particles.html rename to docs/Phaser.Particles.html index bdc6602f..bbe241c6 100644 --- a/docs2/out/Phaser.Particles.html +++ b/docs/Phaser.Particles.html @@ -1036,7 +1036,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:48 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Plugin.html b/docs/Phaser.Plugin.html similarity index 99% rename from docs2/out/Phaser.Plugin.html rename to docs/Phaser.Plugin.html index 23a58ab1..2366b40d 100644 --- a/docs2/out/Phaser.Plugin.html +++ b/docs/Phaser.Plugin.html @@ -1707,7 +1707,7 @@ It is only called if active is set to true.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.PluginManager.html b/docs/Phaser.PluginManager.html similarity index 99% rename from docs2/out/Phaser.PluginManager.html rename to docs/Phaser.PluginManager.html index c4e1f416..f6c39dea 100644 --- a/docs2/out/Phaser.PluginManager.html +++ b/docs/Phaser.PluginManager.html @@ -1337,7 +1337,7 @@ It only calls plugins who have active=true.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Point.html b/docs/Phaser.Point.html similarity index 98% rename from docs2/out/Phaser.Point.html rename to docs/Phaser.Point.html index ecfa3d57..12cb2824 100644 --- a/docs2/out/Phaser.Point.html +++ b/docs/Phaser.Point.html @@ -869,7 +869,7 @@
Source:
@@ -1084,7 +1084,7 @@
Source:
@@ -1299,7 +1299,7 @@
Source:
@@ -1463,7 +1463,7 @@
Source:
@@ -1678,7 +1678,7 @@
Source:
@@ -1934,7 +1934,7 @@
Source:
@@ -2149,7 +2149,7 @@
Source:
@@ -2313,7 +2313,7 @@
Source:
@@ -2477,7 +2477,7 @@
Source:
@@ -2641,7 +2641,7 @@
Source:
@@ -2805,7 +2805,7 @@
Source:
@@ -2958,7 +2958,7 @@
Source:
@@ -3240,7 +3240,7 @@
Source:
@@ -3381,7 +3381,7 @@
Source:
@@ -3565,7 +3565,7 @@
Source:
@@ -3729,7 +3729,7 @@
Source:
@@ -3870,7 +3870,7 @@
Source:
@@ -4126,7 +4126,7 @@
Source:
@@ -4403,7 +4403,7 @@
Source:
@@ -4731,7 +4731,7 @@
Source:
@@ -4823,7 +4823,7 @@
Source:
@@ -4897,7 +4897,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Pointer.html b/docs/Phaser.Pointer.html similarity index 99% rename from docs2/out/Phaser.Pointer.html rename to docs/Phaser.Pointer.html index 3fa406db..7a88f5b7 100644 --- a/docs2/out/Phaser.Pointer.html +++ b/docs/Phaser.Pointer.html @@ -1120,7 +1120,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -3375,7 +3375,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -3481,7 +3481,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -3819,7 +3819,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -3968,7 +3968,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -4105,7 +4105,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -4292,7 +4292,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -4528,7 +4528,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -4597,7 +4597,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Source:
@@ -4740,7 +4740,7 @@ Default size of 44px (Apple's recommended "finger tip" size).

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.QuadTree.html b/docs/Phaser.QuadTree.html similarity index 99% rename from docs2/out/Phaser.QuadTree.html rename to docs/Phaser.QuadTree.html index 671356f3..524130d1 100644 --- a/docs2/out/Phaser.QuadTree.html +++ b/docs/Phaser.QuadTree.html @@ -1206,7 +1206,7 @@ Split the node into 4 subnodes

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:02 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.RandomDataGenerator.html b/docs/Phaser.RandomDataGenerator.html similarity index 98% rename from docs2/out/Phaser.RandomDataGenerator.html rename to docs/Phaser.RandomDataGenerator.html index 2dfefa0a..ff2e4bdc 100644 --- a/docs2/out/Phaser.RandomDataGenerator.html +++ b/docs/Phaser.RandomDataGenerator.html @@ -517,7 +517,7 @@ Random number generator from Source:
@@ -605,7 +605,7 @@ Random number generator from Source:
@@ -693,7 +693,7 @@ Random number generator from Source:
@@ -853,7 +853,7 @@ Random number generator from Source:
@@ -941,7 +941,7 @@ Random number generator from Source:
@@ -1078,7 +1078,7 @@ Random number generator from Source:
@@ -1166,7 +1166,7 @@ Random number generator from Source:
@@ -1326,7 +1326,7 @@ Random number generator from Source:
@@ -1604,7 +1604,7 @@ Random number generator from Source:
@@ -1692,7 +1692,7 @@ Random number generator from Source:
@@ -1829,7 +1829,7 @@ Random number generator from Source:
@@ -1899,7 +1899,7 @@ Random number generator from Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Rectangle.html b/docs/Phaser.Rectangle.html similarity index 99% rename from docs2/out/Phaser.Rectangle.html rename to docs/Phaser.Rectangle.html index ad97a39e..7f14f162 100644 --- a/docs2/out/Phaser.Rectangle.html +++ b/docs/Phaser.Rectangle.html @@ -3777,7 +3777,7 @@ This method compares the x, y, width and height properties of each Rectangle.

-

<static> intersects(a, b, tolerance) → {boolean}

+

<static> intersects(a, b) → {boolean}

@@ -3863,29 +3863,6 @@ This method checks the x, y, width, and height properties of the Rectangles.

- - - - tolerance - - - - - -number - - - - - - - - - -

A tolerance value to allow for an intersection test with padding, default to 0

- - - @@ -4147,7 +4124,7 @@ This method checks the x, y, width, and height properties of the Rectangles.

Source:
@@ -4546,7 +4523,7 @@ This method checks the x, y, width, and height properties of the Rectangles.

Source:
@@ -7238,7 +7215,7 @@ This method checks the x, y, width, and height properties of the Rectangles.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.RequestAnimationFrame.html b/docs/Phaser.RequestAnimationFrame.html similarity index 99% rename from docs2/out/Phaser.RequestAnimationFrame.html rename to docs/Phaser.RequestAnimationFrame.html index 662a17be..1dc5fb53 100644 --- a/docs2/out/Phaser.RequestAnimationFrame.html +++ b/docs/Phaser.RequestAnimationFrame.html @@ -1209,7 +1209,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Signal.html b/docs/Phaser.Signal.html similarity index 99% rename from docs2/out/Phaser.Signal.html rename to docs/Phaser.Signal.html index dc498ed8..e1014a0b 100644 --- a/docs2/out/Phaser.Signal.html +++ b/docs/Phaser.Signal.html @@ -2194,7 +2194,7 @@ already dispatched before.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Sound.html b/docs/Phaser.Sound.html similarity index 99% rename from docs2/out/Phaser.Sound.html rename to docs/Phaser.Sound.html index 5b5f8c1c..0b3a284a 100644 --- a/docs2/out/Phaser.Sound.html +++ b/docs/Phaser.Sound.html @@ -5418,7 +5418,7 @@ This allows you to bundle multiple sounds together into a single audio file and Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.SoundManager.html b/docs/Phaser.SoundManager.html similarity index 99% rename from docs2/out/Phaser.SoundManager.html rename to docs/Phaser.SoundManager.html index 6e62d2b9..475e87b7 100644 --- a/docs2/out/Phaser.SoundManager.html +++ b/docs/Phaser.SoundManager.html @@ -2326,7 +2326,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:49 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Stage.html b/docs/Phaser.Stage.html similarity index 99% rename from docs2/out/Phaser.Stage.html rename to docs/Phaser.Stage.html index ba75184b..5adc7e26 100644 --- a/docs2/out/Phaser.Stage.html +++ b/docs/Phaser.Stage.html @@ -1383,7 +1383,7 @@ focus handling, game resizing, scaling and the pause, boot and orientation scree Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.StageScaleMode.html b/docs/Phaser.StageScaleMode.html similarity index 99% rename from docs2/out/Phaser.StageScaleMode.html rename to docs/Phaser.StageScaleMode.html index 72c3c1eb..afb56453 100644 --- a/docs2/out/Phaser.StageScaleMode.html +++ b/docs/Phaser.StageScaleMode.html @@ -2470,7 +2470,7 @@ If null it will scale to whatever width the browser can handle.

-

pageAlignVeritcally

+

pageAlignVertically

@@ -2509,7 +2509,7 @@ If null it will scale to whatever width the browser can handle.

- pageAlignVeritcally + pageAlignVertically @@ -3720,7 +3720,7 @@ Please note that this needs to be supported by the web browser and isn't the sam Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.State.html b/docs/Phaser.State.html similarity index 99% rename from docs2/out/Phaser.State.html rename to docs/Phaser.State.html index 1885f076..44b1f3a4 100644 --- a/docs2/out/Phaser.State.html +++ b/docs/Phaser.State.html @@ -2474,7 +2474,7 @@ If you need to use the loader, you may need to use them here.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.StateManager.html b/docs/Phaser.StateManager.html similarity index 99% rename from docs2/out/Phaser.StateManager.html rename to docs/Phaser.StateManager.html index 06fbce89..95db2d55 100644 --- a/docs2/out/Phaser.StateManager.html +++ b/docs/Phaser.StateManager.html @@ -3331,7 +3331,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:03 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Time.html b/docs/Phaser.Time.html similarity index 99% rename from docs2/out/Phaser.Time.html rename to docs/Phaser.Time.html index 5f84d403..ef62d104 100644 --- a/docs2/out/Phaser.Time.html +++ b/docs/Phaser.Time.html @@ -2795,7 +2795,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Touch.html b/docs/Phaser.Touch.html similarity index 99% rename from docs2/out/Phaser.Touch.html rename to docs/Phaser.Touch.html index 9250159d..f0030245 100644 --- a/docs2/out/Phaser.Touch.html +++ b/docs/Phaser.Touch.html @@ -2446,7 +2446,7 @@ Doesn't appear to be supported by most browsers on a canvas element yet.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Tween.html b/docs/Phaser.Tween.html similarity index 97% rename from docs2/out/Phaser.Tween.html rename to docs/Phaser.Tween.html index d017c164..43e8bc3b 100644 --- a/docs2/out/Phaser.Tween.html +++ b/docs/Phaser.Tween.html @@ -1060,7 +1060,7 @@ You can pass as many tweens as you like to this function, they will each be chai
Source:
@@ -1201,7 +1201,7 @@ You can pass as many tweens as you like to this function, they will each be chai
Source:
@@ -1342,7 +1342,7 @@ You can pass as many tweens as you like to this function, they will each be chai
Source:
@@ -1483,7 +1483,7 @@ You can pass as many tweens as you like to this function, they will each be chai
Source:
@@ -1534,7 +1534,7 @@ You can pass as many tweens as you like to this function, they will each be chai
-

loop() → {Tween}

+

loop() → {Phaser.Tween}

@@ -1581,7 +1581,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -1617,7 +1617,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
-Tween +Phaser.Tween
@@ -1722,7 +1722,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -1863,7 +1863,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2004,7 +2004,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2096,7 +2096,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2214,7 +2214,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2306,7 +2306,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2424,7 +2424,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2516,7 +2516,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -2936,7 +2936,7 @@ game.add.tween(p).to({ x: 700 }, 1000, Phaser.Easing.Linear.None, true)
Source:
@@ -3078,7 +3078,7 @@ Used in combination with repeat you can create endless loops.

Source:
@@ -3152,7 +3152,7 @@ Used in combination with repeat you can create endless loops.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.TweenManager.html b/docs/Phaser.TweenManager.html similarity index 99% rename from docs2/out/Phaser.TweenManager.html rename to docs/Phaser.TweenManager.html index 5af078a5..19e57da6 100644 --- a/docs2/out/Phaser.TweenManager.html +++ b/docs/Phaser.TweenManager.html @@ -1508,7 +1508,7 @@ Please see https://github.com/sole/tw Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Utils.Debug.html b/docs/Phaser.Utils.Debug.html similarity index 99% rename from docs2/out/Phaser.Utils.Debug.html rename to docs/Phaser.Utils.Debug.html index fc7a472d..efc59fd1 100644 --- a/docs2/out/Phaser.Utils.Debug.html +++ b/docs/Phaser.Utils.Debug.html @@ -1443,7 +1443,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -1686,7 +1686,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -1847,7 +1847,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -2588,7 +2588,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -2780,7 +2780,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -2941,7 +2941,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -3184,7 +3184,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -3325,7 +3325,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -3486,7 +3486,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -3729,7 +3729,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -3890,7 +3890,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -4100,7 +4100,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -4594,7 +4594,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -5334,7 +5334,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -5810,7 +5810,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL
Source:
@@ -5861,7 +5861,7 @@ your game set to use Phaser.AUTO then swap it for Phaser.CANVAS to ensure WebGL Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.Utils.html b/docs/Phaser.Utils.html similarity index 92% rename from docs2/out/Phaser.Utils.html rename to docs/Phaser.Utils.html index 08a0b7a2..29af7947 100644 --- a/docs2/out/Phaser.Utils.html +++ b/docs/Phaser.Utils.html @@ -426,7 +426,7 @@
-

<static> extend() → {object}

+

<static> extend(deep, target) → {object}

@@ -443,6 +443,78 @@ +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
deep + + +boolean + + + +

Perform a deep copy?

target + + +object + + + +

The target object to copy to.

+ +
@@ -467,7 +539,7 @@
Source:
@@ -608,7 +680,7 @@
Source:
@@ -878,7 +950,7 @@ dir = 1 (left), 2 (right), 3 (both)

Source:
@@ -948,7 +1020,7 @@ dir = 1 (left), 2 (right), 3 (both)

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.World.html b/docs/Phaser.World.html similarity index 91% rename from docs2/out/Phaser.World.html rename to docs/Phaser.World.html index de9146f6..51a398a0 100644 --- a/docs2/out/Phaser.World.html +++ b/docs/Phaser.World.html @@ -347,8 +347,7 @@

"This world is but a canvas to our imagination." - Henry David Thoreau

-

<p> -A game has only one world. The world is an abstract place in which all game objects live. It is not bound +

A game has only one world. The world is an abstract place in which all game objects live. It is not bound by stage limits and can be any size. You look into the world via cameras. All game objects live within the world at world-based coordinates. By default a world is created the same size as your Stage.

@@ -482,6 +481,13 @@ the world at world-based coordinates. By default a world is created the same siz
+
+

The World has no fixed size, but it does have a bounds outside of which objects are no longer considered as being "in world" and you should use this to clean-up the display list and purge dead objects. +By default we set the Bounds to be from 0,0 to Game.width,Game.height. I.e. it will match the size given to the game constructor with 0,0 representing the top-left of the display. +However 0,0 is actually the center of the world, and if you rotate or scale the world all of that will happen from 0,0. +So if you want to make a game in which the world itself will rotate you should adjust the bounds so that 0,0 is the center point, i.e. set them to -1000,-1000,2000,2000 for a 2000x2000 sized world centered around 0,0.

+
+ @@ -560,7 +566,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -662,7 +668,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -968,211 +974,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
- - - - - - - -
- - - - - - - -
-

game

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running Game.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

group

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
group - - -Phaser.Group - - - -

Object container stores every object created with create* methods.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
@@ -1478,7 +1280,109 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
+ + + + + + + +
+ + + +
+ + + +
+

scale

+ + +
+
+ + + + + +
+ + +
Properties:
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
scale + + +Phaser.Point + + + +

Replaces the PIXI.Point with a slightly more flexible one.

+
+ + + + + + + + + + + + + + + + + + + + +
Source:
+
@@ -1645,7 +1549,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -1714,7 +1618,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -1811,7 +1715,7 @@ the world at world-based coordinates. By default a world is created the same siz
-

setSize(width, height)

+

setBounds(x, y, width, height)

@@ -1819,7 +1723,8 @@ the world at world-based coordinates. By default a world is created the same siz
-

Updates the size of this world.

+

Updates the size of this world. Note that this doesn't modify the world x/y coordinates, just the width and height. +If you need to adjust the bounds of the world

@@ -1851,6 +1756,52 @@ the world at world-based coordinates. By default a world is created the same siz + + + x + + + + + +number + + + + + + + + + +

Top left most corner of the world.

+ + + + + + + y + + + + + +number + + + + + + + + + +

Top left most corner of the world.

+ + + + width @@ -1924,7 +1875,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -1993,7 +1944,7 @@ the world at world-based coordinates. By default a world is created the same siz
Source:
@@ -2044,7 +1995,7 @@ the world at world-based coordinates. By default a world is created the same siz Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:50 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.html b/docs/Phaser.html similarity index 99% rename from docs2/out/Phaser.html rename to docs/Phaser.html index 37f7c00c..61ee9adf 100644 --- a/docs2/out/Phaser.html +++ b/docs/Phaser.html @@ -555,7 +555,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:45 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Phaser.js.html b/docs/Phaser.js.html similarity index 98% rename from docs2/out/Phaser.js.html rename to docs/Phaser.js.html index fb8766ac..c2f516bb 100644 --- a/docs2/out/Phaser.js.html +++ b/docs/Phaser.js.html @@ -332,7 +332,7 @@ */ var Phaser = Phaser || { - VERSION: '1.0.7-beta', + VERSION: '1.1.0', GAMES: [], AUTO: 0, CANVAS: 1, @@ -383,7 +383,7 @@ PIXI.InteractionManager = function (dummy) { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Plugin.js.html b/docs/Plugin.js.html similarity index 99% rename from docs2/out/Plugin.js.html rename to docs/Plugin.js.html index 25527f23..d781cc54 100644 --- a/docs2/out/Plugin.js.html +++ b/docs/Plugin.js.html @@ -457,7 +457,7 @@ Phaser.Plugin.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/PluginManager.js.html b/docs/PluginManager.js.html similarity index 99% rename from docs2/out/PluginManager.js.html rename to docs/PluginManager.js.html index 35fbc1c0..32e281f1 100644 --- a/docs2/out/PluginManager.js.html +++ b/docs/PluginManager.js.html @@ -574,7 +574,7 @@ Phaser.PluginManager.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Point.js.html b/docs/Point.js.html similarity index 99% rename from docs2/out/Point.js.html rename to docs/Point.js.html index 82b1f646..6c893032 100644 --- a/docs2/out/Point.js.html +++ b/docs/Point.js.html @@ -381,9 +381,11 @@ Phaser.Point.prototype = { * @return {Point} This Point object. Useful for chaining method calls. **/ setTo: function (x, y) { + this.x = x; this.y = y; return this; + }, /** @@ -737,7 +739,7 @@ Phaser.Point.rotate = function (a, x, y, angle, asDegrees, distance) { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Pointer.js.html b/docs/Pointer.js.html similarity index 99% rename from docs2/out/Pointer.js.html rename to docs/Pointer.js.html index 84fd2bcf..f8a4d99f 100644 --- a/docs2/out/Pointer.js.html +++ b/docs/Pointer.js.html @@ -570,7 +570,7 @@ Phaser.Pointer.prototype = { this.identifier = event.identifier; this.target = event.target; - if (event.button) + if (typeof event.button !== 'undefined') { this.button = event.button; } @@ -674,7 +674,7 @@ Phaser.Pointer.prototype = { return; } - if (event.button) + if (typeof event.button !== 'undefined') { this.button = event.button; } @@ -753,8 +753,6 @@ Phaser.Pointer.prototype = { if (this._highestRenderObject == null) { - // console.log("HRO null"); - // The pointer isn't currently over anything, check if we've got a lingering previous target if (this.targetObject) { @@ -1033,7 +1031,7 @@ Object.defineProperty(Phaser.Pointer.prototype, "worldY", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/QuadTree.js.html b/docs/QuadTree.js.html similarity index 99% rename from docs2/out/QuadTree.js.html rename to docs/QuadTree.js.html index c9dcf1a9..715c8d09 100644 --- a/docs2/out/QuadTree.js.html +++ b/docs/QuadTree.js.html @@ -606,7 +606,7 @@ Phaser.QuadTree.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/RandomDataGenerator.js.html b/docs/RandomDataGenerator.js.html similarity index 98% rename from docs2/out/RandomDataGenerator.js.html rename to docs/RandomDataGenerator.js.html index c224b404..75430b32 100644 --- a/docs2/out/RandomDataGenerator.js.html +++ b/docs/RandomDataGenerator.js.html @@ -403,10 +403,12 @@ Phaser.RandomDataGenerator.prototype = { this.s0 = this.hash(' '); this.s1 = this.hash(this.s0); this.s2 = this.hash(this.s1); + this.c = 1; var seed; - for (var i = 0; seed = seeds[i++]; ) { + for (var i = 0; seed = seeds[i++]; ) + { this.s0 -= this.hash(seed); this.s0 += ~~(this.s0 < 0); this.s1 -= this.hash(seed); @@ -492,9 +494,6 @@ Phaser.RandomDataGenerator.prototype = { */ realInRange: function (min, max) { - min = min || 0; - max = max || 0; - return this.frac() * (max - min) + min; }, @@ -589,7 +588,7 @@ Phaser.RandomDataGenerator.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Rectangle.js.html b/docs/Rectangle.js.html similarity index 98% rename from docs2/out/Rectangle.js.html rename to docs/Rectangle.js.html index 2fa30312..658e1ade 100644 --- a/docs2/out/Rectangle.js.html +++ b/docs/Rectangle.js.html @@ -941,14 +941,16 @@ Phaser.Rectangle.intersection = function (a, b, out) { * @method Phaser.Rectangle.intersects * @param {Phaser.Rectangle} a - The first Rectangle object. * @param {Phaser.Rectangle} b - The second Rectangle object. -* @param {number} tolerance - A tolerance value to allow for an intersection test with padding, default to 0 * @return {boolean} A value of true if the specified object intersects with this Rectangle object; otherwise false. */ -Phaser.Rectangle.intersects = function (a, b, tolerance) { +Phaser.Rectangle.intersects = function (a, b) { - tolerance = tolerance || 0; + return (a.x < b.right && b.x < a.right && a.y < b.bottom && b.y < a.bottom); - return !(a.x > b.right + tolerance || a.right < b.x - tolerance || a.y > b.bottom + tolerance || a.bottom < b.y - tolerance); + // return (a.x <= b.right && b.x <= a.right && a.y <= b.bottom && b.y <= a.bottom); + + // return (a.left <= b.right && b.left <= a.right && a.top <= b.bottom && b.top <= a.bottom); + // return !(a.x > b.right + tolerance || a.right < b.x - tolerance || a.y > b.bottom + tolerance || a.bottom < b.y - tolerance); }; @@ -982,7 +984,7 @@ Phaser.Rectangle.union = function (a, b, out) { if (typeof out === "undefined") { out = new Phaser.Rectangle(); } - return out.setTo(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.right, b.right), Math.max(a.bottom, b.bottom)); + return out.setTo(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.right, b.right) - Math.min(a.left, b.left), Math.max(a.bottom, b.bottom) - Math.min(a.top, b.top)); }; @@ -1006,7 +1008,7 @@ Phaser.Rectangle.union = function (a, b, out) { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/RequestAnimationFrame.js.html b/docs/RequestAnimationFrame.js.html similarity index 99% rename from docs2/out/RequestAnimationFrame.js.html rename to docs/RequestAnimationFrame.js.html index 0442a6d6..1c29f775 100644 --- a/docs2/out/RequestAnimationFrame.js.html +++ b/docs/RequestAnimationFrame.js.html @@ -494,7 +494,7 @@ Phaser.RequestAnimationFrame.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Signal.js.html b/docs/Signal.js.html similarity index 99% rename from docs2/out/Signal.js.html rename to docs/Signal.js.html index 2e7088d9..9fbe233d 100644 --- a/docs2/out/Signal.js.html +++ b/docs/Signal.js.html @@ -639,7 +639,7 @@ Phaser.Signal.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/SignalBinding.html b/docs/SignalBinding.html similarity index 99% rename from docs2/out/SignalBinding.html rename to docs/SignalBinding.html index 43738708..c8bb1cf0 100644 --- a/docs2/out/SignalBinding.html +++ b/docs/SignalBinding.html @@ -639,7 +639,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:51 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:52:04 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/SignalBinding.js.html b/docs/SignalBinding.js.html similarity index 99% rename from docs2/out/SignalBinding.js.html rename to docs/SignalBinding.js.html index 09bf658a..2f5557d3 100644 --- a/docs2/out/SignalBinding.js.html +++ b/docs/SignalBinding.js.html @@ -504,7 +504,7 @@ Phaser.SignalBinding.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Sound.js.html b/docs/Sound.js.html similarity index 99% rename from docs2/out/Sound.js.html rename to docs/Sound.js.html index a7a0c4f5..94c710f3 100644 --- a/docs2/out/Sound.js.html +++ b/docs/Sound.js.html @@ -1148,7 +1148,7 @@ Object.defineProperty(Phaser.Sound.prototype, "volume", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/SoundManager.js.html b/docs/SoundManager.js.html similarity index 99% rename from docs2/out/SoundManager.js.html rename to docs/SoundManager.js.html index fb3a6ba9..df2a0748 100644 --- a/docs2/out/SoundManager.js.html +++ b/docs/SoundManager.js.html @@ -791,7 +791,7 @@ Object.defineProperty(Phaser.SoundManager.prototype, "volume", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Stage.js.html b/docs/Stage.js.html similarity index 99% rename from docs2/out/Stage.js.html rename to docs/Stage.js.html index ec57fcf1..eeb07873 100644 --- a/docs2/out/Stage.js.html +++ b/docs/Stage.js.html @@ -488,7 +488,7 @@ Object.defineProperty(Phaser.Stage.prototype, "backgroundColor", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/StageScaleMode.js.html b/docs/StageScaleMode.js.html similarity index 99% rename from docs2/out/StageScaleMode.js.html rename to docs/StageScaleMode.js.html index cf64c588..6bcc2c42 100644 --- a/docs2/out/StageScaleMode.js.html +++ b/docs/StageScaleMode.js.html @@ -373,12 +373,12 @@ Phaser.StageScaleMode = function (game, width, height) { this.pageAlignHorizontally = false; /** - * @property {boolean} pageAlignVeritcally - If you wish to align your game in the middle of the page then you can set this value to true. + * @property {boolean} pageAlignVertically - If you wish to align your game in the middle of the page then you can set this value to true. <ul><li>It will place a re-calculated margin-left pixel value onto the canvas element which is updated on orientation/resizing. <li>It doesn't care about any other DOM element that may be on the page, it literally just sets the margin.</li></ul> * @default */ - this.pageAlignVeritcally = false; + this.pageAlignVertically = false; /** * @property {number} minWidth - Minimum width the canvas should be scaled to (in pixels). @@ -767,7 +767,7 @@ Phaser.StageScaleMode.prototype = { } } - if (this.pageAlignVeritcally) + if (this.pageAlignVertically) { if (this.height < window.innerHeight && this.incorrectOrientation == false) { @@ -913,7 +913,7 @@ Object.defineProperty(Phaser.StageScaleMode.prototype, "isLandscape", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/State.js.html b/docs/State.js.html similarity index 99% rename from docs2/out/State.js.html rename to docs/State.js.html index 3b440932..14226299 100644 --- a/docs2/out/State.js.html +++ b/docs/State.js.html @@ -511,7 +511,7 @@ Phaser.State.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/StateManager.js.html b/docs/StateManager.js.html similarity index 99% rename from docs2/out/StateManager.js.html rename to docs/StateManager.js.html index 78442321..eef04b6b 100644 --- a/docs2/out/StateManager.js.html +++ b/docs/StateManager.js.html @@ -867,7 +867,7 @@ Phaser.StateManager.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Time.js.html b/docs/Time.js.html similarity index 99% rename from docs2/out/Time.js.html rename to docs/Time.js.html index fca332d6..1748e42f 100644 --- a/docs2/out/Time.js.html +++ b/docs/Time.js.html @@ -607,7 +607,7 @@ Phaser.Time.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Touch.js.html b/docs/Touch.js.html similarity index 99% rename from docs2/out/Touch.js.html rename to docs/Touch.js.html index 74e26b48..1a8af421 100644 --- a/docs2/out/Touch.js.html +++ b/docs/Touch.js.html @@ -675,7 +675,7 @@ Phaser.Touch.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Tween.js.html b/docs/Tween.js.html similarity index 98% rename from docs2/out/Tween.js.html rename to docs/Tween.js.html index a7520358..2bc8905d 100644 --- a/docs2/out/Tween.js.html +++ b/docs/Tween.js.html @@ -526,13 +526,14 @@ Phaser.Tween.prototype = { if (this._parent) { self = this._manager.create(this._object); - self._parent = this._parent; - this.chain(self); + this._lastChild.chain(self); + this._lastChild = self; } else { self = this; - self._parent = self; + this._parent = this; + this._lastChild = this; } self._repeat = repeat; @@ -552,9 +553,9 @@ Phaser.Tween.prototype = { self._yoyo = yoyo; if (autoStart) { - return self.start(); + return this.start(); } else { - return self; + return this; } }, @@ -722,11 +723,11 @@ Phaser.Tween.prototype = { * .to({ y: 0 }, 1000, Phaser.Easing.Linear.None) * .loop(); * @method Phaser.Tween#loop - * @return {Tween} Itself. + * @return {Phaser.Tween} Itself. */ loop: function() { - if (this._parent) this.chain(this._parent); + this._lastChild.chain(this); return this; }, @@ -780,6 +781,7 @@ Phaser.Tween.prototype = { */ pause: function () { this._paused = true; + this._pausedTime = this.game.time.now; }, /** @@ -789,7 +791,7 @@ Phaser.Tween.prototype = { */ resume: function () { this._paused = false; - this._startTime += this.game.time.pauseDuration; + this._startTime += (this.game.time.now - this._pausedTime); }, /** @@ -949,7 +951,7 @@ Phaser.Tween.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/TweenManager.js.html b/docs/TweenManager.js.html similarity index 99% rename from docs2/out/TweenManager.js.html rename to docs/TweenManager.js.html index ee805c09..fd001a9f 100644 --- a/docs2/out/TweenManager.js.html +++ b/docs/TweenManager.js.html @@ -528,7 +528,7 @@ Phaser.TweenManager.prototype = { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/Utils.js.html b/docs/Utils.js.html similarity index 96% rename from docs2/out/Utils.js.html rename to docs/Utils.js.html index 29698418..64a886ee 100644 --- a/docs2/out/Utils.js.html +++ b/docs/Utils.js.html @@ -333,6 +333,20 @@ */ Phaser.Utils = { + shuffle: function (array) { + + for (var i = array.length - 1; i > 0; i--) + { + var j = Math.floor(Math.random() * (i + 1)); + var temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + + return array; + + }, + /** * Javascript string pad http://www.webtoolkit.info/. * pad = the string to pad it out with (defaults to a space)<br> @@ -419,6 +433,8 @@ Phaser.Utils = { /** * This is a slightly modified version of http://api.jquery.com/jQuery.extend/ * @method Phaser.Utils.extend + * @param {boolean} deep - Perform a deep copy? + * @param {object} target - The target object to copy to. * @return {object} The extended object. */ extend: function () { @@ -553,7 +569,7 @@ if (typeof Function.prototype.bind != 'function') { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/World.js.html b/docs/World.js.html similarity index 70% rename from docs2/out/World.js.html rename to docs/World.js.html index a3a6d123..8e0f1301 100644 --- a/docs2/out/World.js.html +++ b/docs/World.js.html @@ -328,24 +328,30 @@ */ /** - * "This world is but a canvas to our imagination." - Henry David Thoreau - * <p> - * A game has only one world. The world is an abstract place in which all game objects live. It is not bound - * by stage limits and can be any size. You look into the world via cameras. All game objects live within - * the world at world-based coordinates. By default a world is created the same size as your Stage. - * - * @class Phaser.World - * @constructor - * @param {Phaser.Game} game - Reference to the current game instance. - */ +* "This world is but a canvas to our imagination." - Henry David Thoreau +* +* A game has only one world. The world is an abstract place in which all game objects live. It is not bound +* by stage limits and can be any size. You look into the world via cameras. All game objects live within +* the world at world-based coordinates. By default a world is created the same size as your Stage. +* +* @class Phaser.World +* @constructor +* @param {Phaser.Game} game - Reference to the current game instance. +*/ Phaser.World = function (game) { - /** - * @property {Phaser.Game} game - A reference to the currently running Game. - */ - this.game = game; + Phaser.Group.call(this, game, null, '__world', false); /** + * @property {Phaser.Point} scale - Replaces the PIXI.Point with a slightly more flexible one. + */ + this.scale = new Phaser.Point(1, 1); + + /** + * The World has no fixed size, but it does have a bounds outside of which objects are no longer considered as being "in world" and you should use this to clean-up the display list and purge dead objects. + * By default we set the Bounds to be from 0,0 to Game.width,Game.height. I.e. it will match the size given to the game constructor with 0,0 representing the top-left of the display. + * However 0,0 is actually the center of the world, and if you rotate or scale the world all of that will happen from 0,0. + * So if you want to make a game in which the world itself will rotate you should adjust the bounds so that 0,0 is the center point, i.e. set them to -1000,-1000,2000,2000 for a 2000x2000 sized world centered around 0,0. * @property {Phaser.Rectangle} bounds - Bound of this world that objects can not escape from. */ this.bounds = new Phaser.Rectangle(0, 0, game.width, game.height); @@ -360,125 +366,119 @@ Phaser.World = function (game) { */ this.currentRenderOrderID = 0; - /** - * @property {Phaser.Group} group - Object container stores every object created with `create*` methods. - */ - this.group = null; - }; -Phaser.World.prototype = { +Phaser.World.prototype = Object.create(Phaser.Group.prototype); +Phaser.World.prototype.constructor = Phaser.World; - /** - * Initialises the game world. - * - * @method Phaser.World#boot - * @protected - */ - boot: function () { +/** +* Initialises the game world. +* +* @method Phaser.World#boot +* @protected +*/ +Phaser.World.prototype.boot = function () { - this.camera = new Phaser.Camera(this.game, 0, 0, 0, this.game.width, this.game.height); + this.camera = new Phaser.Camera(this.game, 0, 0, 0, this.game.width, this.game.height); - this.game.camera = this.camera; + this.camera.displayObject = this._container; - this.group = new Phaser.Group(this.game, null, '__world', true); + this.game.camera = this.camera; - }, +} - /** - * This is called automatically every frame, and is where main logic happens. - * - * @method Phaser.World#update - */ - update: function () { +/** +* This is called automatically every frame, and is where main logic happens. +* +* @method Phaser.World#update +*/ +Phaser.World.prototype.update = function () { - this.camera.update(); + this.currentRenderOrderID = 0; - this.currentRenderOrderID = 0; - - if (this.game.stage._stage.first._iNext) + if (this.game.stage._stage.first._iNext) + { + var currentNode = this.game.stage._stage.first._iNext; + + do { - var currentNode = this.game.stage._stage.first._iNext; - - do + if (currentNode['preUpdate']) { - if (currentNode['preUpdate']) - { - currentNode.preUpdate(); - } - - if (currentNode['update']) - { - currentNode.update(); - } - - currentNode = currentNode._iNext; + currentNode.preUpdate(); } - while (currentNode != this.game.stage._stage.last._iNext) + + if (currentNode['update']) + { + currentNode.update(); + } + + currentNode = currentNode._iNext; } + while (currentNode != this.game.stage._stage.last._iNext) + } - }, +} - /** - * This is called automatically every frame, and is where main logic happens. - * @method Phaser.World#postUpdate - */ - postUpdate: function () { +/** +* This is called automatically every frame, and is where main logic happens. +* @method Phaser.World#postUpdate +*/ +Phaser.World.prototype.postUpdate = function () { - if (this.game.stage._stage.first._iNext) + this.camera.update(); + + if (this.game.stage._stage.first._iNext) + { + var currentNode = this.game.stage._stage.first._iNext; + + do { - var currentNode = this.game.stage._stage.first._iNext; - - do + if (currentNode['postUpdate']) { - if (currentNode['postUpdate']) - { - currentNode.postUpdate(); - } - - currentNode = currentNode._iNext; + currentNode.postUpdate(); } - while (currentNode != this.game.stage._stage.last._iNext) + + currentNode = currentNode._iNext; } - - }, - - /** - * Updates the size of this world. - * @method Phaser.World#setSize - * @param {number} width - New width of the world. - * @param {number} height - New height of the world. - */ - setSize: function (width, height) { - - if (width >= this.game.width) - { - this.bounds.width = width; - } - - if (height >= this.game.height) - { - this.bounds.height = height; - } - - }, - - /** - * Destroyer of worlds. - * @method Phaser.World#destroy - */ - destroy: function () { - - this.camera.x = 0; - this.camera.y = 0; - - this.game.input.reset(true); - - this.group.removeAll(); - + while (currentNode != this.game.stage._stage.last._iNext) } - -}; + +} + +/** +* Updates the size of this world. Note that this doesn't modify the world x/y coordinates, just the width and height. +* If you need to adjust the bounds of the world +* @method Phaser.World#setBounds +* @param {number} x - Top left most corner of the world. +* @param {number} y - Top left most corner of the world. +* @param {number} width - New width of the world. +* @param {number} height - New height of the world. +*/ +Phaser.World.prototype.setBounds = function (x, y, width, height) { + + this.bounds.setTo(x, y, width, height); + + if (this.camera.bounds) + { + this.camera.bounds.setTo(x, y, width, height); + } + +} + +/** +* Destroyer of worlds. +* @method Phaser.World#destroy +*/ +Phaser.World.prototype.destroy = function () { + + this.camera.x = 0; + this.camera.y = 0; + + this.game.input.reset(true); + + this.removeAll(); + +} /** * @name Phaser.World#width @@ -546,7 +546,16 @@ Object.defineProperty(Phaser.World.prototype, "centerY", { Object.defineProperty(Phaser.World.prototype, "randomX", { get: function () { - return Math.round(Math.random() * this.bounds.width); + + if (this.bounds.x < 0) + { + return this.game.rnd.integerInRange(this.bounds.x, (this.bounds.width - Math.abs(this.bounds.x))); + } + else + { + return this.game.rnd.integerInRange(this.bounds.x, this.bounds.width); + } + } }); @@ -559,7 +568,16 @@ Object.defineProperty(Phaser.World.prototype, "randomX", { Object.defineProperty(Phaser.World.prototype, "randomY", { get: function () { - return Math.round(Math.random() * this.bounds.height); + + if (this.bounds.y < 0) + { + return this.game.rnd.integerInRange(this.bounds.y, (this.bounds.height - Math.abs(this.bounds.y))); + } + else + { + return this.game.rnd.integerInRange(this.bounds.y, this.bounds.height); + } + } }); @@ -584,7 +602,7 @@ Object.defineProperty(Phaser.World.prototype, "randomY", { Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs/build/build dev.bat b/docs/build/build dev.bat new file mode 100644 index 00000000..144602f1 --- /dev/null +++ b/docs/build/build dev.bat @@ -0,0 +1 @@ +jsdoc -c conf_dev.json \ No newline at end of file diff --git a/docs/build/build master.bat b/docs/build/build master.bat new file mode 100644 index 00000000..25b9d2c4 --- /dev/null +++ b/docs/build/build master.bat @@ -0,0 +1 @@ +jsdoc -c conf.json \ No newline at end of file diff --git a/docs/build/conf.json b/docs/build/conf.json new file mode 100644 index 00000000..6bd6894c --- /dev/null +++ b/docs/build/conf.json @@ -0,0 +1,58 @@ +{ + "tags": { + "allowUnknownTags": true + }, + "source": { + "include": [ + "../../src/Phaser.js", + "../../src/Intro.js", + "../../src/animation/", + "../../src/core/", + "../../src/gameobjects/", + "../../src/geom/", + "../../src/input/", + "../../src/loader/", + "../../src/math/", + "../../src/net/", + "../../src/particles/", + "../../src/physics/", + "../../src/sound/", + "../../src/system/", + "../../src/tilemap/", + "../../src/time/", + "../../src/tween/", + "../../src/utils/" + ], + "exclude": [], + "includePattern": ".+\\.js(doc)?$", + "excludePattern": "(^|\\/|\\\\)_" + }, + "plugins" : ["plugins/markdown"], + "templates": { + "cleverLinks" : false, + "monospaceLinks" : false, + "default" : { + "outputSourceFiles" : true + }, + "systemName" : "Phaser", + "footer" : "", + "copyright" : "Phaser Copyright © 2012-2013 Photon Storm Ltd.", + "navType" : "vertical", + "theme" : "cerulean", + "linenums" : true, + "collapseSymbols" : false, + "inverseNav" : true + }, + "markdown" : { + "parser" : "gfm", + "hardwrap" : true + }, + "opts": { + "template": "docstrap-master/template/", + "encoding": "utf8", + "destination": "../", + "recurse": true, + "private": false, + "lenient": true + } +} \ No newline at end of file diff --git a/docs2/conf.json b/docs/build/conf_dev.json similarity index 63% rename from docs2/conf.json rename to docs/build/conf_dev.json index 92674fb8..2a8fc1b4 100644 --- a/docs2/conf.json +++ b/docs/build/conf_dev.json @@ -3,7 +3,23 @@ "allowUnknownTags": true }, "source": { - "include": [ "../src/Phaser.js", "../src/Intro.js", "../src/animation/", "../src/core/", "../src/geom/", "../src/input/", "../src/loader/", "../src/math/", "../src/net/", "../src/particles/", "../src/sound/", "../src/system/", "../src/time/", "../src/tween/", "../src/utils/" ], + "include": [ + "../../src/Phaser.js", + "../../src/Intro.js", + "../../src/animation/", + "../../src/core/", + "../../src/geom/", + "../../src/input/", + "../../src/loader/", + "../../src/math/", + "../../src/net/", + "../../src/particles/", + "../../src/sound/", + "../../src/system/", + "../../src/time/", + "../../src/tween/", + "../../src/utils/" + ], "exclude": [], "includePattern": ".+\\.js(doc)?$", "excludePattern": "(^|\\/|\\\\)_" @@ -31,7 +47,7 @@ "opts": { "template": "docstrap-master/template/", "encoding": "utf8", - "destination": "./out/", + "destination": "../", "recurse": true, "private": false, "lenient": true diff --git a/docs2/docstrap-master/.gitignore b/docs/build/docstrap-master/.gitignore similarity index 100% rename from docs2/docstrap-master/.gitignore rename to docs/build/docstrap-master/.gitignore diff --git a/docs2/docstrap-master/.npmignore b/docs/build/docstrap-master/.npmignore similarity index 100% rename from docs2/docstrap-master/.npmignore rename to docs/build/docstrap-master/.npmignore diff --git a/docs2/docstrap-master/Gruntfile.js b/docs/build/docstrap-master/Gruntfile.js similarity index 100% rename from docs2/docstrap-master/Gruntfile.js rename to docs/build/docstrap-master/Gruntfile.js diff --git a/docs2/docstrap-master/LICENSE.md b/docs/build/docstrap-master/LICENSE.md similarity index 100% rename from docs2/docstrap-master/LICENSE.md rename to docs/build/docstrap-master/LICENSE.md diff --git a/docs2/docstrap-master/README.md b/docs/build/docstrap-master/README.md similarity index 100% rename from docs2/docstrap-master/README.md rename to docs/build/docstrap-master/README.md diff --git a/docs2/docstrap-master/bower.json b/docs/build/docstrap-master/bower.json similarity index 100% rename from docs2/docstrap-master/bower.json rename to docs/build/docstrap-master/bower.json diff --git a/docs2/docstrap-master/component.json b/docs/build/docstrap-master/component.json similarity index 100% rename from docs2/docstrap-master/component.json rename to docs/build/docstrap-master/component.json diff --git a/docs2/docstrap-master/fixtures/car.js b/docs/build/docstrap-master/fixtures/car.js similarity index 100% rename from docs2/docstrap-master/fixtures/car.js rename to docs/build/docstrap-master/fixtures/car.js diff --git a/docs2/docstrap-master/fixtures/example.conf.json b/docs/build/docstrap-master/fixtures/example.conf.json similarity index 100% rename from docs2/docstrap-master/fixtures/example.conf.json rename to docs/build/docstrap-master/fixtures/example.conf.json diff --git a/docs2/docstrap-master/fixtures/other.js b/docs/build/docstrap-master/fixtures/other.js similarity index 100% rename from docs2/docstrap-master/fixtures/other.js rename to docs/build/docstrap-master/fixtures/other.js diff --git a/docs2/docstrap-master/fixtures/person.js b/docs/build/docstrap-master/fixtures/person.js similarity index 100% rename from docs2/docstrap-master/fixtures/person.js rename to docs/build/docstrap-master/fixtures/person.js diff --git a/docs2/docstrap-master/fixtures/tutorials/Brush Teeth.md b/docs/build/docstrap-master/fixtures/tutorials/Brush Teeth.md similarity index 100% rename from docs2/docstrap-master/fixtures/tutorials/Brush Teeth.md rename to docs/build/docstrap-master/fixtures/tutorials/Brush Teeth.md diff --git a/docs2/docstrap-master/fixtures/tutorials/Drive Car.md b/docs/build/docstrap-master/fixtures/tutorials/Drive Car.md similarity index 100% rename from docs2/docstrap-master/fixtures/tutorials/Drive Car.md rename to docs/build/docstrap-master/fixtures/tutorials/Drive Car.md diff --git a/docs2/docstrap-master/package.json b/docs/build/docstrap-master/package.json similarity index 100% rename from docs2/docstrap-master/package.json rename to docs/build/docstrap-master/package.json diff --git a/docs2/docstrap-master/styles/bootswatch.less b/docs/build/docstrap-master/styles/bootswatch.less similarity index 100% rename from docs2/docstrap-master/styles/bootswatch.less rename to docs/build/docstrap-master/styles/bootswatch.less diff --git a/docs2/docstrap-master/styles/main.less b/docs/build/docstrap-master/styles/main.less similarity index 100% rename from docs2/docstrap-master/styles/main.less rename to docs/build/docstrap-master/styles/main.less diff --git a/docs2/docstrap-master/styles/variables.less b/docs/build/docstrap-master/styles/variables.less similarity index 100% rename from docs2/docstrap-master/styles/variables.less rename to docs/build/docstrap-master/styles/variables.less diff --git a/docs2/docstrap-master/template/jsdoc.conf.json b/docs/build/docstrap-master/template/jsdoc.conf.json similarity index 100% rename from docs2/docstrap-master/template/jsdoc.conf.json rename to docs/build/docstrap-master/template/jsdoc.conf.json diff --git a/docs2/docstrap-master/template/publish.js b/docs/build/docstrap-master/template/publish.js similarity index 100% rename from docs2/docstrap-master/template/publish.js rename to docs/build/docstrap-master/template/publish.js diff --git a/docs2/docstrap-master/template/static/img/glyphicons-halflings-white.png b/docs/build/docstrap-master/template/static/img/glyphicons-halflings-white.png similarity index 100% rename from docs2/docstrap-master/template/static/img/glyphicons-halflings-white.png rename to docs/build/docstrap-master/template/static/img/glyphicons-halflings-white.png diff --git a/docs2/docstrap-master/template/static/img/glyphicons-halflings.png b/docs/build/docstrap-master/template/static/img/glyphicons-halflings.png similarity index 100% rename from docs2/docstrap-master/template/static/img/glyphicons-halflings.png rename to docs/build/docstrap-master/template/static/img/glyphicons-halflings.png diff --git a/docs2/docstrap-master/template/static/scripts/URI.js b/docs/build/docstrap-master/template/static/scripts/URI.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/URI.js rename to docs/build/docstrap-master/template/static/scripts/URI.js diff --git a/docs2/docstrap-master/template/static/scripts/bootstrap-dropdown.js b/docs/build/docstrap-master/template/static/scripts/bootstrap-dropdown.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/bootstrap-dropdown.js rename to docs/build/docstrap-master/template/static/scripts/bootstrap-dropdown.js diff --git a/docs2/docstrap-master/template/static/scripts/bootstrap-tab.js b/docs/build/docstrap-master/template/static/scripts/bootstrap-tab.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/bootstrap-tab.js rename to docs/build/docstrap-master/template/static/scripts/bootstrap-tab.js diff --git a/docs2/docstrap-master/template/static/scripts/jquery.localScroll.js b/docs/build/docstrap-master/template/static/scripts/jquery.localScroll.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/jquery.localScroll.js rename to docs/build/docstrap-master/template/static/scripts/jquery.localScroll.js diff --git a/docs2/docstrap-master/template/static/scripts/jquery.min.js b/docs/build/docstrap-master/template/static/scripts/jquery.min.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/jquery.min.js rename to docs/build/docstrap-master/template/static/scripts/jquery.min.js diff --git a/docs2/docstrap-master/template/static/scripts/jquery.scrollTo.js b/docs/build/docstrap-master/template/static/scripts/jquery.scrollTo.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/jquery.scrollTo.js rename to docs/build/docstrap-master/template/static/scripts/jquery.scrollTo.js diff --git a/docs2/docstrap-master/template/static/scripts/jquery.sunlight.js b/docs/build/docstrap-master/template/static/scripts/jquery.sunlight.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/jquery.sunlight.js rename to docs/build/docstrap-master/template/static/scripts/jquery.sunlight.js diff --git a/docs2/docstrap-master/template/static/scripts/prettify/Apache-License-2.0.txt b/docs/build/docstrap-master/template/static/scripts/prettify/Apache-License-2.0.txt similarity index 100% rename from docs2/docstrap-master/template/static/scripts/prettify/Apache-License-2.0.txt rename to docs/build/docstrap-master/template/static/scripts/prettify/Apache-License-2.0.txt diff --git a/docs2/docstrap-master/template/static/scripts/prettify/jquery.min.js b/docs/build/docstrap-master/template/static/scripts/prettify/jquery.min.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/prettify/jquery.min.js rename to docs/build/docstrap-master/template/static/scripts/prettify/jquery.min.js diff --git a/docs2/docstrap-master/template/static/scripts/prettify/lang-css.js b/docs/build/docstrap-master/template/static/scripts/prettify/lang-css.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/prettify/lang-css.js rename to docs/build/docstrap-master/template/static/scripts/prettify/lang-css.js diff --git a/docs2/docstrap-master/template/static/scripts/prettify/prettify.js b/docs/build/docstrap-master/template/static/scripts/prettify/prettify.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/prettify/prettify.js rename to docs/build/docstrap-master/template/static/scripts/prettify/prettify.js diff --git a/docs2/docstrap-master/template/static/scripts/sunlight-plugin.doclinks.js b/docs/build/docstrap-master/template/static/scripts/sunlight-plugin.doclinks.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/sunlight-plugin.doclinks.js rename to docs/build/docstrap-master/template/static/scripts/sunlight-plugin.doclinks.js diff --git a/docs2/docstrap-master/template/static/scripts/sunlight-plugin.linenumbers.js b/docs/build/docstrap-master/template/static/scripts/sunlight-plugin.linenumbers.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/sunlight-plugin.linenumbers.js rename to docs/build/docstrap-master/template/static/scripts/sunlight-plugin.linenumbers.js diff --git a/docs2/docstrap-master/template/static/scripts/sunlight-plugin.menu.js b/docs/build/docstrap-master/template/static/scripts/sunlight-plugin.menu.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/sunlight-plugin.menu.js rename to docs/build/docstrap-master/template/static/scripts/sunlight-plugin.menu.js diff --git a/docs2/docstrap-master/template/static/scripts/sunlight.javascript.js b/docs/build/docstrap-master/template/static/scripts/sunlight.javascript.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/sunlight.javascript.js rename to docs/build/docstrap-master/template/static/scripts/sunlight.javascript.js diff --git a/docs2/docstrap-master/template/static/scripts/sunlight.js b/docs/build/docstrap-master/template/static/scripts/sunlight.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/sunlight.js rename to docs/build/docstrap-master/template/static/scripts/sunlight.js diff --git a/docs2/docstrap-master/template/static/scripts/toc.js b/docs/build/docstrap-master/template/static/scripts/toc.js similarity index 100% rename from docs2/docstrap-master/template/static/scripts/toc.js rename to docs/build/docstrap-master/template/static/scripts/toc.js diff --git a/docs2/docstrap-master/template/static/styles/darkstrap.css b/docs/build/docstrap-master/template/static/styles/darkstrap.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/darkstrap.css rename to docs/build/docstrap-master/template/static/styles/darkstrap.css diff --git a/docs2/docstrap-master/template/static/styles/prettify-tomorrow.css b/docs/build/docstrap-master/template/static/styles/prettify-tomorrow.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/prettify-tomorrow.css rename to docs/build/docstrap-master/template/static/styles/prettify-tomorrow.css diff --git a/docs2/docstrap-master/template/static/styles/site.amelia.css b/docs/build/docstrap-master/template/static/styles/site.amelia.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.amelia.css rename to docs/build/docstrap-master/template/static/styles/site.amelia.css diff --git a/docs2/docstrap-master/template/static/styles/site.cerulean.css b/docs/build/docstrap-master/template/static/styles/site.cerulean.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.cerulean.css rename to docs/build/docstrap-master/template/static/styles/site.cerulean.css diff --git a/docs2/docstrap-master/template/static/styles/site.cosmo.css b/docs/build/docstrap-master/template/static/styles/site.cosmo.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.cosmo.css rename to docs/build/docstrap-master/template/static/styles/site.cosmo.css diff --git a/docs2/docstrap-master/template/static/styles/site.cyborg.css b/docs/build/docstrap-master/template/static/styles/site.cyborg.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.cyborg.css rename to docs/build/docstrap-master/template/static/styles/site.cyborg.css diff --git a/docs2/docstrap-master/template/static/styles/site.darkstrap.css b/docs/build/docstrap-master/template/static/styles/site.darkstrap.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.darkstrap.css rename to docs/build/docstrap-master/template/static/styles/site.darkstrap.css diff --git a/docs2/docstrap-master/template/static/styles/site.flatly.css b/docs/build/docstrap-master/template/static/styles/site.flatly.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.flatly.css rename to docs/build/docstrap-master/template/static/styles/site.flatly.css diff --git a/docs2/docstrap-master/template/static/styles/site.journal.css b/docs/build/docstrap-master/template/static/styles/site.journal.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.journal.css rename to docs/build/docstrap-master/template/static/styles/site.journal.css diff --git a/docs2/docstrap-master/template/static/styles/site.readable.css b/docs/build/docstrap-master/template/static/styles/site.readable.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.readable.css rename to docs/build/docstrap-master/template/static/styles/site.readable.css diff --git a/docs2/docstrap-master/template/static/styles/site.simplex.css b/docs/build/docstrap-master/template/static/styles/site.simplex.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.simplex.css rename to docs/build/docstrap-master/template/static/styles/site.simplex.css diff --git a/docs2/docstrap-master/template/static/styles/site.slate.css b/docs/build/docstrap-master/template/static/styles/site.slate.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.slate.css rename to docs/build/docstrap-master/template/static/styles/site.slate.css diff --git a/docs2/docstrap-master/template/static/styles/site.spacelab.css b/docs/build/docstrap-master/template/static/styles/site.spacelab.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.spacelab.css rename to docs/build/docstrap-master/template/static/styles/site.spacelab.css diff --git a/docs2/docstrap-master/template/static/styles/site.spruce.css b/docs/build/docstrap-master/template/static/styles/site.spruce.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.spruce.css rename to docs/build/docstrap-master/template/static/styles/site.spruce.css diff --git a/docs2/docstrap-master/template/static/styles/site.superhero.css b/docs/build/docstrap-master/template/static/styles/site.superhero.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.superhero.css rename to docs/build/docstrap-master/template/static/styles/site.superhero.css diff --git a/docs2/docstrap-master/template/static/styles/site.united.css b/docs/build/docstrap-master/template/static/styles/site.united.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/site.united.css rename to docs/build/docstrap-master/template/static/styles/site.united.css diff --git a/docs2/docstrap-master/template/static/styles/sunlight.dark.css b/docs/build/docstrap-master/template/static/styles/sunlight.dark.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/sunlight.dark.css rename to docs/build/docstrap-master/template/static/styles/sunlight.dark.css diff --git a/docs2/docstrap-master/template/static/styles/sunlight.default.css b/docs/build/docstrap-master/template/static/styles/sunlight.default.css similarity index 100% rename from docs2/docstrap-master/template/static/styles/sunlight.default.css rename to docs/build/docstrap-master/template/static/styles/sunlight.default.css diff --git a/docs2/docstrap-master/template/tmpl/container.tmpl b/docs/build/docstrap-master/template/tmpl/container.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/container.tmpl rename to docs/build/docstrap-master/template/tmpl/container.tmpl diff --git a/docs2/docstrap-master/template/tmpl/details.tmpl b/docs/build/docstrap-master/template/tmpl/details.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/details.tmpl rename to docs/build/docstrap-master/template/tmpl/details.tmpl diff --git a/docs2/docstrap-master/template/tmpl/example.tmpl b/docs/build/docstrap-master/template/tmpl/example.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/example.tmpl rename to docs/build/docstrap-master/template/tmpl/example.tmpl diff --git a/docs2/docstrap-master/template/tmpl/examples.tmpl b/docs/build/docstrap-master/template/tmpl/examples.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/examples.tmpl rename to docs/build/docstrap-master/template/tmpl/examples.tmpl diff --git a/docs2/docstrap-master/template/tmpl/exceptions.tmpl b/docs/build/docstrap-master/template/tmpl/exceptions.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/exceptions.tmpl rename to docs/build/docstrap-master/template/tmpl/exceptions.tmpl diff --git a/docs2/docstrap-master/template/tmpl/fires.tmpl b/docs/build/docstrap-master/template/tmpl/fires.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/fires.tmpl rename to docs/build/docstrap-master/template/tmpl/fires.tmpl diff --git a/docs2/docstrap-master/template/tmpl/layout.tmpl b/docs/build/docstrap-master/template/tmpl/layout.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/layout.tmpl rename to docs/build/docstrap-master/template/tmpl/layout.tmpl diff --git a/docs2/docstrap-master/template/tmpl/mainpage.tmpl b/docs/build/docstrap-master/template/tmpl/mainpage.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/mainpage.tmpl rename to docs/build/docstrap-master/template/tmpl/mainpage.tmpl diff --git a/docs2/docstrap-master/template/tmpl/members.tmpl b/docs/build/docstrap-master/template/tmpl/members.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/members.tmpl rename to docs/build/docstrap-master/template/tmpl/members.tmpl diff --git a/docs2/docstrap-master/template/tmpl/method.tmpl b/docs/build/docstrap-master/template/tmpl/method.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/method.tmpl rename to docs/build/docstrap-master/template/tmpl/method.tmpl diff --git a/docs2/docstrap-master/template/tmpl/params.tmpl b/docs/build/docstrap-master/template/tmpl/params.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/params.tmpl rename to docs/build/docstrap-master/template/tmpl/params.tmpl diff --git a/docs2/docstrap-master/template/tmpl/properties.tmpl b/docs/build/docstrap-master/template/tmpl/properties.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/properties.tmpl rename to docs/build/docstrap-master/template/tmpl/properties.tmpl diff --git a/docs2/docstrap-master/template/tmpl/returns.tmpl b/docs/build/docstrap-master/template/tmpl/returns.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/returns.tmpl rename to docs/build/docstrap-master/template/tmpl/returns.tmpl diff --git a/docs2/docstrap-master/template/tmpl/sections.tmpl b/docs/build/docstrap-master/template/tmpl/sections.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/sections.tmpl rename to docs/build/docstrap-master/template/tmpl/sections.tmpl diff --git a/docs2/docstrap-master/template/tmpl/source.tmpl b/docs/build/docstrap-master/template/tmpl/source.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/source.tmpl rename to docs/build/docstrap-master/template/tmpl/source.tmpl diff --git a/docs2/docstrap-master/template/tmpl/tutorial.tmpl b/docs/build/docstrap-master/template/tmpl/tutorial.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/tutorial.tmpl rename to docs/build/docstrap-master/template/tmpl/tutorial.tmpl diff --git a/docs2/docstrap-master/template/tmpl/type.tmpl b/docs/build/docstrap-master/template/tmpl/type.tmpl similarity index 100% rename from docs2/docstrap-master/template/tmpl/type.tmpl rename to docs/build/docstrap-master/template/tmpl/type.tmpl diff --git a/docs2/out/classes.list.html b/docs/classes.list.html similarity index 99% rename from docs2/out/classes.list.html rename to docs/classes.list.html index 5dee7711..2d5f8a17 100644 --- a/docs2/out/classes.list.html +++ b/docs/classes.list.html @@ -599,7 +599,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/global.html b/docs/global.html similarity index 98% rename from docs2/out/global.html rename to docs/global.html index 1841e238..10ffb391 100644 --- a/docs2/out/global.html +++ b/docs/global.html @@ -476,7 +476,7 @@
Source:
@@ -546,7 +546,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/img/glyphicons-halflings-white.png b/docs/img/glyphicons-halflings-white.png similarity index 100% rename from docs2/out/img/glyphicons-halflings-white.png rename to docs/img/glyphicons-halflings-white.png diff --git a/docs2/out/img/glyphicons-halflings.png b/docs/img/glyphicons-halflings.png similarity index 100% rename from docs2/out/img/glyphicons-halflings.png rename to docs/img/glyphicons-halflings.png diff --git a/docs2/out/index.html b/docs/index.html similarity index 99% rename from docs2/out/index.html rename to docs/index.html index 53a62a9e..a0ec9616 100644 --- a/docs2/out/index.html +++ b/docs/index.html @@ -453,7 +453,7 @@ and my love of game development originate.

Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/namespaces.list.html b/docs/namespaces.list.html similarity index 99% rename from docs2/out/namespaces.list.html rename to docs/namespaces.list.html index 47164408..7bdb5b06 100644 --- a/docs2/out/namespaces.list.html +++ b/docs/namespaces.list.html @@ -599,7 +599,7 @@ Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:35:44 GMT+0100 (BST) using the DocStrap template. + on Wed Oct 23 2013 13:51:58 GMT+0100 (BST) using the DocStrap template. diff --git a/docs2/out/scripts/URI.js b/docs/scripts/URI.js similarity index 100% rename from docs2/out/scripts/URI.js rename to docs/scripts/URI.js diff --git a/docs2/out/scripts/bootstrap-dropdown.js b/docs/scripts/bootstrap-dropdown.js similarity index 100% rename from docs2/out/scripts/bootstrap-dropdown.js rename to docs/scripts/bootstrap-dropdown.js diff --git a/docs2/out/scripts/bootstrap-tab.js b/docs/scripts/bootstrap-tab.js similarity index 100% rename from docs2/out/scripts/bootstrap-tab.js rename to docs/scripts/bootstrap-tab.js diff --git a/docs2/out/scripts/jquery.localScroll.js b/docs/scripts/jquery.localScroll.js similarity index 100% rename from docs2/out/scripts/jquery.localScroll.js rename to docs/scripts/jquery.localScroll.js diff --git a/docs2/out/scripts/jquery.min.js b/docs/scripts/jquery.min.js similarity index 100% rename from docs2/out/scripts/jquery.min.js rename to docs/scripts/jquery.min.js diff --git a/docs2/out/scripts/jquery.scrollTo.js b/docs/scripts/jquery.scrollTo.js similarity index 100% rename from docs2/out/scripts/jquery.scrollTo.js rename to docs/scripts/jquery.scrollTo.js diff --git a/docs2/out/scripts/jquery.sunlight.js b/docs/scripts/jquery.sunlight.js similarity index 100% rename from docs2/out/scripts/jquery.sunlight.js rename to docs/scripts/jquery.sunlight.js diff --git a/docs2/out/scripts/prettify/Apache-License-2.0.txt b/docs/scripts/prettify/Apache-License-2.0.txt similarity index 100% rename from docs2/out/scripts/prettify/Apache-License-2.0.txt rename to docs/scripts/prettify/Apache-License-2.0.txt diff --git a/docs2/out/scripts/prettify/jquery.min.js b/docs/scripts/prettify/jquery.min.js similarity index 100% rename from docs2/out/scripts/prettify/jquery.min.js rename to docs/scripts/prettify/jquery.min.js diff --git a/docs2/out/scripts/prettify/lang-css.js b/docs/scripts/prettify/lang-css.js similarity index 100% rename from docs2/out/scripts/prettify/lang-css.js rename to docs/scripts/prettify/lang-css.js diff --git a/docs2/out/scripts/prettify/prettify.js b/docs/scripts/prettify/prettify.js similarity index 100% rename from docs2/out/scripts/prettify/prettify.js rename to docs/scripts/prettify/prettify.js diff --git a/docs2/out/scripts/sunlight-plugin.doclinks.js b/docs/scripts/sunlight-plugin.doclinks.js similarity index 100% rename from docs2/out/scripts/sunlight-plugin.doclinks.js rename to docs/scripts/sunlight-plugin.doclinks.js diff --git a/docs2/out/scripts/sunlight-plugin.linenumbers.js b/docs/scripts/sunlight-plugin.linenumbers.js similarity index 100% rename from docs2/out/scripts/sunlight-plugin.linenumbers.js rename to docs/scripts/sunlight-plugin.linenumbers.js diff --git a/docs2/out/scripts/sunlight-plugin.menu.js b/docs/scripts/sunlight-plugin.menu.js similarity index 100% rename from docs2/out/scripts/sunlight-plugin.menu.js rename to docs/scripts/sunlight-plugin.menu.js diff --git a/docs2/out/scripts/sunlight.javascript.js b/docs/scripts/sunlight.javascript.js similarity index 100% rename from docs2/out/scripts/sunlight.javascript.js rename to docs/scripts/sunlight.javascript.js diff --git a/docs2/out/scripts/sunlight.js b/docs/scripts/sunlight.js similarity index 100% rename from docs2/out/scripts/sunlight.js rename to docs/scripts/sunlight.js diff --git a/docs2/out/scripts/toc.js b/docs/scripts/toc.js similarity index 100% rename from docs2/out/scripts/toc.js rename to docs/scripts/toc.js diff --git a/docs2/out/styles/darkstrap.css b/docs/styles/darkstrap.css similarity index 100% rename from docs2/out/styles/darkstrap.css rename to docs/styles/darkstrap.css diff --git a/docs2/out/styles/prettify-tomorrow.css b/docs/styles/prettify-tomorrow.css similarity index 100% rename from docs2/out/styles/prettify-tomorrow.css rename to docs/styles/prettify-tomorrow.css diff --git a/docs2/out/styles/site.amelia.css b/docs/styles/site.amelia.css similarity index 100% rename from docs2/out/styles/site.amelia.css rename to docs/styles/site.amelia.css diff --git a/docs2/out/styles/site.cerulean.css b/docs/styles/site.cerulean.css similarity index 100% rename from docs2/out/styles/site.cerulean.css rename to docs/styles/site.cerulean.css diff --git a/docs2/out/styles/site.cosmo.css b/docs/styles/site.cosmo.css similarity index 100% rename from docs2/out/styles/site.cosmo.css rename to docs/styles/site.cosmo.css diff --git a/docs2/out/styles/site.cyborg.css b/docs/styles/site.cyborg.css similarity index 100% rename from docs2/out/styles/site.cyborg.css rename to docs/styles/site.cyborg.css diff --git a/docs2/out/styles/site.darkstrap.css b/docs/styles/site.darkstrap.css similarity index 100% rename from docs2/out/styles/site.darkstrap.css rename to docs/styles/site.darkstrap.css diff --git a/docs2/out/styles/site.flatly.css b/docs/styles/site.flatly.css similarity index 100% rename from docs2/out/styles/site.flatly.css rename to docs/styles/site.flatly.css diff --git a/docs2/out/styles/site.journal.css b/docs/styles/site.journal.css similarity index 100% rename from docs2/out/styles/site.journal.css rename to docs/styles/site.journal.css diff --git a/docs2/out/styles/site.readable.css b/docs/styles/site.readable.css similarity index 100% rename from docs2/out/styles/site.readable.css rename to docs/styles/site.readable.css diff --git a/docs2/out/styles/site.simplex.css b/docs/styles/site.simplex.css similarity index 100% rename from docs2/out/styles/site.simplex.css rename to docs/styles/site.simplex.css diff --git a/docs2/out/styles/site.slate.css b/docs/styles/site.slate.css similarity index 100% rename from docs2/out/styles/site.slate.css rename to docs/styles/site.slate.css diff --git a/docs2/out/styles/site.spacelab.css b/docs/styles/site.spacelab.css similarity index 100% rename from docs2/out/styles/site.spacelab.css rename to docs/styles/site.spacelab.css diff --git a/docs2/out/styles/site.spruce.css b/docs/styles/site.spruce.css similarity index 100% rename from docs2/out/styles/site.spruce.css rename to docs/styles/site.spruce.css diff --git a/docs2/out/styles/site.superhero.css b/docs/styles/site.superhero.css similarity index 100% rename from docs2/out/styles/site.superhero.css rename to docs/styles/site.superhero.css diff --git a/docs2/out/styles/site.united.css b/docs/styles/site.united.css similarity index 100% rename from docs2/out/styles/site.united.css rename to docs/styles/site.united.css diff --git a/docs2/out/styles/sunlight.dark.css b/docs/styles/sunlight.dark.css similarity index 100% rename from docs2/out/styles/sunlight.dark.css rename to docs/styles/sunlight.dark.css diff --git a/docs2/out/styles/sunlight.default.css b/docs/styles/sunlight.default.css similarity index 100% rename from docs2/out/styles/sunlight.default.css rename to docs/styles/sunlight.default.css diff --git a/docs2/Documentation Checklist.xlsx b/docs2/Documentation Checklist.xlsx deleted file mode 100644 index 292dcd33ea46be15c4cd9a1269bd9b444751bd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5746 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 r - - - phaser - hello world - - - - - - - - \ No newline at end of file diff --git a/docs2/Hello Phaser/logo.png b/docs2/Hello Phaser/logo.png deleted file mode 100644 index a37a23af62a9a2f7ad6c0676d6b64810eba89af8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180337 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≪FlD{saED?lL3>dvNW~evUg%I~hyi#*=|w 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∓M+E1WFqlN-7B zKMb$`LV-W)E>=D#sZ5>(?w21{Y;4?&ws9rk&KC-7!2TTZ~iG0B@$w_?dlmCsU_dkPHG6uW%>=I@KcOQnx3lGVZp8ysXmXOR85sQV83HT+H zlS(^JVG0HjYj2gDp`%B$S-;=)`020&$z!w985GiKb;JC=8sB+?FUvZ=RI{2Or3!HK zqoX1p%hq?twyo;G7Rtz$l$xnyOk`>j106?CrlpxS(4CqJC@LD&c<5ZwR71xjwC2qW z2J|QA_Jf{da`@mu0RW~5u@IJRl|1LeaOu7L2Au0R3{{(8xGn412Q0IEUNcTzZw+{K!-Zw=WT@kfVYWVum*6Y;3Z6f1q^3VAH2 zQZlO3@%$s3vG(V)=I7&Ht{TGp9G+^k@qL_7&%oNv`ZZ|z;6J|yXHT9&S67FenSr4p zq~<2YIA&K;m?NWn?C?RQofHZQp&`-MhVGtj?A*B>-Cdm+?CV8OU!Tla*y}82)WBj} z1S_<<^A*S}iBy4yuk+Nag0S?egbQ4=;ZzZKEnC&93;eRRDkX9ZT4aja^67Kp7ILa+ zaN9O!WgBt7je;3Okt51=SUhXp2AR0UGr_@PdnGx$YXA7woLpynoH1tp<>8s0KigF@>c0alQV`M=;c)Ex?`a-zsip%itfBR1S>xb{eH^21&I>}>r z;>l-l;@JPf+kWj=aPy5fqPN?R!IX)oSE|zK+vexy3Npf4}&- zFXF!Yz9rn-9Xqy3*y!l5@N!9OG=T;)Iu>W=kUDn;+pfG!LOZ776-z2N+1lMDgHlR` zsva1DO>vD4Pbd_Pw<1b6cO{vUJZTlG75qZ-mmALpAg`M|ZT|b*sS~2Z)85vKty>j; ze~BV39wY%>lydpiw(SB7^XVPWpHmqX9s2W#$X0qzA8q7T`n@(DPO*k(bZoJVj1fdM zpwc)@cT@RX%e{8nuJQRT83AwB^?Go@zQCTI=%G{SuGKP|A|a8Y;NFgN2cN~_CsZk)(vG^lx6Yo;m;V2$~gjtq%`x^`*1fx^@9yS9E0XY8TK96R*`%W0;v zbk5q+pG7Ie%2{;^%CugkOa|S1F2#%A{+l>{|K0e=-~S!@ckU8d{P* z(Vp~k16E083VfSP^YD?0l5@y$afLv;pk+Kv-}w=Mql+9}7XxE|Uk@1|(<1ya+2e0D zmGlTlIX&Gy(rx_Jd+)~Kqldja=uWzApT&>(>q3D)?OFiZFiHYJP1>?-hb`_Q?r}SF z$dJz6FN_y)Eg{PtJz@MldHB~5`2N>N?v%}1qJ{gbcm4%l_u5zDSAOqzacSH{cg)0o z0-2NPD$;a#xhwX%z9??e!ylh{YCk^r`LE#Y*>mXc??-Q6Oap#()rkwR8YA6=)WQN5 z$40P6fZvB8dCxpJBi0s2w3Su+EIj~TNdWjaYhn#$5u4jP#Hue5;P8~5iq7#H&jIjP zWws|bZuw=v%F^VFG^*|F?k10an=0()D=^(oNrgnF&hhghDbtm35zp3*Pf@yWz4T`% zc~Bj6XqwGNK6w?xQ!|*HUBHP`XRwqlqUn~`V*5+(z{rt&7M$&2fCu&s*h8Pij5usk&ozBEpA z1<8Hxeeuij=zaI%8}EK6ddZ1kS?0m3UVvr-tL5?0x)Fj^%Q5ikzJ|$YMymd{VeUJppGU778QA2A-VW(`kRdNx_b1VsR^9SGvq z7rzKsUb+|W{nroR``>?zZeTa=zWY8Lc;;FB&L90g_U*e0ujmS(IcQ>*Ech)Qezeo( zNG{Cd<9Gfy{mv6;Zf?e&J-h2v7FXp)=+V?1mrcqX-Kn`*H6+DUdie|hG4f1g2Aa40 z=4nIUFsi24D5i5rhoe%M3(-Mf2eX(jO1Gor8|}^CuJuwr>~*n{WpfBPcXkZP*?Bqy zbZ9B8b~eQdMK1w&W0E&lp-ss!$iq+Q8sb48y2-WgrZwf^=Iv`(w(;pX43kkgGd_vw zxh2}LDde(QVfTdC0FNF=CxOE3_r8HjE)6pjQ2?bqK*JHVw^h;33;rBwD1}lBInBmt z3X&%o4hl0QMxU=O9>YqmAYAHmM~+~}rB_L`R+XZlV!klt&URQxj$E*_@5CF{fT>-3 zM_$=-vptqXDLibQ_YT)YSOTMyywV_f{3^v@=^-JC_G#GOMkBicXd4culV&hX*NE62 z&)qFXpQm5LY4S7HaS|NEXLvrB`+du*GfFl3uwq_Gqa*Fj-M79J9f?-l|4)B~W{S9& z3fwld9YdE~frZg?y1Q4cg;UIQU&f`PdQ28iS>vH7Otp?1?qOnCkraX7?DRAa9XKfe z4%2;2bhM+jtxcGBJGO0+RMA#441Jwl=rd}@pcFO1Bgr%Lu|_7AutNKkueGD2-R=(f z{Om>~!tB_vY_~^BKc^d+R?LjTN+GZMR=CO2Ui-Jb;Lq!@u#m?98O@f? zb}XGfiL_P-9U2(G!J|j<)%)-BvX_!{4BkxJ>|Xp2eO)NZoa>&fSOZ-oLA2lRb7BRMt&bo{csH+(cFZoc^^XLMGjL)T%-dOBv9sVY;l|` zl^Vo4`uOr*sv$uRm*a_BIt60bb&MY_b~Es>;v{>)%r;@CK!#syrB7S?$%dAesL71g zbekJfI)=A5!-+&Z=^&-EwDvsb#yWAGrj3_^>6JvVSLuM%KI3|ZLU+$*lgsGYdkF?E zxg6jAulHebW*V_XLS(%!x#=ZXnVS)&8#f!Nnu$XTHtGTv!>E@AaSHuTLzx@>amO_| zYFspSA{0(RF{O8GWE7`Qp2By&T@|mpjiLe`D#S)$`}S?<>F&ZnZx06gdRUne>9bE^ zd~`(a-_`rBl=(`0E;`7eVNI|?g^War&O^mQlb>Z@3?U}0C7#JwN=F}&rY4D8I5%I^ zsUBBt)82^LqrCow!i=d^g9iy2nTFNDvIq}GoPvG0%d&v7Mhv@N>1o~&rn}hlx zdi@s){2Zt7WZ>RpDru)_kMWQcE|T$dBvEO!y|jk<6=Ux|L1@cq^atiElK=nlfdJm{ z`q$yQeOKZ=@A+pOK6n6~iFSPS1OJ8Zf9KnUxBu2}&R+4d+gm^Xy@PGvdVsuq+I&OZ z?W*haJp5l_t&}T5>kLNJ;PvTK$0Yw}Nlv~6MVqI0DWk+ylniA8c0UM#ls|*kK>+?~~_G zWJ|)H*bxn)E94`f_hTp)T6Kd9r83S;Ok-kp0jGz@F*Cn_3_CM&4lFf^*eIoT2&h$ST3E_ z(gIx$EL%D{(9>6h#^-<{OtW5_+0ipKyoKai7q9IRJ2JE)YTbYlXP~cLbsAE1I%xG6 z#d?;M$WJ!jW?p|Da+wC}T|J@jQ`boqn;$~IZ>tFs_6e+^X zC6^@9vbC;`lg@4EK5*gQ^vqclqh}g!y4UbfBfUn6*#Pt9O- zcodI4`nc?wD1q{p%Pz&%T|05#NB$G-WE>XBN!hk@m%GJVS)h*`l}lTExSW>yR0^2M zl|>3ZU9p9ht9nQv#(;(W_-?XjXCxdE$B$J>3%R_W6>V;a`i3X!PZHSE*)%$awn;x5 z-{HIN{Tfb~pCiCX7p%^B7yf}N1Y<yYijq#ZUoE@LU-29@*WfaNl=5EYbBuuZ{ zLDlO`q#YIslYBd5FT=z38~+MofP5%ZPOJqM}FF)%;l{<=~E7)ZRbK zWw3s^`k5((U3GXA9W+ATe`_p42Pu!0q38{b`9P= zY7S$rDGg|Epg_th0;2 zK8?$7xt$!OCd`~ZF6=SOsuk>A4R+J>Db4!kHSYv1hv;jY_1xC_8kV}QYMp8(IRO-P zgqaqtqbi{#)AJ{doJY|0-T^{WW;cU;HHwQJB=--xp6$jmGCc`yb1*`yX1m{EnYo z-u~j-6XlgueER8!k((M*9h=eSRqO|q8?T@#)+)>%rdrNV&tmS}2yKq7C^5~@vRyf; z_2wbjt4EE(PXL=vX2?4z2s@~(Q%TC(rzE77iLh+U!Dt(;y=;?(FQPLGUZYIY9u6==#w*T|M{JAj{LbNh3gFc+qau^ z^zC#uW3chEP+TroD{rn;?E5YXp?^qT|HT0Ryrz_yg~bIcyi);x{YBZ>%rKg|!tZhw z<2ehj?hE3|Yp=tn?zsn_|MQzo4Pm@+2s^xZ|@u znbIPQOhvuuQZ|o?i78AhBysZGC?+Q+u{=KyzfC|-MkyBbquF0o zIV{o5(H*R|$2*gJc}0n;sRUBZ$H8J>rlC7_WoKg42H0mX;*seTZSoH|-!Xb!U=SOimN&thqI266IAdD5C& z&~!z~RGYo!h<~Z^UgAYM>>F zn{GyPS2ynczke%(i-P1yw{{I+J4J8vqi0doJuQwRYt5Ulr?DC}Sg+f}hL-1W68whS zeC7R^wHGn9h@giYTdS+-K9nZT`S1=a-Z!AA)iaArFoVGp6b-y4Uo4-+^X%(lfPc~Xyt#!r z>0$J{gH3EVuj?=x&RfWADExkUw1}J9{diHk4?pwPx8i%>{05$Q_+hm5_8`*U$)0C| zypqJ&yMKRi+Y4`?jUXk86uR8h!M)sKpNr%vI*<%i9R!T~+GDuByV;EuRxCeO7UnV7--AO>J%K-X$N$05OMe2V z9{U~&bSQYHa1((|ms9YRBB&`~FYjggTxnl1(Bwt2o;i0!8cuT;|CXNbYHL+6TPwV= z-VTqwE2o!{Ize9lwKrpqy#7iyD-0i12({dnwHjdfWKCDdYiIsGANZz7Pyk<23cQc# zy2|vvz3p-IcC{i&>z5+1A3t*vm*03Zd?O)I+VuHq4fU3j_jf$usv5pg8}(O9)o^nT z#K;5%$Ey_Dmz_Z|a-aM{0YLio$@}H-275xlJk-V z;=Y$Uqg12tcp@REAEKdE+4iJ-TsH|%=DWEzdtVN*xqx$DydvCrC%hMCc@Sqf)zUN4+)9cE()TX97yULE){LCCChsUu0@h62-&&Ail zT|02;RafJq|NQsn+~j0{YjlA?fN{;JS{sI7tBS<)%N6u&-^oLr?LskUpin$V%k_hU z{tv4^iEk{}_|BsG-7OTVG4rFF zK))>-RT2Un-DvI`Y9D^`;hkUj!(WKq^{(HX$yTh<%YWq$b6a2e)3WjNb5qjv;pA1L zEv@3|aUt>CkwXIfk)SEyUTr9>scu%=^;n#UfTMbUz=uMvgiLD1?Tq!&PA*ugX(Y~# zAS{zWhdr;SJE`@s>!Mp}exmC%wN=THr!|`?5a^dN5DnwiTRQOOU0ryg27NAkK6`o; z`;#_q{+YKTH8m!A&u@R`6FB?8*Rc1Bedr8Yh?cT)jXVfNS{zNSEy$EY)+pzPtwU(2 z=`5^DXie~(dw#`i8vhq4BuJQ%&|f*+@H zc*+!myW6R2JF1suI`~Bacve$nua;kfJ$_Env1+H%YEs70nJT9Q=xQ`ZCn9rFHm2zr zcVjq(Y{ed{Ph}e}r(69~J=4eH~+sVtPY@h|dB=p3$~eTyo3H zapb}Kaq5xpqJ<);a+5+hTg!w?97fl{ zb%VCnHuUuNV(X5b=)4-@cn7gYQPV`v-jGQqgYLIAd;7K-78Lx%nje z+M3Y2d$;qWn^?u>IdReL|9Ow!0e*9AeB9zdIO6v^w@qzkbCYeajov@~9xE?4uPk6R z)D4j5zvq%mr2CDf0on+>qu~(Jxja_L!;JO}l4nrqJn`VyJ5N9It+~A~f9=!@e(|>h z*Z%Hbc1=C;U}WmiZ=y6mMIPROaQT~J&B7@kId)V!ZJRx`K`s;(i7*?FN}x!onLIN!2~6dQIdTjI{NyN=(35BphEKYf$Mo=7 zq$zZc5CCMCmo+dd>Z%jf@f0r^t%n-bl0AR9CS9QA!f%Cp9eA9eZMg$M*x(tCl(VBE zYATSjtF{MIwa4mB-8AO*4X5zwS8MMUflckiTdTZeF$4`v9ow6?H|iU->b-s^wWjMR z@VR_(PMvXHpKCdnzv9(c93REgU;ZrO9bH0M+;;U1hYPP)H9Xl+u0fNz} zTex-{4bwqlyB1wJ_lXDaSekmi_qrSK=zVwN_!Ey{+m7ul(QPN_eEDf1rIS3c&Wz$U zzA4O}bOtTxFt%*lZcQH+mE~4$mB1QW`_I+a#d`f0Is@2~9L97x3 z0D)h2VIEZi>!Lm&Jw3e$a`?$<5Xn>o$pEyVzq?x^0QRopgWD19=na?5+ioi#}GBZ7cseDn!2!=i4WR3Ti@q#lr@?d35 ziV#+oQYfUe%G1zAJBNnGuoI5A3VoD4$->;6%zxz~rKP2S*>g`)#4wj9Pm^}Vj`kQ{ zv$F?p+1-WPdKKuOJTr{X-u(^y`M-YxpZNNNIC_>s+H4MOAp%CLgeCIMu72a&ue+FMOFOk+Ns*6wV~C!5_k%B5p}%r+EKt2y|<|tbQv4!kE(zzGaWLSto)pZ$#9phG78)? z5I{>Lga{utTDzf+ICk_TVEcojOEfcj4t*5z$5;<3;FsrET;tIBd`pjalyp1;e7U4N zdu`A}h>flx(h?VXD9>mRNe5<{Ni&({s+qdX9s};6ANRmGg-s^{kSM`iW2~R58<T3$sIgAgVs(>*$bV$AdBy;vf5&dS){}$ncpiRTjK}YCl$K|vOoA6X z8s@pEeq`vtF|b}7=m$~GuA&3F{&e#r$&_)=aHd< z@S@-N-$+wbF@5YH0<>wr^S-~tYyRT>=)Cr3VcUpIg1;8N+qxsw)CWxE@2i^cu6C(p z%bAg)2d5aeN8ro$c5AAJp5ojj$`pCE?Y;t;nF&b^d8K9??zS)Bqx+PRLuZijW|@XC zj~1kN3eDcg!V#F9t;pl zl&vbBAcMapU~URPgu+cSXP1Y=CptQC@Tn(cpt&RYU~8|DeY}cWGteKztS_YU=XTga zrUrdivcRFe+BNB6WsRye1|u5NBep96;q4P}3h)ZJe6Eay-5C9^#h#<!+i~za_hW8kL_B@|_u!S+V)U7(l$Y)Ep~fjS>YE;&NJ^`G%HEJc z>P2k7=330pOykr4@{edH3^8ag#lvAc9*G!9ju74G&D@kfZR0|#;7*lCQ-EJ&kCD}hpHdz(lG^MNQ+q~g{D zIm+OU)0GACQnTU({n$JH4qy4Bw<1FZpv*FV@B0h9@}2*L@)g%%>ChAKH#MvE_3*+4 zKn&H86QF2{#pPU?1KZF}o8dBkL@S=PU&>YSqN}=2z`s%|A@v@7E147rD=zS+aie$cH$24Be!&Rl5=w-p8e_HPDy0T`dbFfdL!e$u&NQbEIILSEU9VqUwWye_&)lN@0R-J`DAFw-HT8vV) z;=a~-r4<|Y14pe~KxTcRq3t`|ay5OFJwI&k{bKCF#Q;Bp{xChRJagupJ-d*y1}H3- zFv=*^yLuOp;>mGSQ6@#6Ym9(^J-Z_2=;ek&QS=WD;n0BtXlZLD;N@}+d2@yze)bON zW|edp-2>`AM_wQk7FbG8mEEnfz@yx^D zCJ>AZkKNRvGSgIfa6C)z@~l-Zj&YhG$Px>Yh?`Tj2$-#0N}wmcWj8VtV=4!3*CY;@ z#>wici%ZMGv+ktNnkp)W6$5#Z)-|`dBwlfVjB1R$Fz!zXHMfbdT%OjlO!u>r%cHcC zRvc@(4rT~(x+h5Yu!{`t;J^?fJK_k&nng1yLyo}0{0wGBN65pQ!tx@m+1!F~wYz(J zwXTvLXDMQXrcQ0tY67BsS#^{yZ5I$FN^rY@?fSW~wp~x&atgwAyd7(8zP)20oLWkw z0nyO}4AU*ptJ;I#{Ve4|UOeW@UixDgKlC&XeCz9E06WDPT=L?Vqbc5ox#3eNiIEI? z1`F68ufOKO)%UR&vMmkMdA_L&x%F&RG<|izYJK(k@w*bgmj?>(yTGZNJ{&%yQ^C^n@_q4ZAn3xe4|XB z$?KO~H6Kha9`c6h>+BG2?-F^K%k+z#dv;T}cp5Y3PN02Y3wihxIQh)83i#Nh!}ag*T4BU$oLeI8$U;fDcT@Kpw^QQ-pKJIGOR}G7R+{`b>w1I zwW?^DOu1y>XV7OoCGLmd#-HYvIASfWGUL^sIESGdZh^J3NCxRREN*HeL&b-V3-WXG zbCO5x>+K;=J&H7W@EJ1pEVbLUZ436k{8ntg=~nd8-&=b7==C}grRVYdTZ-P0URuQL z%q-?8L?7S(Bu*bVA}IjYLMq2waC&%H3jVwHUWO%l|CzB7^6Ho5`J7(z`vMXn`N&g@ z(b{ul!MZH$OTV944ioWjq@PDAY zvr8KI2Cujpo!fR{e)Jr2WQ4i#(Ph&xfY&S~imTrVWBkRY@@;AH<9d$Jj z!;_jZ^cY5d0Y0O%=g#27_a7zW-wYpp@9H0W4HoEr=g4@6w8Vp}1LeH8sUk*Cd$a0% zrzpLZ_SC?xJ^1i@{u-xGo{7tc1 zxJbaiqLh2l)7vcv%p{Qa1uU8WDg(2jgt_=;TUwVz4kF!XZlmtwArZ|nEU*?$Yr7Oy zSy!ipjKVnrgxv-vW*TLRJlMP}QNvCBZRph> zy|1Sm2fz0aI(mBW)>q$-xBu&hfc{HxXl6w;X@&@>{1m=2kd%1L8vzn~+lJ~OlLKH> zJ)7Fml6N+=)^OpJO@5RN8Xe%it8T!pzw<6U@ZLX1tg8oyzV>;<5?$DP`%hquBB=7* zBzgX^I!}y4U(S0cdIrTn1SnFO9-ly#JZlEUsun@>=>ukJ$%Q8J%DLd~96VN83_tM* z+Q0h^L>WBE;Bp#;XCANt%VpD;onJtAcaP*k$BrErk9Xg#x8la1{u%O2Z%0pmw-U^P zYOimiH{M1cSH^v}L}(LqV)D|xnBr^yxi?{XeiIa)!llZksjeg?3t2 zv{PYP>7QGU6t(53jaF;uqsNEx&v)K%lN7Pv|E@nqg51y$-J>Xh>6U%h3->*}FstSe zd#1xR<~ofAuitHKYjo-?)i2_9=o&RVwB5g04Y;tjG2wzevvgQ3_mR85pw4o71=qjo zb<)6h_?!0$|K6GIR->+Z3{8V`!&ne*X~FI*ufi8T_8~m<$ivvicv30bJILws(P7SW z&Cqb7cTKoIzu9Ao)jDg)d9pE42fM2J`pEq9r#RC5c2N#c?K3(Od zZYFcbbVtkHELDhEGC>qGIpk?0`a(^f8%Br9svuJk#eWP84XCx{?n?Nz%qtx}o5Ncr z(QBHTs_0W)rd*&a6Dae+9i#{#(GtUaas?^!GHik;4&T@FOt1Q z`m9xo64ECQVv2LOFMTaC^Rsy3&VNU9XD=TAne(P0GLk{Mzs<2I7MGJE4#%>$nN$up{Mak-^0)meF2DW9WP(}}93qz_HO2SO z^7)Zy3Lp{D6+nH!Lq!|OTvaqy;w^2s^$kBMk3$bVfG@rGUvTh|C(yrr3wpL}m3@_& z85QFb2sX>e${^iO{x=)2;liR!9%Dt(krV%qyZ3;T>#WYk&%M+8_P)}pth!{$vLxFA zEE|jsjt!0h6N)KufIkTz5C{ng0rSyAC^j8a41}0~!3Eq^Y)h6U%j#WPl`Yy{W_MnJkxzxST~60* zC@zL`(nyp;SErA%+7oDM%-1-3w!kXORvjmD9*de#oNI(9!JnOLZ*ik4mR zS~_#+faSe@*ojF7c}e;33Wi zZyW;K?1P{>)m9OrIW-YlQWKUN3_+T02TswE5sorlUZQ-CTIbE9oA264zr6WP)cMpV zj%H`j=AV3vhEH|SinsrNYPk3^>fQ1vl_rxi@=lt|Cdix1 z>-P$$4vhN+7p)e4^mDpuem*1}`R6a2$v1q$wxIIiltI=S{%S(NK4BS>><(z@ne)bL%D#L&>QEX9Fil}b}M{b^LCmgBta zKVx9c($G;Dd2u4P4Rw07^i$zbj`HRpGFaM7AyWTGL4DnUX0fS@T(0#dAgd5{Tu~nCCHC z7A`LLf3yA+#{9)30)I@zFYnWR;+P3!PdGp>w*555(U{j6@3YR^&~*pAlo=aSkjFsq zS@g81uV&cbf=_40ymqQ?K;&@ zUGbENE_m}9a;L^A&5rE&-ILVz+BeXfZoiw>f9~&T&#!(=6|J-A_>&tbIWk0-yzk@G zaOssayk|S5yN;8^#@ii(Dvnj(TLmP*qgm>x}jSJa&J(tH%Y zr;L_L)RV`hqBCq{Cw*{SrE+>^nwor-NpO#vPpD~bp-HH~aTa;>@Ifhk#wx3*ZpJK` zslfigtOGcu(y5fd9KjYW=SvDYEzoQmuBvqmoT%My2v~~#+Cs==YMP64g~tY+*DMJX zm(RPYeID)F@CfyvK0zUNRL$)RXz``5k^wF;=$gs(>@t)SC~1cbmQ6VMIg6LjC}*kP z`21&uT>#FrCKk1ttE)NE&uXLZa`uy{KPR$7k8R*y%%qbZJY%y(Z42j_FDtU=k1Y56 zcMX4!uJg~?f8dbSJ(0>cM?-!eFRmgL>G>wP5Y=Kqr}}#oL*&`%fxe08@DJyKlnIM$ z+tJZcUJxPD7yudRR{bSI@aKZQ)+G=rmlqYb+q9G%Uy+T8XzgN{gI~9E*DiGt`28B$ z_@B(MQLt3XR>ir-D)t5oX17yKKuL}F4h+%uBd6)`nPD1EBxNYfpGlC94SqI0B4QyX zgjaZx9>447lX6ahTSB<)7#kANVI~SbZ4{M`M&adVum{ zBjm2AbRdK>K&1_Yp_#udM_`1ejq$)q8c?YkOVH4c$H~P;{gog5M|${+pODf|jt$)t z-~Ttd;v=_E<6WM*A~4WNwQ>5$4n2ljr~6vetE754 zLc3H(v21BMOB=o@SsKLX-7a0uwuE}zmcE3M=8YkMQg6Po-*+IK_@;ec>f2fxvGXn%@FxbcFHiK{5dN^0ilL~qb`)DBIuH> z*hQKqTGI%W$_BD*n5v=c?9w#W98f@Y!0;8c=({}}27`inaRATd=Oxp53ZV9{XEn+N z-7WnZI6k1%3O1@sCQj8OC*>t7V=7gWmvA@*OJyn2EG|N)*-KG2^p>by6)4%?E3*tj z!vR9G07`OE3P&p?BdDmZq9{8Du-V3HLOLSPOQU%*tug~No-IKHNt1-Ht9FDXTX_t$ z)um}9ZDsrk(|f~c=<-^r;f(&_pZ}PR|CsbOK)F1VBlZIuA62~$m+PD&_V^5@e3p{V z(uzV!0V#C5Lpr1W~{1k9gaq{CFjfvFa7C$Xv4g0{;ky%L92+Ho^JM2hEluZ@7uB zQv$C$A5=_6@p;iALRrk~udlb4cJDt-6|qrrfC3Vm- zHd5H|X9oJ|O>g}xs;Q|VKX2NFA(LkM4GQxjI&i#`p4fMk?tOAEZR03^Vj@X_T#{Ua zU6koQLHPtGc)bD-gfp6!$?8&kNk3l)w(%!qh;Kp%FeRLr_s4URy|xQ!bUH$~lXue)c@-*t(JY z9NA&aJ;%qNx$;sr0=$9o8F-Vy8J#(OQk)nfy4Sw`8YPYap9@DTr8AXDxpYn1rJIsA z`I=idBMqTeF37R6P%}y^givKg1ua^(j9zoqRkZGkb<{p@uB_X^v2lvCkwg79GdMs! zJGWCG8hMby46^Z07ihSDP^1Clz5QZj@D#&H=w0@9U>L8?ZG?7gGPg zART}5Ns90$1fg4nkrO^BtOK_g5_QW0eveF42fS#+x+HoRI_07&xnZ(69P|mLL^$Xr zomdLHD1MJJN>QVBWDbn40eT3wQ-A@^^5=oU&gD3w&K1cX7Ai`HP*UG@bf4kpl{8g# zn9mIvgP+e0)6U_L&*6!OXpPrn3MGio#}CeqKplVqLi`Qq7Leb2gyupT&3YyS{Q`&+ z!K^_Xd}Oendb>{3>BEO*#^v;hGRjX)13~E`hfV%np?*ETFsJgOR>i5_D%?D|M_vc7gr^Cmi z(k+^vO_V9r!Px<3+`eED{rsmtqNlfSr3wsN@;R(%pNs2hAkcFQ#e*sjn>OyB)I33o zGx?g@8v2X3zmwtxgN}Ch%Y8InNO#w;^_5Y!s-PYB{~l_2cwv;6;rIUaUn%{P8~@L~ zpkKYDh9CX8H{s(px6Mjld-YYmc%FU@T!EK^hm-j}RMpJW}bb1ToQ| zUl~?3S^0A&bbUA&P;(G!vY8|5ta6qW(SSGz7;HQz!pDzA{DKgHV+irzqA=iYQ?n>T zbxJu3(`DGe9TGijQ}rDn3tG@Pcbt1#YZl}0X^!Lz0&6yv4uLK)c{GF-P6M9@V(KC7 z;BXC0jeB={{p{d_V3B8288b~xcoKLzI-K} ze0rNW7DpV%p?sc>910xD#+W9dXk(D2uIE<$g)_s$)KFDP>({TR zEl)i~<7R{oCoI}`^n{Fsdq>WYCq77p;XcvM#ll7H+=<4|SLZuNY0E%_#ZkuC!Dj^K zx9lB%OOt%eGrP7?q^^;=_CG_3zAlc$*HWONl`>;PR0Pej7ECGUXLp*~b|zpwTesD2 z4Cmv+l*?wR>4G&9dG_qxL19jVdynjw)V_B1d`fY&7Yg`kl%wqtPK%+|wPNLkbkW6^ z(kNde!K~}@7>vJ4i(Srjw;g~DGnHr;5hy!UJWsIL(AOn$$j^Wb8Xr^i3JnbnbkXY7 zv~KOiG_!4nh;Mff4pY{2i?K@foTl+p9b^=;lk5dM%V zM z3J2KfWQIm2QZfqw~u9| ziU|2p67zfHIQSc$i}ykX0^|{pWk3!UL<`!~`toYPt{~Inq^Y2l;|+o=Q9BUyvuq`+ zQdvfU)r1TNjtov94DNdVjtAC($LH2_3mye61zHGuj@K`;w{bSkgJ;f&GFr#MgVeze z;nZ<<3Y;;H^L0lL2&lXeJK@UOI*L?PQw_f)H?9^ z2AgMN0~`GVFS+5r<-Zs8|1pLif-HZHG-fnDmb>9^KT@m-xP3#Z5{>4-$8r|j3dVvL zM56n&cxS`ye!d2|Oyp)c(rd5tQe!wsPwqOvi*Hf}Y>bl4^lmu}eACpO9Za#MhptQ~ zwT7NA$`7N71jWK(+O=mdJ@mU@Ney=Oy4O%$b2E*e=7rbSBhj;qQ(W6Yo?`D@O8{B-ik4HV_be-M$>;eFJ)cm+k8+XTv1N{&zA_sfmEbv8Eo z*{5NXQ|00#f*5ICzM7-^Bn=!pL{T>Wd$vAKHH}SFKXbO|?-qDd_nbV=hBr?Uj>2Al z?X@(kQ_kEdB_2J+TGZq3Fv6Hnb~*Ib#cAw|I98f7f$`B%*@TN1 zE}%=-tfKktv!!u=s<)34oI!%VxiEN!l6~E3q#yJW?1VA=ButNd{0L_a$TsqbgfU>p z>!f;CGx?%bwELllIb#SC+eE5#6(u9Zdn39>G+YhEFObH0l_8E`1_6c+eGIU&x)e+q zk@kgin`p(nW@>AwqN)f-w}zW)V_{l0w^0mwWi+TF{4i$`n1(hyVwk}AnC5GXG7i?D zR~&()n)Uk8$^7@N|yfCXY1Z?UEXckEMMwHBa;%KC_WYbOQCNKC8)y|ccD0q{T6ZxM0t z-MN#xIy))M*9V5VU?@gZDdR{~l#|*l%4Fp@YL!hD)#M}QCs0r2-}yQH#{(SjqGzfJ z*^mhcjEe7e4>96>5RLBr!YYFspr8rhKyoav=(WlY#VA)KQ=%hXj9-hDM1AqcQ^ zHZQ(5%vnc43`vld&TgQ}SU?B_VF*Aaje$ZJXA(g_bOZ|Gi10U=6>yX21fZkOohu@-gnS$b$1f>_kA z$2vzt7!IPKqx+ncfY{MkF3B_sT4w;+fQo#{kw3I2jA0;i1ywc*_}tS3)a9NQm1-I0 z7jiPk;NeF=elF@h6rR`D*H4A6E;?fEmHXo7^<7cLMwr)FRc$TRvT>ikcq#4PwuL(R zc_^bTUUMm}e$Ca?dE}t*3CR?*4kVl!x}h>BnHIKGX{)KZRba8V-umyd=IlXa?3M}6 z20grYvPQv~G&gCAuGu(S5XPpfK5WN>kUwCWrSvWiS`~nA&|CBK%MgF9NXEfL9Dq<911BlWB3`bREC5`p>(6)#Fz^Ue8n!V~$ zYF%-$7(X;c4NL;M+|QD>dr_Tr)ct`*;fQ|h$bM>BvyNIWdIfcE+a$;w)G1Hz+{!6( zEj2D%#hW)n`S_?pZn)gfizs_mrh$l^BQBtQh@-U`7p$TYz7G?lLlV(67>b^ z8f8EU0yM&#V{ueJktBbtnj^k29eV0X>OXdpf|V6i?J2RrbqVDJ-d@swQWM$9$t>l- z#ePWeu8=4dRI{X{PU#WhUeLQChLE zk*YW&XsnKMM2|>5BSs9)r79Yr*18JG80<0=IEGN$uZ?k}91F_dLIG8u$7>MjL&Xe6 z8po-O1myQHR;t0P&L7tcMjQ=i)b!yfq`s{w3Y?N1G7va#+&4WxU^^F-NAY~{*GQ=g zy%1?2`-O`MEUG9MfzkuL3&4QALVLj(1IoJmz6rjk$N;)ecF^IyduZ2FTd1e=G(}@E zA$3(?DVH0X)PXh7IIAvw-Y*z_7cZ_@1ufvUbB0s@Bd5D5EYY3iL_IW(4r={gEGwNh$)luG;=%InoH+VE?m zD8nfH{-a0tQ_cLP)Xvd(|Ndtv$=AsjiP7m@PszYh%LQu$vW9DisbFRNjq@6Pp{)>7 zG0p43&-X+tC|FxBQ?ZfiI-0R`IUU~qge>wDXFA6@JwLi{my}#0Y(UZAjYPtN?it~9 z70q23X7YDyxrhz~T$4tJCt zPen9F7cE~(^XIflM0fI352e`}1>6=*p6R5_&;a>4n)FuH3%nC0pnN(*fmoCp8>?yG zmaWv^(Lp|rBAfhbN;_Lr;u)3vIYU987)&o4EJVwu)+#6zO3oB#O$-fRFMk$mTB4=K zE{ZfZ4yS?PFu*2@9BJnGJ@SGks$ru(e|8N`ri+wF=0tfd7WMOc2ib@k{F)LQQPl`8 zXz>)-88l-R`C&=eFbz`EwyCr#`}q8-l!Jc*jTi{HrCANuS{QC*4=}{GQHR5T01gba z->VEXjGo&b7SxyuaSASb$V_P{V^=`~!Qrye4jbo-5)&eJzc?g6MM43J^7@8T2n%(G zM@m{gFaL}Z5xAW=_)(L-O2`Jva>tJxrY9fYNJkFth^NZfa_wpZ)yDw4e8@Hsn2iuXzP$HE-oL6%8TSsjpR3GENC>s?KjZ5~zlw zNr5$X#r4-ynAg;Su2JbnxXvNA^IQQdFzB_jtLf=`@1oKEe!MVv`%b#;zDud_KcU>? z{v+RRJ1Jf*-|nZjn%(?!MaXc6#|;|i4Fb%Lzzb6xaV8TI={iz?FK{Zt#TPM|RW-_n znkpsEjs~mLi#5@dUWA6FgfxmJh<)hUyP_I|65c&@^liwQp%!p}Hvp!A!Qq2CCN^VY z(hyai!eoN({lPbB|6`BP6>obl&3ollG8L{7oR7}N7zh)1&5>_ z>h$2yVWW@ZqGW`u0Ciq)1fgy$Jp>Kw9gB~#0~qCutb*S5#%pNBq6M^J^OJO_;}pf% zu$UtQbn@>1qUiiZRL71IWwQy+;!1g4dVt6}DGCUgF@-pbu!gGUE*u~lsWHCy80<=> zvSNe-K{rR-YW_pPTCFK`Esmq3MMS~)FI!N9RWRg;8eMLX4H^=`XEFsr{lJjptR^S( zYzSR6qmiThNS4kFB}9A(eTSkhmLju|3Ljtcq4=a^7((?RVmfSS-6~oS_)KXq!zsaX zyZL=#*u%&g_!whJ5=UU8+i)BNIdB985u8^UI-15(9>Urn#YS4PJkr2MnF#t9aF%cs zpfMKu3}G@=s3vLN8dJPRXkLrTnwDC`IUw?u_Yr7oUZ$v}|B=nIL*R_X6U4;?SAUerz@w;D&c6>PGJxLjBjNhygx zDSKI^=V^#?q`;eYB$=iH1*t9;R`pDbrGuNkq@H7N8z$&>Kz)TcqvE?93>B&K2ATs<>R#SHLs(~-*z*# zz4|)p+q0cAecci@8D2mA_e6$EGS`4cc>lJIR5?CI>puQPirx7G+WXsIP(@=4_3Yb0 z;{$!P@`jtJZs{r-K7NRbW5ZI`aMCs}r_&WN3f6E`&)E@BD=CiN2YY*Hxcd|hcAkV< z8clFyEDBg`O?=@PZ*4al+7yK%5vr}NrpjU zCL;@i(f8{S`iwUIexL80n;^i39Yb<>4IF@Q#b^#CaR3@q4o87<5MZBZ;yWcI9chim z$7yJIgl06=(|g}~1MNO|h#q<5G3p*oQZ=uQ(S6U*2uF#v7hOuxrZ%c-Z4`}!L`6ZI;?J^$RXD z3`%^4jlJJP6%oG#K&Z20Ff0=C$vN5sV7Ojk4K;NOTF7)_4{>5;+5n~uVJWUFpPpfW zGmvtRyQt?ARMr4vjZ#-$C@3r^lTg=BXD0UcWhW~f_XW!-58?|=*Pzck)i;oGpb}Ne zX7iGHXL3RLo}A1`HZhq=QyK$$oDJh~_OPts;PH+3!szS2_4D6iI1U__+huC!Z%(W2 z8}@*t{Fuv)!|8%fw}D_@lgV{UR9Rky>^>rPQLpLTM}XSoA!0Ql!#2Dws@@ zS6}2tHcllr97AK{R4qI!mI9T+ibF#c&^rFRkhQt=CL@Jz5hIK5ZcFSvP$RCQ8oY^w zf>O5xR3Hxa&M@k*m4XHsj!#gqvRXFb&PN}lj-A`+RX4tyR=)m?lx>?!L;IhhB4-As zMB(0Ze<5U)$Cu&-} zLd3C4ap2Y~C|F%jE{@t^eB=FRXmHOnG=QvxQ{-{bHE<*)l)*rlgkn;!#^y#n8U`*L zs1llDM7Z^pZ1B&F(18;J(%60Y{s-v#x4uoHAfTYKd@QdFOj%OCff2_b5V9zUdW*P= zb_P}%^iG=l>;Qu7IP$#lvpV|6F-mq5808;+!0ye@hpu_WO%J8*e9ZwNjB(+Bpm*FY_2DIa^ zus18JDl<2{@r|B%(J&|Znj|ry7$4Cd)*gwsUXVcqTcd#q(CQ{y)?7{VLTs=CL5fvZ zQUBl&4RaI+-WHS?4Dh7bI;kbCTxDv=mrbUnalfX^oO*LjWsBM+>ijYk!#5NWiPTWp zNL2!|ht!Q1zYhaKd_xazevHl>+DrAb=ThsMSBdY*#z9q=RkeTfMY!IwDQ8Rprw4l} z(S4HUTz(DJ%wIy?+nx{yI6OX1hqr8^`sNmDTd{_heuyR#3F=`daNvpcw0HgewEwY( z=)|5KG{zYMsFg8j<_?5~1P^SP7%XaF;||ziV@-@2tHMH7hMSX4=P8lS@V|XDnn;VI zK-9l-&1!0&H(!jfrKJUJNjpm$WP8vIeT9-Pix_2k#DXQ)7=M>8@z}2yE|`*%#lu6c z1L%o$7JyA!(3AlsoBmfjl=#GiTOXdrMtb}C zdIhQ3U!q!{Aqrk-eA+<>3^5{oh{FK=Qe6>{NZH1~9PGYflo8)*I3pR(zEoNTQv&5mB;IhuT`)vtl9Cq0 z&pth^>v5^<1fLmAV|-p=KCldDdOiS$?otioqP-6_f4|}MNz^{XXUCMYXeIOW>MEl& zFdC=9__$4n@ag($&$}`?YZo8q2!ABrbkx9)yGuJ(erQ_B`$v6$!G~Rl^O)DtEJ#2Z za?_OBj=+qQ0XP$pA`yD!HP_JWnKNl;Z(N+5Tf?Kv)ybY~m!nBtQP;#lO~QKgXFsvs zQ`cwK(I4=Sm!--3*%$unmm=bSf*(R({q*CHnLV7@R)mdkD9zE%;0U>}aWql@3revd zY8utEMWRLfl+!8B47{NTO;j~gT`Wp#s-~Xus#VMBVt(v8)lHioevD4<-N`|`;@&_l zPRc--62xM{VlKI4oX(y)Rop46K5n^{(eViu+D{`BNf9&8=5rMF1|d{7|NR!!uhW?cVg@Q;nz|nABRgi|_5jt>k zRO+tx-+ec&U3a+>z~<{Ga5>%NHFSg5ZKv{*BCEd(9RSkgvL?H2{DlTVlfS{(V=%~u zfud*NY@ci~OW2XP`lxW@mM}^EB1g*3w7*?)|i6(LDOW?RQWr zSE9*-N9fR&EmS>wj_4=Mt@fetNCBvE;Ti!QX4w&Mo?@KoHP-`Gg9%m`WX;rKsrF{T zSD^7^P7JJK?Nr%QA&=6CA*Gx$FtXI$QC5Os#4Q#*VbW}tR+$F7O#hOU{6Ya2jg9AJ zub@_sG7**v?j?c`7-D1)q_O45E(}xYU|=XqID<@ejf(}1&M|a$kjcq?SFE*)jI1PF zOR8UiQco$XoV3g?7$rFdaO^Phu7IC1A{?V;AOteX2F~wR0zEe28h(cvh>V2x-3bnkulvlp$SB`Yta1s5)-H@yFywEy^PsB`~* z8a=p|QXJ($R}_dDw=XErOW~L?+|mp#Y5s9ZXQe5ur5yQ|04oh61uZY&v}2)=BkX`o z08#49h8n6!ra1!P=(oC_JiKe4x&OCxYS(tU_=dOBg3GR=^yo|)Ij~D;7z}nMRvFEc zJ!_1gRH-8;bi}wi7>Ef~)yZUSpsJSLsE@jKY?eBBF&GndrD$cfux9Sr@R0Ndd>qXO zE9>QEV`399*H|PV=o7z2S-^PU{qnLQ75W2YU0F7aKCdZ*M&Y1`Kc8w4B8_jYkJ6D- zBh=W`Ob`FzetPH4H&cCM6OE6@g~_z2$=Q&R+0G1x!qSaD{2iqlOz+C?^`@~ASVE$w z>!)}Q8~{pHZ~%A?dI33IR>Fn_`Um_l7zP`MpgLzC>b`1m6gK1#i@_$n=5<%m@?}fu ztKYbd)<3+S8f&X4G1yOup#e&TXHiXk1&t(LI06%W(soap%^?l-`@_8lui0y=PhBGi-Dzh-lIQ^h$;ImxPmvBknz%R%n zAdWJbqC~PV;x1j9Lw_sp;^S-Zg+$+4icqG3r95hg0-iK^5eVQsT&j;yDyb^J%c~GX zB{tl64=O1ZQ#8S`-DDz~UkAtFGN)_usw}WX!H}O$_YF$0qrdLcMt|DZeP5rOICL^Y zi)Q=JuD0~rwk3z)hHZk8FF0jGG1@k{S4m~wR>>4az3KIOLqH@Ba_(8i-X~yX+I|7$#zrX7d5q#6heT%`XU}_V$o35~XNOy+q(L zd0bsbe$l~o2_gy2LEx$@LTY+bP!kxgDdu&v5BO}Af{!KhQc9?;1P0tAh6D9f7(Z-q zFk;SbuA~KR)wJ)#FpZ9m&~NX&lRo{$FR^hQ5JQZHsDVwApK96_WX3^l5VxMy03KV! z+F>wtldN2b+|Uhf7`reS6!~><7$x2K&1DqxreCyv{c^0Tnp#Tn{Y;E2-XEJz0*)Mw z(xbQd!l)Z-{S<)OeE)BzUNx5cf!n7nqlk6}8ZaFTpSDc&2Wl28( zpDZ<5;4D{BU}K@nYh?Xcn%+c}II(9DOk~m=%pn?94GPJUR4}CiD0?WZC>exFL1c7j zU|R~JYF|&RPs{1sXk?9PILNe;sWc2u_YXP-#^W|_JD1^Ew3z77L4KTN{P~^w>}!k0 zu}e>@A(JvRKabN5aOw332MKmnz*O}hn4=+VoJ07fykc=y^#UvfnN*r8qC_q8+HJ!> z!~Z#I&HO8M+fo0YtIq#Y8UFPeHflV%alM)O=tpvqu*(OU=HZk=LrB;|YO$jE3ceLp z+9`>?ZmFV%(lsqKKjxup>qKLncJ0_nciizy8sKPd4tq^8I(qCMC555Wr)l8mVFe4U zYog%HITW5TmmZ3$g2PIE;P-eJa7$8yimU{&6?^edYzzzXAyaA4~QRkLs zmLMkFj)QXP5&K+0rOHj!G1>S7W8*YY3JG}}IB@R%{3mGHmDkaV>)t}q)>$;Tf2Zh% z0)FXbLk~`VPbfkr8?hWOjQC(5bsX4BgQt$saOWv@Z2eLn6s0A9m?BLxmD&@3-Uv8V z0*Y59pxGF04sk?oa7;ErMWRQoB4v0u8s&A2GKI%uP;+fSG66IVb43L`gaZ*&2R~Xl zD!%#>KkYoyPmRs3boZ}+LvMMJt* zB61A!470;}_j~`ER;^w|AOFxtXvg+#G<(im>K#o8ACCo{<$Ov-Ze+=XYk5>>bGu6b z4+9Q6Fm4G(-p`qUS5t!HJ2-9{Yr@ptR7s0x*U`+TDj5u$Oy(rO@M}rZ%w$2DwWd!` zkGc&_Fh&yLr`hW!Q$=OqT`HT&>%Zl!f-;gChFsF)D!6CDC1WaQVyh2^f+*dY)IXG> zj-D|-ZeFqud{#^h0~u6T9ig^xjCzNXG|tY-Hr}?@1IXm?ubd|6E9(7g`z)LXri)R> zFY5js&OvzYEk%fk;Vv0=D=5cfk%E@uOof!rn9?|qppgF&g(%QyoW>GK+rAt>bl;pO z&S!jV<9}Af@05Bb*~z=yUZ)@B2+TX=UQ-k(rbjc(=JVPi>&!sYPCN7|+HsYN#d2rk zME!#7$)mKJV0-%qXv!g&PY?MTRifL=CmB@d1JV}9?CN>f| z+Vh8BQ|IpOwDN{`(5#hfWpWm;%cN5j@9(9N{d;JTozZAdr~DfwG0|N02gzSiqie^e z^es>y4f<`0U9W5wY^1zy+>z#vm&`&(sz|-vWH?zYnvRp%q8Nhem|qNtB`LRCh{P}r zip}fynLAV|MQNY(&xVVH5%4Yzb(unOq_f^n5>k#FpLCX zdstkEAl+_B*Gp{7?Ye)dEJCs!t8H*$&>>!L^7HeWhdr0g$hFJzbqui6^y&Ek4EEvq zF#ceZv^O@sgBoJb?q_K3yajakLl4mBKlLg4_IJKZE%oepd95{jg7h(77vp^FnDiX{ zs(}YWAFybeN~&>`9oH~BpWal0`uQ=&S;inV4<^Q?jDfoR=(vl9M?$pkcpu&K#9=}E z+^}vb-T2xIXmDsk4~$EpM+UqsJtQUu#ig7!qHmC~1p}%; za;(H;PBIgPbyp2%JL(78s8}pHd_k(j<`R?-)@r_JNOWJ)0yfB2JOwx@Qv~RfC0^rZ ziM*!E$x4tB*-%y6o4^c*crA7f43(EnzWG9oP#&`b+9P zbB5YxwaEt0=kw=5LQbhr2~~1H2}eM{Bz5vAC5|1CA*(=LBL$jfP~(cVl$o=L(j5IK zx=&GhWI$Y`qCbwxRmnv~ zh<=+U+NIQ~?7F`*1$-7V!WpB7@eT&H*tn*D1~ix*BpSRqIH{m|e-MSms;b4ArP(km z5gwN_nR)#9VXCgGr7zv~En2(omGpP-`yh26I!x|`3#cXKKXi0vjkz;@)(eUH`PvL;^XjSSZI#oB+lVsb zESi_8iGR#hs!|VFh9y67X&QK&Xz)CIS>*!5GC;;lt8LyKXXJnnKTWgr&sFYmzl6tr z5QZPuYSSYRPTX|;b;a6>psQlYD;^gH(*h2eBQr!WshVc;g~D_d2kk2(>eTM|$uH=k z2OptGG(zq3+Ert-SbV`W2vhYnHWcBg!m7eJ4-Zi4%xRfw^;g%6w409|K(@Y_((zG# z3{g5cuF4%8`605&NIkuzQ&CGAWTKknF{OrSqbl%oF0X2cjkPg~Wq|%kQZ4{0fH0ld zv4xIq-Kff2K$8TbWcecUS|EiWw1M{pDV)^y4y(Y0Cnc%*fazEnm<;*Sw;g zezWN)xpEo$-fg$hcklR_7=9Rghi^yIEf~_I_B(XUn85Us5_2*2Xg2HLcJC4KN+H_<~+ZKK!scF_k;9Hy_m`t{^vV|Zd>Od-&0@enkY-HN*(TuwfI z1j1ozsj8ut`3s2`D&17%U}L^TZ+riH=&^hD&?KMzU;o8Qy7;0tI(Vp;ObaC}l+e^M zF*r6k34MYhc>;XiA-AlB2!^-|P~JjWgby9&j3xvGkENzY?e)zkm(6JWydaX4F~%*7 zRq$Tp$o$c*onnL=>!X4SD(ITJ+#kO0QJ0_M6KP&|E-8ZyjHIZJqkd$VMa`RULuZkp z*k6ja+EjCw`J#j67hxWgoS`ll^I}2WTesE@C~6w%4F3^5mx4B$ilI~)*{HAU~ zTYB(w+AxxXPSX8i^a+uvCi7I;G|L7T!6dam3vT&mDEGXShW{ZQ`MWmW{|9$Z>3fs) zAtMs;d1-(*BL>k0&Q@7V6TTR=g-yDqfhfu^ILZ;&?LYdturq>_9h>}oQT~hJ!*NnY zh)Za3@hqQ9h9i9plmRm8Z)~A(buEpt5on4esII${y88w=Rpw2R%Sm~~l(Be^L;9wY zcFWP6MWl=f3=RM(^_-?!iF7&#Mk(V9^Lwiv0qUJVhtyR?s4^OoO@VVtra1zWjZ~10 zh|MRI2d=3pQ?JH^<6Y5!Eff_j(BoEee!|+w=YiB4Q4<=G$eV}9QUnYQxZ-P2<}q!Y zx8)p9$K^ByNKug-8rXkz^-|if;}p3nTIs%f?xpJ=_yb*j0;}Yq+yvP!5 zx@DD(MZzvU_fT?59tB-)M!9XWpd3F+j-o&+A}q>aPNvb9QI1{8db+{@gcja!%g!!w zAT5nCRpQXS1kf@lK@p`5;Nu`7h2cIvPC8okEZC(YpU;nCR`Lp&)NAnNBc*5&N!8X=7zx6 z#8e)a|GnU-|9hXDF?{1EPh!k><|J5Q^C}o9($rw#xuhKJzynOOq^ES1&aXf`bmm8z zwqXjYEbIX6xFAa@Lw5XGqB9pzti?l3E$yIgF#1nQgLl^dCR7i;kefZmk5_kf_jr#y zwKemawU^S|+9(ZPyJVXXy7EHpr#|EicMFAe%zOryRUGNI@GakISX;=}KT4 zskkn?(~R0mYOSrHV?BdnQmZRMLRbY_1T@Wnx*1DOs@f@UE+8xN(oe8B`twTpC7-wS zq^44CLN5b6Ffv~N?0wKJTtkS|B7)WT3-r(@LK<#%C^=G>(x9psr2Aa*TGd}Qw0z@~ zbe&PAV}SKN5>M0oSvB;I*Da;5-?@W7LyW%mr7zRkSFNK+B*NDxRjj}k*?H<1Ra92fS8u(QR;*l3{|AlVW5?0^$#Uz zWFkuqRbgq|i=*-wGArOF6&Q#%Z$Z`7#Sj|`R+-Bd9L-<^8wf10Mm<_O($Yg#rlv(M zmXrg*eM7LKD5<9c5}D!9YZv_^82E`)Mhw0Tk!gc()9R!2R96|J&HE0^`{~PZd-oIT z#vIH(%016h^0A}-w_I6i-S|oAJI+j|Qi4E2;~&F-=bs!k9BSso)XtgIUODosSXyB2`TMv%uj0q~)HM%kbmt z_b~j}dmH|6-y|FUQhU^G7U#9nj4d~1aSnP(jnIb&#^)GydhDJsOq2q_-9!GG%dIx|A&^UZM^+g5%0xCr3ii;d2 z8qF zUWtWZ=mUyGOw^jZg3!RgmW`J$X<{*#MtZ<8piCttE8SczmX|lD=wp;&*1a|ut)BjI zdefCl=#i&SQt$92?cINXe(Hobw?g$mEIg4I7w9MI{esW7l#$0KN5pEB zaU&J~ldq_RdJyfifkhBu>PcLi&_KlBbzjJ3s@_0Re+~s6 zKxUVgY%>BmQJO;8c!am7D3QAjRmA|EO!;bxaOuGnvI?q7HdIw%`jvKohMt;=DjMaS zl7=*6U$}J!fI&l`c=n&_a<*x8mG^VbKUBc)82=Z7@Zq-@!e>FL2lq0Jc@Z$&me=&B z)kmg0a9T(F$fzxvYCdE42sMmN5a10{O>+&^wt`@ei2W{gA3jX?uYZ8{KJ)R39Zx^v~u3QCRn)IF4-2 zklL${qqd5WPi=M?&9}t(BC4yc3{p)j$lpT}<&RC|q<)L@0MAQSl$}ZrGonlaTcjGe zQhJdXg$laB=`yWn1wN+6VH>v42U`eG{?=8S^nvRyq7Q%LVQOn_rSE+6HhRtLuMv3U zDNbL(!BZ?7%Ce0=i1Tnw@`4HXh?T-*E(|!F0Yo-biNn-fNrptzb`#Dv{&s_38p!M< zWC61^#Ed~O7?ShIaQIx(lf%#o&SWR2({+?Be-Yc}uYLP=(Ck?YXv1TV(}&*we!BC% z`{+IQ-$gyC1bt-XCDc7JMhUP+x~6ln7daZQsS8lLW`b_{>TYV{dor2L&&7!=df3 z9+-CF+u8ab7Y?=;6!q&WgwE274n?(LlxLQ9RanpOnhHqWu2i1L3YbFDPk@_Afo}F)aPO35f%AeUWttGJX?gjDiTx?ozGGP zSeOj8ht>3kMzc&x2Yx)qE7Q56{Dj&q@Z!8l@Lp|=0cxoY%MguAxX)Fj)Y+HNm~Kn+ zsu+&$uw)VZ56A=BI<0Q6=`40r56zs7M^IUU%7k#9a7aDjX(MU zfRDm4z-dIIQR?gMp?AFLO?2UfE2T_0r+qfH%$!9{Ei;9;J^QL3qKpr7A)CoTW#m+2pG`5gW0BM(wvIz^vfdj%WvB#rRTUhS~)Ej?(_ zMQ@JLS033&hfhpUL&QU`T0V=VL!CWNZr0M^|McmeG_|z^p0#(MH|mGsSL=Dm_6*>zGAo{~WnqsKmQUg0 zcMx5dvSE;;Rg*L7iWpTjU`UcPS$^u7&VG9Ij)!UQ#*Oq08~f3|!Snhcemug5ew1UT zjh*kM?EkhJzy0+a7=B!{AK(7N__x3PZDf|QUHcDv{^J*S(%8@t&268$1@#M?#U1Qa1_;H;W}G zirK9(XJ|$yi1|2Z0)jabGy!>kNepy>rq}}Wg{kH(P7yFdaPhcZQ&{D51qrxWrd0+^ z)6vl2aFTAiW(Do(=;dQK(bjF->04j@H~Per=XD@Qlm%tPKL-l z!tjW!$KF^H-STUs2LQ(a^p9=;mQym=MiGWYDzupFajQx1GNGv!BuY<`ycl z)2^+np_bMe)HY`pEm^vVX7P78gZhRRdH+;moRZ0LheHX@Xk=`F&u4-@_K*KeOO`C4 zx4-jd`tIf@s6UgU@2z{i^m6(+0>nMerYxE$}htooZ zf%1SqU^wNvGKEKR$cju&!vth~Xk2@V9L-%*qhxGK5kp7ixopWn6AH_$%MvGz`)!h% z;sr$kCc9mrlF)--LLQe_BzmrrcJP?mF6JE+RY?yep>YYMkdVyfRXtm@3`&+$_OU@N zUV$7d^qV?Y4RDbj0ADYmt+q7Pv|{N5oY)3NAQJa`1GI7X!Sdm&Z*=|V#lxr1xq)@f z=eeSOz~&FiHSe*r+LV9{ERk}xMP_WmJd$l}N>&e)SggL0d=b@zoD(x>;hI|Vra7uT zu#bMf=^@&`;ZfSP=?Q_QpW_R^e3C!IL;Ud`=D23xbO_J6&C<)l-SZrYz{_Fyf6b4t z;`rbB&UY&I@82J9YMC*d%og1jtXN?zUVed}FSdU&m2?A=HxZ8uJP!~lnF_So9$zL$ z0OJ4^u*DZ$RJ`{$zlz^~@9!!Qc_Y(ppV3G)v8af$V7dD}USY3v%Vx-l!3P`?SvYF* z*x(Xbn~HYWEwDVFf~N6;hscK)bh(CV7K5f$N-$(ORJA^@YE=5e2315AlOZURi+U2b zwkn`taM_|t!KIXf=uT~D^cT`HT;nR6+EqEb%jR_l8UzDenWE4%2sLl9G{uWs7V(!5 z73y-29j(Hd4UVR$ny<~x*Iq9fAT9N;V$Pl-{mz z+qe|eQ?o+m1$(bbExZOOWJaZwV-vOEdbl-5kH{$6#BQ1&#igYlg&GiS}D`3vULij~W#ec@tiYMv=sMj{dCls+y^ zzg!_lhYszcS6}@G+WOQydh;9KOuyT)lSU>d=|8T%o?2p+)SDb5D{WHist~>Z7mso# zQJ{i5LpQ8j#tx{FPM;cZhM#PJY^e&zg9k&eyWaF9#*FX4f6l@a& za8k?X?}>5Ec>`VRyqdiBfWecWpG>L-BaAiHUeU!y9(a70I(DIGqgbGtWhjIXoO4MH zi2YuXv&-=yiJ#6#5&uNxo|h}k#(4EB&-z`4Q~T8HIqjv^S+jHV7B2QQH8mU6H8nwx%k7;^ zCOs2lqawnAl-??97*3Np{9}xML9qocyZBOT%i|k{Z~yMMF!2?HQCU8xjoKRPX>=l~ zCJ*_2fwQj&1|$+f2?%H#aP`1Jd3644YMDAjQ+Pne4@eo*MNt+~hCtQKN5&^*h($Hl zTvBSl=L>iY!FglDN;Cx~!(>*@p|vq29707sBx6VF*!*V(Q#8rOJm7Ur>Fa_?Q8Z;u zUGH@$hs3~CM3iH3nNu4VLYkwzoFXKvZ>X0{VD*|+ zv}EN9YMwDioc#FMAV>WPHl}%+J$tdd?|a^QBmMsIC+LFNZFKh=ZX`2fQnSO;!bzud`{pBrx#n&8aWEsuHPJ*UERt6)eXs0b1+_Fn?Hb1|qBXW_J07#%^J#p$CNy=I^^aMBpfPB$rkyN#R6>Tf!Ea)+y zLBoqk=;1d%r3h;V+q7LUnpu7D@)T|C`01h;aSf@Zr zZ#Y1|+O(BMCK7g#@{!_(%f2l}Uw`&zm3!sL8 z{Uf7-EP}=_oWUdq3Md1CvICi0jz1qHKlytxlSvOH5(yyAgXcK>0sb5h^ZnRZ6ZJjT z_rpxuE_b~7&Cg?qo`XL5C6D-xbN}k)GW;|6@z11$*yo++Ig`A}C+E&zXtmC4%gkG_ z$XDOkOx4xZ0gm{VItFw?&Irt)_zq_Kke~%b!E5Ib_$7 z=QK6YlG!sUo=i$P0!9~&Qy6}MyYa%V3M;W|#aE(5wGCBYm4QA2mwQn91C~|NxC_0& z!(Qs{o1g?62W$!;hAN{0g_CwGxZY%1HE2=JnMmiP#4xilB21Ao#AWK{8=!JUNa_{z z#uvOGZ@iKqJb>wz`YRhCI0hS{DG|J2#a+S=ub2@@Py3d^6-#=Y9&-;lkkctndVGPP ztb#w|$G>qOZ`K?Q_jb}>yzve6_VLwcQ&i6gU=#z35@S!Z z(Fg8-QpD)B!?JYnU@ENuyRI)zjbGnVQ$^1lKPgRJJHWS2t(!|_HJ;PwGW^>3+jai) z8GrwZLl^ON-2M{Tv@Bo3&HQ~m@7ISizr11Jvn$+FKRu`M|Lk-B=_NJ(=P~^5m&x!0 zll1}pGe(rx@na=FE-RZ{3$j-Y9@@W`@ObzS_olr*Uvloe1*sWrv&J|h@HI3v(X1sc zA&xfuoDocwhL90hmL_(39!DS%SV2ky3zlC<-JPAIw|@1DUfbx~UnhF|siCS;gjcYk z6n@zfR8LVyR;qNO%(>62m3o{(A4}Kl-4byNT$s$M>2BenG4!$AZ1jEn04l?DC~IR8 zk8rlcvjvC5s#vt)d*lq(VDAbiJ1%0t#}MO(XxC%@OD^)4Ox!T3zDF?jRjy}f5zqM^P{pOx~Y30}co&NS?AE#Z< zJS~&6DoS^Y(S}y)K!2~(1IWohCEq{a6mJlWI4CS^y4!+w)W{t0I#X*YlncNB28zaV zkR5ja<*VqEKe&V5dEK>iL3JIisc)e*bLP`~*+@-t0I_YjpSBI2p&jERbUKhEkP{^N zZ(ASVLXUB_&@!`?UUAu4y8Now(A@dUC^MO)!GRw7@;ARlGiEf?hd=dy={+0oqBo`5 zY5Rcz@^ePjTwO!&yx~F`9UjvS?Wxile>Azyi1Ot+x~8&kMER<`qgdJnP-7Xw5MguD z``D3Z(+c*B0X{=FfbyV%;zuJ1pGo&W#cm-RA6{Ll5ZP&QqFf zkQ*4)cS-rCZzw4l!K{{;7-_XBlraNz6D6dvi7dqvS*fkpR0ia@hNGYa9JxUw@tlhG zeX429n})Lpk0bD5WAw4v5|eqFNaP*kPFe_DP(XTsNTO1WB`>3tm(T6<7#hJr0xK+V z7SP^SM-Od1OkcZmGc{KQ>2y~&{r0|l=+akSMhEuop-4C)&h|q$-%Nk=f%nn%H@%xW zjvOSJf7bU1vm0RDRL0UJhTO)1+s?=oo*pISA*iD=buUA+w89uoq|@~7i!PzmM3Vk; z?HX$G_yxD!6pGM{SS5vG)d*uj7({yq`e*}ZDo?O8IL!tgjGF;AlBtnV85FyC?ZtH6 zo35e7%Py8#fmk$3zy8s;>820;13N9^br7YYi8y`h|Gbf2_u6IDeQHpQ-n4iF=pDXR z#k`@Zo~^0LW0SN3l)COzn%a!^FqcHdX(fCP(RZ7cDhp>)(500^$w8kB_l;Hvtcv+W z60&zVB^1%}r=p&CG_;uWjCu2c-k7-MUp`(K9v-UFM*kp3wM%q_ zc8m>)WFi+YoKLeFYo(rE7mG-A1?Ei{&{+*t%BfgWBuuv9NAv?-)Ta8VYzESJZ5xdP z1C6ptKW|2K!e%yANZBYa6oON?L7KMwg0bYmQk)m=Hg_x|_Z?|ZMRXL?|eK|m=jrnYiDL%f7I+?VoKc-JW1T%jKHtbpideD@(#kpV_?1q880* z$G5I|0JlH76LDWvguCv3a21k?Bq+FIhyeCoZ@C!hTo&K?#@BJ-``?eDJ-fJ54Sz`W zN?31)%QZ6XYbs`t3;t#k_`AWJ!NZk-_ENNRNqP%w?!5zFfBRox_R>XI-rJ3QmA9#m z2nCLwU<5NL7|m{N!|b*WN(Yk^1oC*ezYjO>-;D=H1~FN$qLsF(n$E~^KjqYuaq&Cf zf)iJshqf7=xazx~!(V*(Q!<=&(&Ab8`ByGSdL*O7@QkS!lrTtY4Qme0%Hj5C8ib!F z%4TD>P>)^-z?aIll=2Mm!F4<^<+7ldp6d*r-y=e?*ib~gC49p#6-$v=#~tQ6 z(5R*PwvNjYxx_O9)yo$64}tQ&7a92Z3vxSu4c%{|J2!Q%)7)47eXG9nrUxl=kBl>p{*t6 zWz)_9!(edBTSFYNm^gjkP&2w8X>8>du~0mC~ggRpO~iT~x{7a*dxa z(n86RMjbZ}#avsH_tj2(%fhcRhlr2U3(~Vu*R!j`em|Nn0p^`=;sx%<) zr-;T)J!a`sD^P&j!q1 zx<Uh}AdWiCAYR=F;azS$dlQDO0PUuaL#&iBW7H9meED8UcFG6}_`@{-R}g%e?vM z2!^pOJBbm4j!#Px!@Kw4_M7j(Q%|g?RlrJY*}fLH{N@4KcVBq_1?cVVKyD&0eHBBG zML2FS)lx3*aZnNzO)go$6tS>ou}24v=hWtC?Hjkguas`pYJzL+?qsa;t5vL;x~-Ts zVyI%PL9#GQd9cWzasi~EVTk;PNTg_otd>|n_ooy&Aw@x8EL+5y&4U=3C`zrLDa|}B z&OwE*4L;YD>lZknjHKf6W>2XYPk_ME!U_^U?$U=>oxs4g@#qKyU-ypN5*k zYiSAup<1mLA08Y?Y~Lb*zGTON`r%g8DA(=nlXD$u4neF+E>5u8EfbEZJg;F zx^{O8T`OL_?o*$_?$3P2ID`JY&^4z%^VnsS1yv=h;S-d#MwqeVc>bD=5gWHu!qUtP z{~-7HcDYAAcp7wT{|{23@1;5*xbQckip?N1tqTu!K|AXB%s!MLUB(E*S+@yKtX_?I=bb6S zc=@rk*d^Lp&)hF%9A&`H6Ox9OppcB;QT_uyE%9uLA&%LQ+7-%U4RcO?75X=9z|*VO z$>*lRAz_v96n5MfK!WE9_~4fd*h%2upB@q`$DY zQyA^rhr54s8-Dt$-%_Ss#+=^8_~#Fti;0mD+HBMFRF<-t<#>T#n?9)$m6p9W%*Ju@ z7#7CCtSbH;Yc=tH5lIFX@( zxJ{ogTGxt$kt*@D;jVQX&^J2fo}N$I51sbGq`oj|HE9U=w>A*peK;NPLj(W#q-9JC z{#^w8qt6cfgM(GftcIQuoTTLB0zak${zf$5|2`w|pM7ZXKjKF0(*VC8FYO!WP3!et z^@o6C=)67CY4iwYX=sg?O2zn7PpqR1Z5<~^`OX>L*?2r|?cTYg(5V&>GL@2taAjYv)L?OMWFhswi)>MZ+;#7-o6`e|L)h&xnwcYJ9mnHPPJN* z&v4CJ*nEYDtE4W>+p6iD%o=j77RB952Mixi_EOd#rr%%u`G3dQ-Z>U?cRaqvw1@KRJ`%bGjPY+wfOcU4`VEq#I}J! zjHQ)c*f%b3N2Dc=z57Z?g)+1PQCxP`<6#LKzb?zjfR&+FVCK|iqUjmZX!TE{@po?I za+!!hI-upV)nF+%TUF%c!9ABV?;a<|RcJN*lB}?dh>KMJf^29DiE@yPgWSbVEo{J{3cZ&uPyK!chVdu7MFx==XG_uxnrl zPwi@4eys`L+Yc8E4(9YXBpjaYHk~i8dpk*&d;XMe=F4n*`C52_PPzZ2bNt=h4A(a@rG4vgni&POB?mnrVF&G zKFb#jmp&%)Ww^a%x0dcSHSJgynJ*k3$dU_Xx(Ql6IK?$mM^EEAx)yI~FmVBash)f< zRaq~{@-j`C`gAQ09i{6p)33e;5U}1m-`G5ccdT1RaC-^On`SfxG3jf-(9LKc21X{t zZt#O|J_BQ!JeJO!iLZU}EBMltpTWX~3*@5b=XEVzf>TaA8Kaab|KPIsVb`iv=w7~D zK!`d2EC5z671eMV*V?rogD`>E!`2mlV>dP(0BZX8^4$o`>%}74I=b<;FaC?n1Z>*2 z6WO{Yb$%H}Gt|n*W#6!DcozkmR=N*o3s|*r6CS$jb_{Oaf(y<+8@GPqY?+jmxeikgNHu}7$6Pht^Tufmdg&F5d)_#6u9apEXV5`u&@1T&TeNZNa<@b}xxvJ8^u#Q`rbhdkUATA!$0C1mTA}i}D*=ek zO_uX!AKs_;r3Lg|0)i-w224*2$}}1Se(pB9>^0l{0{Xe!&}~n|<-6Vb=;ICWF^!L9 z?l@(a`|~V3bE)M}w?)qa8Y>PLU5;Ru%_aV8uYCphUzoa(BeNK5=zRV!x z%X8alSPDY(<5{bWuQM^_F4jH%ycTbC?(9skTL05<+`H0T@%?o+yt#?)1gP*4L}YM6ezZ*UwZESrmW zU+^jnPZlVs#PR4OkBE2~H*AXp=*Z1!4nwR`4uW(LH|!-tg~#1*=@fQ#<#e zK>IJw4P{fYTO@cgz0pvdDz+tTi-ytGl0cajnrk*}z(c>f0lB?<@wT_T1v~!tNBFbT z&O?HZ-+%muR?k1)gQLse!{V+dF;<>U$2ts?C$~7W)@4ePR>3|`Ue!U3QBE*S}^UJBRS>G_d>smzc#XwYw> zQ3CyVK-q4FRZ#S6^YiU}8Lv5Pi_NL2-R3Osr10sv0QFUD*)|@`tGm+VXe2!WS_XBr zC2{M+j|(eE-yXI0p8AdHuEYMpit(&yKh2FL9H#xlQHS^Xb?b7^8W--nZ`7EA?k~X2 zm2Wtr1@xCQ@H>YW2-fOAa2fq-KAoJer*rfY`rQu?D-s$KKvXCH$<62=9mmX$Hn}L6 zzGj%1q8qORhBA@}`Q)O^WR)(6D|_Gt79O_YsZ|Zixl�&`K&)0ST-%5Ck2agELY+pO(jLAI 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 !LcA z)jXh2k(~Xe#6xpSJW;ma+;%O__7ADdv+0O{%ENb4i`-$`^f{&I6K#wtm87#TeKj3_ z&P8vR9`&(H)A@iTv%Lf@hlLgJByH7G8pKrGTlawN-K%O}nsi&8M`H3@SAxtsSa0Wu?rRhl(9E+YDE0zQu+A`n!ux|} zTjHvor6{*+b#o9VT4M^CmA9R13G+{_q4)JtXO4l@C(72Gf1~1BZ;uWz>&)1CcnX5G z2ud@J4{t-i50iM8#bYYGo(dU0gEo$QtRx$~Y_i-0d>GpzLpuYy(m>)g0Y3!x{B%p+ zIVzc)1^VL#^m}BO`cRYYhZ0X%^ViJgSsn>CMSy>r8UI{C-L14Zl6+?B{VQikKiv!@0RPD+HTZXQwDe#x2!N>!shy>` zwG4M4We~A}0X6`zLMbf)mDm7em&b!b(YMOHGJMn*8TsvsG(a#2%0QggMnH)Xz>s%R zm0F$u@sa)sgCK?=8N+aL0lfSFMVz85Ut?3o=yB)FPV>}@wg{#lo)E8j1R{F4t2z=XpF zz+g*COF%X`YGo=OsFcov2^g=7Mhem?nV}TKaG7^xsXTJ}VFX-S))7BXsC8lhc#RYx zxl8ryEF+L+P^ShAfi?yyHUOa^fYx6&y>8|-2E5AbCX`i8C1QvdII_@R4vW|@B-tp0 ztBRa@vncM#>a=}@m2B|qxpOb+PXt55t13$ayY5%y2Kb!P%Aynnd4Rqp%pSp77?3pj zPaCi&-F8_~!Da)g0iW0tSRRWhDh^Sxr~yCAYY2cpr2!uU)CJTT@I%nwV?aN&0Acpd zyrAD4u&b+cqilbakFe!YwjWgo=Nq{4Y=XK=?9Fpfvw1%C{KKRhX(D@g;=E-&YcWje zPAI=JYstUW4bQ>%S+s@2=9bpK=(fl(_UBXbS*Uk^2>zoJb;~W6we-_NGL<8gf1v*Z z{Pm5p%tx8*$Vm*KW7t@LM07xnERsf}i;RMKrB(in#9 z$ZiRmd5%Io#bP3{D)~l=D&PdTzToV0v=3`8>}#R z5e9Yh6g2<^f(I~}adZXnv~K+y=Jmr^Fhf;27=b`nuEG;YD@PSldchk=hu(l6=C12X zUGWO?yrx5sfDJ>V&dfC-o&mgqbeEQhu=qY^-mY9?EwkflnG;tj&qZy4tnhPSq1$M< zgngS;i7Yi^AzKFv!-C{>ijhJwUS(wCBy^Bg@pnikV)B}4^V;(LkR|0;*$b*tnE@Xw zyDS!D1@uiJmXUM{A%kBLo2BIg^e6Kg^j%CegHf0P`o01Eo(>IeLo+}>Wcv=Y{kH1d z8KB?4p(~h|?7S%R{FVa$A;?vl*9sq~-18i43rRjGHt<_{x)UNe-O+XxgSHej_G0+EK2p&>BK7=v=7 zWe~7ZwHhhDEF*4^x0(fI&9)L~fe^IIG2seax49BIy`=KitYpqn%T~mLbUdc8sOacr zK2yo86ms+p;9HQs!0538Hd?$Cf9`z@^hK0B@JjPq!JuC(&pdUG+?rlFND!J66jQ9mB^SlWBFKC=UNYdPm`}ICc4e}ls z>u;BQ7J7WKb`JZm_b(m%XBq(6A_gFg0l)x6OWY=n5ugcU1gPBz$M# zF$Sm_R#8JRpD_p*9!KyP%Wtie%SM4OvC6zk&1K0*VTvvTz&#!DAY8)Sg9y7%wpK|l zD}29R%M*1}HOrC~%4lwl#&o=t0sEq)>9|2Q84oBZv;}Md_5}d`gocYC9H3$V9}Iu8 z8NhWGkai+JmX}gtRc^byLvu3yknIEXk6)Wm&js5*Br?zQoW}X0)bku$go7UB-MsVz z`9K4`i%C8UZhIDPlSFI|B{))CTwtb$f0L@cDX| z0sZi&s)OzK&erpX4d|bCYO4dMfc`)`)1Mdg4*}ahQe_@&|4)Dc02e>2)bf}6o&W#< M07*qoM6N<$f|g~m$p8QV diff --git a/docs2/Hello Phaser/phaser-min.js b/docs2/Hello Phaser/phaser-min.js deleted file mode 100644 index 048fae73..00000000 --- a/docs2/Hello Phaser/phaser-min.js +++ /dev/null @@ -1 +0,0 @@ -var PIXI=PIXI||{};var Phaser=Phaser||{VERSION:"1.0.0",GAMES:[],AUTO:0,CANVAS:1,WEBGL:2,SPRITE:0,BUTTON:1,BULLET:2,GRAPHICS:3,TEXT:4,TILESPRITE:5,BITMAPTEXT:6,GROUP:7,RENDERTEXTURE:8,TILEMAP:9,TILEMAPLAYER:10,EMITTER:11};PIXI.InteractionManager=function(b){};Phaser.Utils={pad:function(g,b,f,c){if(typeof(b)=="undefined"){var b=0}if(typeof(f)=="undefined"){var f=" "}if(typeof(c)=="undefined"){var c=3}if(b+1>=g.length){switch(c){case 1:g=Array(b+1-g.length).join(f)+g;break;case 3:var d=Math.ceil((padlen=b-g.length)/2);var e=padlen-d;g=Array(e+1).join(f)+g+Array(d+1).join(f);break;default:g=g+Array(b+1-g.length).join(f);break}}return g},isPlainObject:function(c){if(typeof(c)!=="object"||c.nodeType||c===c.window){return false}try{if(c.constructor&&!hasOwn.call(c.constructor.prototype,"isPrototypeOf")){return false}}catch(b){return false}return true},extend:function(){var l,d,b,c,h,j,g=arguments[0]||{},f=1,e=arguments.length,k=false;if(typeof g==="boolean"){k=g;g=arguments[1]||{};f=2}if(e===f){g=this;--f}for(;f>16&255)/255,(b>>8&255)/255,(b&255)/255]}if(typeof Function.prototype.bind!="function"){Function.prototype.bind=(function(){var b=Array.prototype.slice;return function(c){var f=this,g=b.call(arguments,1);if(typeof f!="function"){throw new TypeError()}function d(){var h=g.concat(b.call(arguments));f.apply(this instanceof d?this:c,h)}d.prototype=(function e(h){h&&(e.prototype=h);if(!(this instanceof e)){return new e}})(f.prototype);return d}})()}function determineMatrixArrayType(){PIXI.Matrix=(typeof Float32Array!=="undefined")?Float32Array:Array;return PIXI.Matrix}determineMatrixArrayType();PIXI.mat3={};PIXI.mat3.create=function(){var b=new PIXI.Matrix(9);b[0]=1;b[1]=0;b[2]=0;b[3]=0;b[4]=1;b[5]=0;b[6]=0;b[7]=0;b[8]=1;return b};PIXI.mat3.identity=function(b){b[0]=1;b[1]=0;b[2]=0;b[3]=0;b[4]=1;b[5]=0;b[6]=0;b[7]=0;b[8]=1;return b};PIXI.mat4={};PIXI.mat4.create=function(){var b=new PIXI.Matrix(16);b[0]=1;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=1;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=1;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return b};PIXI.mat3.multiply=function(q,h,i){if(!i){i=q}var v=q[0],u=q[1],t=q[2],g=q[3],f=q[4],e=q[5],o=q[6],n=q[7],m=q[8],l=h[0],k=h[1],j=h[2],s=h[3],r=h[4],p=h[5],d=h[6],c=h[7],b=h[8];i[0]=l*v+k*g+j*o;i[1]=l*u+k*f+j*n;i[2]=l*t+k*e+j*m;i[3]=s*v+r*g+p*o;i[4]=s*u+r*f+p*n;i[5]=s*t+r*e+p*m;i[6]=d*v+c*g+b*o;i[7]=d*u+c*f+b*n;i[8]=d*t+c*e+b*m;return i};PIXI.mat3.clone=function(c){var b=new PIXI.Matrix(9);b[0]=c[0];b[1]=c[1];b[2]=c[2];b[3]=c[3];b[4]=c[4];b[5]=c[5];b[6]=c[6];b[7]=c[7];b[8]=c[8];return b};PIXI.mat3.transpose=function(d,c){if(!c||d===c){var f=d[1],e=d[2],b=d[5];d[1]=d[3];d[2]=d[6];d[3]=f;d[5]=d[7];d[6]=e;d[7]=b;return d}c[0]=d[0];c[1]=d[3];c[2]=d[6];c[3]=d[1];c[4]=d[4];c[5]=d[7];c[6]=d[2];c[7]=d[5];c[8]=d[8];return c};PIXI.mat3.toMat4=function(c,b){if(!b){b=PIXI.mat4.create()}b[15]=1;b[14]=0;b[13]=0;b[12]=0;b[11]=0;b[10]=c[8];b[9]=c[7];b[8]=c[6];b[7]=0;b[6]=c[5];b[5]=c[4];b[4]=c[3];b[3]=0;b[2]=c[2];b[1]=c[1];b[0]=c[0];return b};PIXI.mat4.create=function(){var b=new PIXI.Matrix(16);b[0]=1;b[1]=0;b[2]=0;b[3]=0;b[4]=0;b[5]=1;b[6]=0;b[7]=0;b[8]=0;b[9]=0;b[10]=1;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return b};PIXI.mat4.transpose=function(e,d){if(!d||e===d){var i=e[1],g=e[2],f=e[3],b=e[6],h=e[7],c=e[11];e[1]=e[4];e[2]=e[8];e[3]=e[12];e[4]=i;e[6]=e[9];e[7]=e[13];e[8]=g;e[9]=b;e[11]=e[14];e[12]=f;e[13]=h;e[14]=c;return e}d[0]=e[0];d[1]=e[4];d[2]=e[8];d[3]=e[12];d[4]=e[1];d[5]=e[5];d[6]=e[9];d[7]=e[13];d[8]=e[2];d[9]=e[6];d[10]=e[10];d[11]=e[14];d[12]=e[3];d[13]=e[7];d[14]=e[11];d[15]=e[15];return d};PIXI.mat4.multiply=function(p,i,k){if(!k){k=p}var v=p[0],u=p[1],s=p[2],q=p[3];var h=p[4],f=p[5],d=p[6],b=p[7];var o=p[8],n=p[9],m=p[10],l=p[11];var z=p[12],w=p[13],t=p[14],r=p[15];var j=i[0],g=i[1],e=i[2],c=i[3];k[0]=j*v+g*h+e*o+c*z;k[1]=j*u+g*f+e*n+c*w;k[2]=j*s+g*d+e*m+c*t;k[3]=j*q+g*b+e*l+c*r;j=i[4];g=i[5];e=i[6];c=i[7];k[4]=j*v+g*h+e*o+c*z;k[5]=j*u+g*f+e*n+c*w;k[6]=j*s+g*d+e*m+c*t;k[7]=j*q+g*b+e*l+c*r;j=i[8];g=i[9];e=i[10];c=i[11];k[8]=j*v+g*h+e*o+c*z;k[9]=j*u+g*f+e*n+c*w;k[10]=j*s+g*d+e*m+c*t;k[11]=j*q+g*b+e*l+c*r;j=i[12];g=i[13];e=i[14];c=i[15];k[12]=j*v+g*h+e*o+c*z;k[13]=j*u+g*f+e*n+c*w;k[14]=j*s+g*d+e*m+c*t;k[15]=j*q+g*b+e*l+c*r;return k};PIXI.Point=function(b,c){this.x=b||0;this.y=c||0};PIXI.Point.prototype.clone=function(){return new PIXI.Point(this.x,this.y)};PIXI.Point.prototype.constructor=PIXI.Point;PIXI.Rectangle=function(c,e,d,b){this.x=c||0;this.y=e||0;this.width=d||0;this.height=b||0};PIXI.Rectangle.prototype.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)};PIXI.Rectangle.prototype.contains=function(b,e){if(this.width<=0||this.height<=0){return false}var c=this.x;if(b>=c&&b<=c+this.width){var d=this.y;if(e>=d&&e<=d+this.height){return true}}return false};PIXI.Rectangle.prototype.constructor=PIXI.Rectangle;PIXI.DisplayObject=function(){this.last=this;this.first=this;this.position=new PIXI.Point();this.scale=new PIXI.Point(1,1);this.pivot=new PIXI.Point(0,0);this.rotation=0;this.alpha=1;this.visible=true;this.hitArea=null;this.buttonMode=false;this.renderable=false;this.parent=null;this.stage=null;this.worldAlpha=1;this._interactive=false;this.worldTransform=PIXI.mat3.create();this.localTransform=PIXI.mat3.create();this.color=[];this.dynamic=true;this._sr=0;this._cr=1};PIXI.DisplayObject.prototype.constructor=PIXI.DisplayObject;PIXI.DisplayObject.prototype.setInteractive=function(b){this.interactive=b};Object.defineProperty(PIXI.DisplayObject.prototype,"interactive",{get:function(){return this._interactive},set:function(b){this._interactive=b;if(this.stage){this.stage.dirty=true}}});Object.defineProperty(PIXI.DisplayObject.prototype,"mask",{get:function(){return this._mask},set:function(b){this._mask=b;if(b){this.addFilter(b)}else{this.removeFilter()}}});PIXI.DisplayObject.prototype.addFilter=function(j){if(this.filter){return}this.filter=true;var b=new PIXI.FilterBlock();var e=new PIXI.FilterBlock();b.mask=j;e.mask=j;b.first=b.last=this;e.first=e.last=this;b.open=true;var d=b;var f=b;var i;var h;h=this.first._iPrev;if(h){i=h._iNext;d._iPrev=h;h._iNext=d}else{i=this}if(i){i._iPrev=f;f._iNext=i}var d=e;var f=e;var i=null;var h=null;h=this.last;i=h._iNext;if(i){i._iPrev=f;f._iNext=i}d._iPrev=h;h._iNext=d;var c=this;var g=this.last;while(c){if(c.last==g){c.last=e}c=c.parent}this.first=b;if(this.__renderGroup){this.__renderGroup.addFilterBlocks(b,e)}j.renderable=false};PIXI.DisplayObject.prototype.removeFilter=function(){if(!this.filter){return}this.filter=false;var d=this.first;var g=d._iNext;var h=d._iPrev;if(g){g._iPrev=h}if(h){h._iNext=g}this.first=d._iNext;var e=this.last;var g=e._iNext;var h=e._iPrev;if(g){g._iPrev=h}h._iNext=g;var f=e._iPrev;var c=this;while(c.last==e){c.last=f;c=c.parent;if(!c){break}}var b=d.mask;b.renderable=true;if(this.__renderGroup){this.__renderGroup.removeFilterBlocks(d,e)}};PIXI.DisplayObject.prototype.updateTransform=function(){if(this.rotation!==this.rotationCache){this.rotationCache=this.rotation;this._sr=Math.sin(this.rotation);this._cr=Math.cos(this.rotation)}var r=this.localTransform;var f=this.parent.worldTransform;var b=this.worldTransform;r[0]=this._cr*this.scale.x;r[1]=-this._sr*this.scale.y;r[3]=this._sr*this.scale.x;r[4]=this._cr*this.scale.y;var n=this.pivot.x;var m=this.pivot.y;var i=r[0],h=r[1],g=this.position.x-r[0]*n-m*r[1],q=r[3],p=r[4],o=this.position.y-r[4]*m-n*r[3],l=f[0],k=f[1],j=f[2],e=f[3],d=f[4],c=f[5];r[2]=g;r[5]=o;b[0]=l*i+k*q;b[1]=l*h+k*p;b[2]=l*g+k*o+j;b[3]=e*i+d*q;b[4]=e*h+d*p;b[5]=e*g+d*o+c;this.worldAlpha=this.alpha*this.parent.worldAlpha;this.vcount=PIXI.visibleCount};PIXI.visibleCount=0;PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this);this.children=[]};PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype);PIXI.DisplayObjectContainer.prototype.constructor=PIXI.DisplayObjectContainer;PIXI.DisplayObjectContainer.prototype.addChild=function(i){if(i.parent!=undefined){i.parent.removeChild(i)}i.parent=this;this.children.push(i);if(this.stage){var f=i;do{if(f.interactive){this.stage.dirty=true}f.stage=this.stage;f=f._iNext}while(f)}var e=i.first;var d=i.last;var g;var h;if(this.filter){h=this.last._iPrev}else{h=this.last}g=h._iNext;var c=this;var b=h;while(c){if(c.last==b){c.last=i.last}c=c.parent}if(g){g._iPrev=d;d._iNext=g}e._iPrev=h;h._iNext=e;if(this.__renderGroup){if(i.__renderGroup){i.__renderGroup.removeDisplayObjectAndChildren(i)}this.__renderGroup.addDisplayObjectAndChildren(i)}};PIXI.DisplayObjectContainer.prototype.addChildAt=function(c,f){if(f>=0&&f<=this.children.length){if(c.parent!=undefined){c.parent.removeChild(c)}c.parent=this;if(this.stage){var e=c;do{if(e.interactive){this.stage.dirty=true}e.stage=this.stage;e=e._iNext}while(e)}var d=c.first;var g=c.last;var j;var i;if(f==this.children.length){i=this.last;var b=this;var h=this.last;while(b){if(b.last==h){b.last=c.last}b=b.parent}}else{if(f==0){i=this}else{i=this.children[f-1].last}}j=i._iNext;if(j){j._iPrev=g;g._iNext=j}d._iPrev=i;i._iNext=d;this.children.splice(f,0,c);if(this.__renderGroup){if(c.__renderGroup){c.__renderGroup.removeDisplayObjectAndChildren(c)}this.__renderGroup.addDisplayObjectAndChildren(c)}}else{throw new Error(c+" The index "+f+" supplied is out of bounds "+this.children.length)}};PIXI.DisplayObjectContainer.prototype.swapChildren=function(c,b){return};PIXI.DisplayObjectContainer.prototype.getChildAt=function(b){if(b>=0&&b1){h=1}var d=Math.sqrt(c.x*c.x+c.y*c.y);var f=this.texture.height/2;c.x/=d;c.y/=d;c.x*=f;c.y*=f;b[g]=m.x+c.x;b[g+1]=m.y+c.y;b[g+2]=m.x-c.x;b[g+3]=m.y-c.y;l=m}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)};PIXI.Rope.prototype.setTexture=function(b){this.texture=b;this.updateFrame=true};PIXI.TilingSprite=function(d,c,b){PIXI.DisplayObjectContainer.call(this);this.texture=d;this.width=c;this.height=b;this.tileScale=new PIXI.Point(1,1);this.tilePosition=new PIXI.Point(0,0);this.renderable=true;this.blendMode=PIXI.blendModes.NORMAL};PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype);PIXI.TilingSprite.prototype.constructor=PIXI.TilingSprite;PIXI.TilingSprite.prototype.setTexture=function(b){this.texture=b;this.updateFrame=true};PIXI.TilingSprite.prototype.onTextureUpdate=function(b){this.updateFrame=true};PIXI.FilterBlock=function(b){this.graphics=b;this.visible=true;this.renderable=true};PIXI.MaskFilter=function(b){this.graphics};PIXI.Graphics=function(){PIXI.DisplayObjectContainer.call(this);this.renderable=true;this.fillAlpha=1;this.lineWidth=0;this.lineColor="black";this.graphicsData=[];this.currentPath={points:[]}};PIXI.Graphics.prototype=Object.create(PIXI.DisplayObjectContainer.prototype);PIXI.Graphics.prototype.constructor=PIXI.Graphics;PIXI.Graphics.prototype.lineStyle=function(b,c,d){if(this.currentPath.points.length==0){this.graphicsData.pop()}this.lineWidth=b||0;this.lineColor=c||0;this.lineAlpha=(d==undefined)?1:d;this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:PIXI.Graphics.POLY};this.graphicsData.push(this.currentPath)};PIXI.Graphics.prototype.moveTo=function(b,c){if(this.currentPath.points.length==0){this.graphicsData.pop()}this.currentPath=this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[],type:PIXI.Graphics.POLY};this.currentPath.points.push(b,c);this.graphicsData.push(this.currentPath)};PIXI.Graphics.prototype.lineTo=function(b,c){this.currentPath.points.push(b,c);this.dirty=true};PIXI.Graphics.prototype.beginFill=function(b,c){this.filling=true;this.fillColor=b||0;this.fillAlpha=(c==undefined)?1:c};PIXI.Graphics.prototype.endFill=function(){this.filling=false;this.fillColor=null;this.fillAlpha=1};PIXI.Graphics.prototype.drawRect=function(c,e,d,b){if(this.currentPath.points.length==0){this.graphicsData.pop()}this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[c,e,d,b],type:PIXI.Graphics.RECT};this.graphicsData.push(this.currentPath);this.dirty=true};PIXI.Graphics.prototype.drawCircle=function(c,d,b){if(this.currentPath.points.length==0){this.graphicsData.pop()}this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[c,d,b,b],type:PIXI.Graphics.CIRC};this.graphicsData.push(this.currentPath);this.dirty=true};PIXI.Graphics.prototype.drawElipse=function(c,e,d,b){if(this.currentPath.points.length==0){this.graphicsData.pop()}this.currentPath={lineWidth:this.lineWidth,lineColor:this.lineColor,lineAlpha:this.lineAlpha,fillColor:this.fillColor,fillAlpha:this.fillAlpha,fill:this.filling,points:[c,e,d,b],type:PIXI.Graphics.ELIP};this.graphicsData.push(this.currentPath);this.dirty=true};PIXI.Graphics.prototype.clear=function(){this.lineWidth=0;this.filling=false;this.dirty=true;this.clearDirty=true;this.graphicsData=[]};PIXI.Graphics.POLY=0;PIXI.Graphics.RECT=1;PIXI.Graphics.CIRC=2;PIXI.Graphics.ELIP=3;PIXI.CanvasGraphics=function(){};PIXI.CanvasGraphics.renderGraphics=function(u,c){var p=u.worldAlpha;for(var s=0;s1){t=1;console.log("Pixi.js warning: masks in canvas can only mask using the first path in the graphics object")}for(var s=0;s<1;s++){var A=v.graphicsData[s];var r=A.points;if(A.type==PIXI.Graphics.POLY){c.beginPath();c.moveTo(r[0],r[1]);for(var q=1;q0){PIXI.Texture.frameUpdates=[]}};PIXI.CanvasRenderer.prototype.resize=function(c,b){this.width=c;this.height=b;this.view.width=c;this.view.height=b};PIXI.CanvasRenderer.prototype.renderDisplayObject=function(h){var e;var f=this.context;f.globalCompositeOperation="source-over";var d=h.last._iNext;h=h.first;do{e=h.worldTransform;if(!h.visible){h=h.last._iNext;continue}if(!h.renderable){h=h._iNext;continue}if(h instanceof PIXI.Sprite){var g=h.texture.frame;if(g){f.globalAlpha=h.worldAlpha;f.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]);f.drawImage(h.texture.baseTexture.source,g.x,g.y,g.width,g.height,(h.anchor.x)*-g.width,(h.anchor.y)*-g.height,g.width,g.height)}}else{if(h instanceof PIXI.Strip){f.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]);this.renderStrip(h)}else{if(h instanceof PIXI.TilingSprite){f.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]);this.renderTilingSprite(h)}else{if(h instanceof PIXI.CustomRenderable){h.renderCanvas(this)}else{if(h instanceof PIXI.Graphics){f.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]);PIXI.CanvasGraphics.renderGraphics(h,f)}else{if(h instanceof PIXI.FilterBlock){if(h.open){f.save();var c=h.mask.alpha;var b=h.mask.worldTransform;f.setTransform(b[0],b[3],b[1],b[4],b[2],b[5]);h.mask.worldAlpha=0.5;f.worldAlpha=0;PIXI.CanvasGraphics.renderGraphicsMask(h.mask,f);f.clip();h.mask.worldAlpha=c}else{f.restore()}}}}}}}h=h._iNext}while(h!=d)};PIXI.CanvasRenderer.prototype.renderStripFlat=function(d){var e=this.context;var f=d.verticies;var j=d.uvs;var g=f.length/2;this.count++;e.beginPath();for(var k=1;k3){PIXI.WebGLGraphics.buildPoly(d,b._webGL)}}if(d.lineWidth>0){PIXI.WebGLGraphics.buildLine(d,b._webGL)}}else{if(d.type==PIXI.Graphics.RECT){PIXI.WebGLGraphics.buildRectangle(d,b._webGL)}else{if(d.type==PIXI.Graphics.CIRC||d.type==PIXI.Graphics.ELIP){PIXI.WebGLGraphics.buildCircle(d,b._webGL)}}}}b._webGL.lastIndex=b.graphicsData.length;var e=PIXI.gl;b._webGL.glPoints=new Float32Array(b._webGL.points);e.bindBuffer(e.ARRAY_BUFFER,b._webGL.buffer);e.bufferData(e.ARRAY_BUFFER,b._webGL.glPoints,e.STATIC_DRAW);b._webGL.glIndicies=new Uint16Array(b._webGL.indices);e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,b._webGL.indexBuffer);e.bufferData(e.ELEMENT_ARRAY_BUFFER,b._webGL.glIndicies,e.STATIC_DRAW)};PIXI.WebGLGraphics.buildRectangle=function(s,i){var f=s.points;var n=f[0];var m=f[1];var d=f[2];var q=f[3];if(s.fill){var h=HEXtoRGB(s.fillColor);var e=s.fillAlpha;var c=h[0]*e;var j=h[1]*e;var l=h[2]*e;var o=i.points;var p=i.indices;var k=o.length/6;o.push(n,m);o.push(c,j,l,e);o.push(n+d,m);o.push(c,j,l,e);o.push(n,m+q);o.push(c,j,l,e);o.push(n+d,m+q);o.push(c,j,l,e);p.push(k,k,k+1,k+2,k+3,k+3)}if(s.lineWidth){s.points=[n,m,n+d,m,n+d,m+q,n,m+q,n,m];PIXI.WebGLGraphics.buildLine(s,i)}};PIXI.WebGLGraphics.buildCircle=function(k,w){var f=k.points;var j=f[0];var h=f[1];var o=f[2];var n=f[3];var l=40;var t=(Math.PI*2)/l;if(k.fill){var p=HEXtoRGB(k.fillColor);var d=k.fillAlpha;var m=p[0]*d;var s=p[1]*d;var u=p[2]*d;var v=w.points;var e=w.indices;var c=v.length/6;e.push(c);for(var q=0;q140*140){h=L-z;f=K-w;m=Math.sqrt(h*h+f*f);h/=m;f/=m;h*=c;f*=c;S.push(B-h,A-f);S.push(M,T,W,Q);S.push(B+h,A+f);S.push(M,T,W,Q);S.push(B-h,A-f);S.push(M,T,W,Q);q++}else{S.push(px,py);S.push(M,T,W,Q);S.push(B-(px-B),A-(py-A));S.push(M,T,W,Q)}}J=H[(u-2)*2];I=H[(u-2)*2+1];B=H[(u-1)*2];A=H[(u-1)*2+1];L=-(I-A);K=J-B;m=Math.sqrt(L*L+K*K);L/=m;K/=m;L*=c;K*=c;S.push(B-L,A-K);S.push(M,T,W,Q);S.push(B+L,A+K);S.push(M,T,W,Q);l.push(U);for(var R=0;R>16&255)/255,(b>>8&255)/255,(b&255)/255]}PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1);PIXI.gl;PIXI.WebGLRenderer=function(g,b,d,j,c){this.transparent=!!j;this.width=g||800;this.height=b||600;this.view=d||document.createElement("canvas");this.view.width=this.width;this.view.height=this.height;var f=this;this.view.addEventListener("webglcontextlost",function(e){f.handleContextLost(e)},false);this.view.addEventListener("webglcontextrestored",function(e){f.handleContextRestored(e)},false);this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!!c,premultipliedAlpha:false,stencil:true})}catch(h){throw new Error(" This browser does not support webGL. Try using the canvas renderer"+this)}PIXI.initPrimitiveShader();PIXI.initDefaultShader();PIXI.initDefaultStripShader();PIXI.activateDefaultShader();var i=this.gl;PIXI.WebGLRenderer.gl=i;this.batch=new PIXI.WebGLBatch(i);i.disable(i.DEPTH_TEST);i.disable(i.CULL_FACE);i.enable(i.BLEND);i.colorMask(true,true,true,this.transparent);PIXI.projection=new PIXI.Point(400,300);this.resize(this.width,this.height);this.contextLost=false;this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)};PIXI.WebGLRenderer.prototype.constructor=PIXI.WebGLRenderer;PIXI.WebGLRenderer.getBatch=function(){if(PIXI._batchs.length==0){return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl)}else{return PIXI._batchs.pop()}};PIXI.WebGLRenderer.returnBatch=function(b){b.clean();PIXI._batchs.push(b)};PIXI.WebGLRenderer.prototype.render=function(b){if(this.contextLost){return}if(this.__stage!==b){this.__stage=b;this.stageRenderGroup.setRenderable(b)}PIXI.WebGLRenderer.updateTextures();PIXI.visibleCount++;b.updateTransform();var d=this.gl;d.colorMask(true,true,true,this.transparent);d.viewport(0,0,this.width,this.height);d.bindFramebuffer(d.FRAMEBUFFER,null);d.clearColor(b.backgroundColorSplit[0],b.backgroundColorSplit[1],b.backgroundColorSplit[2],!this.transparent);d.clear(d.COLOR_BUFFER_BIT);this.stageRenderGroup.backgroundColor=b.backgroundColorSplit;this.stageRenderGroup.render(PIXI.projection);if(b.interactive){if(!b._interactiveEventsAdded){b._interactiveEventsAdded=true;b.interactionManager.setTarget(this)}}if(PIXI.Texture.frameUpdates.length>0){for(var c=0;c0){n=n.children[n.children.length-1];if(n.renderable){b=n}}if(b instanceof PIXI.Sprite){c=b.batch;var l=c.head;if(l==b){h=0}else{h=1;while(l.__next!=b){h++;l=l.__next}}}else{c=b}if(m==c){if(m instanceof PIXI.WebGLBatch){m.render(p,h+1)}else{this.renderSpecial(m,j)}return}d=this.batchs.indexOf(m);q=this.batchs.indexOf(c);if(m instanceof PIXI.WebGLBatch){m.render(p)}else{this.renderSpecial(m,j)}for(var e=d+1;e=2?parseInt(b[b.length-2],10):PIXI.BitmapText.fonts[this.fontName].size;this.dirty=true};PIXI.BitmapText.prototype.updateText=function(){var h=PIXI.BitmapText.fonts[this.fontName];var m=new PIXI.Point();var j=null;var l=[];var q=0;var e=[];var p=0;var f=this.fontSize/h.size;for(var g=0;g0){this.removeChild(this.getChildAt(0))}this.updateText();this.dirty=false}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)};PIXI.BitmapText.fonts={};PIXI.Text=function(c,b){this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas));this.setText(c);this.setStyle(b);this.updateText();this.dirty=false};PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype);PIXI.Text.prototype.constructor=PIXI.Text;PIXI.Text.prototype.setStyle=function(b){b=b||{};b.font=b.font||"bold 20pt Arial";b.fill=b.fill||"black";b.align=b.align||"left";b.stroke=b.stroke||"black";b.strokeThickness=b.strokeThickness||0;b.wordWrap=b.wordWrap||false;b.wordWrapWidth=b.wordWrapWidth||100;this.style=b;this.dirty=true};PIXI.Sprite.prototype.setText=function(b){this.text=b.toString()||" ";this.dirty=true};PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;var g=this.text;if(this.style.wordWrap){g=this.wordWrap(this.text)}var f=g.split(/(?:\r\n|\r|\n)/);var d=[];var c=0;for(var h=0;hj){return k}else{return arguments.callee(i,l,k,h,j)}}else{return arguments.callee(i,l,m,k,j)}};var f=function(h,j,i){if(h.measureText(j).width<=i||j.length<1){return j}var k=e(h,j,0,j.length,i);return j.substring(0,k)+"\n"+arguments.callee(h,j.substring(k),i)};var b="";var c=g.split("\n");for(var d=0;dthis.baseTexture.width||b.y+b.height>this.baseTexture.height){throw new Error("Texture Error: frame does not fit inside the base Texture dimensions "+this)}this.updateFrame=true;PIXI.Texture.frameUpdates.push(this)};PIXI.Texture.fromImage=function(c,b){var d=PIXI.TextureCache[c];if(!d){d=new PIXI.Texture(PIXI.BaseTexture.fromImage(c,b));PIXI.TextureCache[c]=d}return d};PIXI.Texture.fromFrame=function(c){var b=PIXI.TextureCache[c];if(!b){throw new Error("The frameId '"+c+"' does not exist in the texture cache "+this)}return b};PIXI.Texture.fromCanvas=function(b){var c=new PIXI.BaseTexture(b);return new PIXI.Texture(c)};PIXI.Texture.addTextureToCache=function(b,c){PIXI.TextureCache[c]=b};PIXI.Texture.removeTextureFromCache=function(c){var b=PIXI.TextureCache[c];PIXI.TextureCache[c]=null;return b};PIXI.Texture.frameUpdates=[];PIXI.RenderTexture=function(c,b){PIXI.EventTarget.call(this);this.width=c||100;this.height=b||100;this.indetityMatrix=PIXI.mat3.create();this.frame=new PIXI.Rectangle(0,0,this.width,this.height);if(PIXI.gl){this.initWebGL()}else{this.initCanvas()}};PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype);PIXI.RenderTexture.prototype.constructor=PIXI.RenderTexture;PIXI.RenderTexture.prototype.initWebGL=function(){var b=PIXI.gl;this.glFramebuffer=b.createFramebuffer();b.bindFramebuffer(b.FRAMEBUFFER,this.glFramebuffer);this.glFramebuffer.width=this.width;this.glFramebuffer.height=this.height;this.baseTexture=new PIXI.BaseTexture();this.baseTexture.width=this.width;this.baseTexture.height=this.height;this.baseTexture._glTexture=b.createTexture();b.bindTexture(b.TEXTURE_2D,this.baseTexture._glTexture);b.texImage2D(b.TEXTURE_2D,0,b.RGBA,this.width,this.height,0,b.RGBA,b.UNSIGNED_BYTE,null);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MAG_FILTER,b.LINEAR);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_MIN_FILTER,b.LINEAR);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_S,b.CLAMP_TO_EDGE);b.texParameteri(b.TEXTURE_2D,b.TEXTURE_WRAP_T,b.CLAMP_TO_EDGE);this.baseTexture.isRender=true;b.bindFramebuffer(b.FRAMEBUFFER,this.glFramebuffer);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,this.baseTexture._glTexture,0);this.projection=new PIXI.Point(this.width/2,this.height/2);this.render=this.renderWebGL};PIXI.RenderTexture.prototype.resize=function(c,b){this.width=c;this.height=b;if(PIXI.gl){this.projection.x=this.width/2;this.projection.y=this.height/2;var d=PIXI.gl;d.bindTexture(d.TEXTURE_2D,this.baseTexture._glTexture);d.texImage2D(d.TEXTURE_2D,0,d.RGBA,this.width,this.height,0,d.RGBA,d.UNSIGNED_BYTE,null)}else{this.frame.width=this.width;this.frame.height=this.height;this.renderer.resize(this.width,this.height)}};PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0);this.baseTexture=new PIXI.BaseTexture(this.renderer.view);this.frame=new PIXI.Rectangle(0,0,this.width,this.height);this.render=this.renderCanvas};PIXI.RenderTexture.prototype.renderWebGL=function(k,g,h){var f=PIXI.gl;f.colorMask(true,true,true,true);f.viewport(0,0,this.width,this.height);f.bindFramebuffer(f.FRAMEBUFFER,this.glFramebuffer);if(h){f.clearColor(0,0,0,0);f.clear(f.COLOR_BUFFER_BIT)}var c=k.children;var b=k.worldTransform;k.worldTransform=PIXI.mat3.create();k.worldTransform[4]=-1;k.worldTransform[5]=this.projection.y*2;if(g){k.worldTransform[2]=g.x;k.worldTransform[5]-=g.y}PIXI.visibleCount++;k.vcount=PIXI.visibleCount;for(var e=0,d=c.length;e>1;if(k<3){return[]}var u=[];var g=[];for(var s=0;s3){var q=g[(s+0)%o];var m=g[(s+1)%o];var l=g[(s+2)%o];var f=h[2*q],d=h[2*q+1];var v=h[2*m],t=h[2*m+1];var c=h[2*l],b=h[2*l+1];var e=false;if(PIXI.PolyK._convex(f,d,v,t,c,b,z)){e=true;for(var r=0;r3*o){if(z){var u=[];g=[];for(var s=0;s=0)&&(m>=0)&&(n+m<1)};PIXI.PolyK._convex=function(e,d,g,f,b,h,c){return((d-f)*(b-g)+(g-e)*(h-f)>=0)==c};Phaser.Camera=function(d,g,c,f,e,b){this.game=d;this.world=d.world;this.id=0;this.view=new Phaser.Rectangle(c,f,e,b);this.screenView=new Phaser.Rectangle(c,f,e,b);this.deadzone=null;this.visible=true;this.atLimit={x:false,y:false};this.target=null;this._edge=0};Phaser.Camera.FOLLOW_LOCKON=0;Phaser.Camera.FOLLOW_PLATFORMER=1;Phaser.Camera.FOLLOW_TOPDOWN=2;Phaser.Camera.FOLLOW_TOPDOWN_TIGHT=3;Phaser.Camera.prototype={follow:function(f,d){if(typeof d==="undefined"){d=Phaser.Camera.FOLLOW_LOCKON}this.target=f;var e;switch(d){case Phaser.Camera.FOLLOW_PLATFORMER:var b=this.width/8;var c=this.height/3;this.deadzone=new Phaser.Rectangle((this.width-b)/2,(this.height-c)/2-c*0.25,b,c);break;case Phaser.Camera.FOLLOW_TOPDOWN:e=Math.max(this.width,this.height)/4;this.deadzone=new Phaser.Rectangle((this.width-e)/2,(this.height-e)/2,e,e);break;case Phaser.Camera.FOLLOW_TOPDOWN_TIGHT:e=Math.max(this.width,this.height)/8;this.deadzone=new Phaser.Rectangle((this.width-e)/2,(this.height-e)/2,e,e);break;case Phaser.Camera.FOLLOW_LOCKON:default:this.deadzone=null;break}},focusOnXY:function(b,c){this.view.x=Math.round(b-this.view.halfWidth);this.view.y=Math.round(c-this.view.halfHeight)},update:function(){if(this.target!==null){if(this.deadzone){this._edge=this.target.x-this.deadzone.x;if(this.view.x>this._edge){this.view.x=this._edge}this._edge=this.target.x+this.target.width-this.deadzone.x-this.deadzone.width;if(this.view.xthis._edge){this.view.y=this._edge}this._edge=this.target.y+this.target.height-this.deadzone.y-this.deadzone.height;if(this.view.ythis.world.bounds.right-this.width){this.atLimit.x=true;this.view.x=(this.world.bounds.right-this.width)+1}if(this.view.ythis.world.bounds.bottom-this.height){this.atLimit.y=true;this.view.y=(this.world.bounds.bottom-this.height)+1}this.view.floor()},setPosition:function(b,c){this.view.x=b;this.view.y=c;this.checkWorldBounds()},setSize:function(c,b){this.view.width=c;this.view.height=b}};Object.defineProperty(Phaser.Camera.prototype,"x",{get:function(){return this.view.x},set:function(b){this.view.x=b;this.checkWorldBounds()}});Object.defineProperty(Phaser.Camera.prototype,"y",{get:function(){return this.view.y},set:function(b){this.view.y=b;this.checkWorldBounds()}});Object.defineProperty(Phaser.Camera.prototype,"width",{get:function(){return this.view.width},set:function(b){this.view.width=b}});Object.defineProperty(Phaser.Camera.prototype,"height",{get:function(){return this.view.height},set:function(b){this.view.height=b}});Phaser.State=function(){this.game=null;this.add=null;this.camera=null;this.cache=null;this.input=null;this.load=null;this.sound=null;this.stage=null;this.time=null;this.tweens=null;this.world=null;this.particles=null;this.physics=null};Phaser.State.prototype={link:function(b){this.game=b;this.add=b.add;this.camera=b.camera;this.cache=b.cache;this.input=b.input;this.load=b.load;this.sound=b.sound;this.stage=b.stage;this.time=b.time;this.tweens=b.tweens;this.world=b.world;this.particles=b.particles;this.physics=b.physics},preload:function(){},create:function(){},update:function(){},render:function(){},paused:function(){},destroy:function(){}};Phaser.StateManager=function(c,b){this.game=c;this.states={};if(b!==null){this._pendingState=b}};Phaser.StateManager.prototype={game:null,_pendingState:null,_created:false,states:{},current:"",onInitCallback:null,onPreloadCallback:null,onCreateCallback:null,onUpdateCallback:null,onRenderCallback:null,onPreRenderCallback:null,onLoadUpdateCallback:null,onLoadRenderCallback:null,onPausedCallback:null,onShutDownCallback:null,boot:function(){if(this._pendingState!==null){if(typeof this._pendingState==="string"){this.start(this._pendingState,false,false)}else{this.add("default",this._pendingState,true)}}},add:function(c,d,b){if(typeof b==="undefined"){b=false}var e;if(d instanceof Phaser.State){e=d;e.link(this.game)}else{if(typeof d==="object"){e=d}else{if(typeof d==="function"){e=new d(this.game)}}}this.states[c]=e;if(b){if(this.game.isBooted){this.start(c)}else{this._pendingState=c}}return e},remove:function(b){if(this.current==b){this.callbackContext=null;this.onInitCallback=null;this.onShutDownCallback=null;this.onPreloadCallback=null;this.onLoadRenderCallback=null;this.onLoadUpdateCallback=null;this.onCreateCallback=null;this.onUpdateCallback=null;this.onRenderCallback=null;this.onPausedCallback=null;this.onDestroyCallback=null}delete this.states[b]},start:function(c,b,d){if(typeof b==="undefined"){b=true}if(typeof d==="undefined"){d=false}if(this.game.isBooted==false){this._pendingState=c;return}if(this.checkState(c)==false){return}else{if(this.current){this.onShutDownCallback.call(this.callbackContext)}if(b){if(d==true){this.game.cache.destroy()}}this.setCurrentState(c)}if(this.onPreloadCallback){this.game.load.reset();this.onPreloadCallback.call(this.callbackContext);if(this.game.load.queueSize==0){this.game.loadComplete();if(this.onCreateCallback){this.onCreateCallback.call(this.callbackContext)}this._created=true}else{this.game.load.start()}}else{if(this.onCreateCallback){this.onCreateCallback.call(this.callbackContext)}this._created=true;this.game.loadComplete()}},dummy:function(){},checkState:function(b){if(this.states[b]){var c=false;if(this.states[b]["preload"]){c=true}if(c==false&&this.states[b]["loadRender"]){c=true}if(c==false&&this.states[b]["loadUpdate"]){c=true}if(c==false&&this.states[b]["create"]){c=true}if(c==false&&this.states[b]["update"]){c=true}if(c==false&&this.states[b]["preRender"]){c=true}if(c==false&&this.states[b]["render"]){c=true}if(c==false&&this.states[b]["paused"]){c=true}if(c==false){console.warn("Invalid Phaser State object given. Must contain at least a one of the required functions.");return false}return true}else{console.warn("Phaser.StateManager - No state found with the key: "+b);return false}},setCurrentState:function(b){this.callbackContext=this.states[b];this.onInitCallback=this.states[b]["init"]||this.dummy;this.onPreloadCallback=this.states[b]["preload"]||null;this.onLoadRenderCallback=this.states[b]["loadRender"]||null;this.onLoadUpdateCallback=this.states[b]["loadUpdate"]||null;this.onCreateCallback=this.states[b]["create"]||null;this.onUpdateCallback=this.states[b]["update"]||null;this.onPreRenderCallback=this.states[b]["preRender"]||null;this.onRenderCallback=this.states[b]["render"]||null;this.onPausedCallback=this.states[b]["paused"]||null;this.onShutDownCallback=this.states[b]["shutdown"]||this.dummy;this.current=b;this._created=false;this.onInitCallback.call(this.callbackContext)},loadComplete:function(){if(this._created==false&&this.onCreateCallback){this.onCreateCallback.call(this.callbackContext);this._created=true}},update:function(){if(this._created&&this.onUpdateCallback){this.onUpdateCallback.call(this.callbackContext)}else{if(this.onLoadUpdateCallback){this.onLoadUpdateCallback.call(this.callbackContext)}}},preRender:function(){if(this.onPreRenderCallback){this.onPreRenderCallback.call(this.callbackContext)}},render:function(){if(this._created&&this.onRenderCallback){this.onRenderCallback.call(this.callbackContext)}else{if(this.onLoadRenderCallback){this.onLoadRenderCallback.call(this.callbackContext)}}},destroy:function(){this.callbackContext=null;this.onInitCallback=null;this.onShutDownCallback=null;this.onPreloadCallback=null;this.onLoadRenderCallback=null;this.onLoadUpdateCallback=null;this.onCreateCallback=null;this.onUpdateCallback=null;this.onRenderCallback=null;this.onPausedCallback=null;this.onDestroyCallback=null;this.game=null;this.states={};this._pendingState=null}};Phaser.LinkedList=function(){this.next=null;this.prev=null;this.first=null;this.last=null;this.total=0};Phaser.LinkedList.prototype={add:function(b){if(this.total==0&&this.first==null&&this.last==null){this.first=b;this.last=b;this.next=b;b.prev=this;this.total++;return}this.last.next=b;b.prev=this.last;this.last=b;this.total++;return b},remove:function(c){if(this.first==null&&this.last==null){return}this.total--;if(this.first==c&&this.last==c){this.first=null;this.last=null;this.next=null;c.next=null;c.prev=null;return}var b=c.prev;if(c.next){c.next.prev=c.prev}b.next=c.next},callAll:function(c){var b=this.first;do{if(b[c]){b[c].call(b)}b=b.next}while(b!=this.last.next)},dump:function(){var j=20;var e="\n"+Phaser.Utils.pad("Node",j)+"|"+Phaser.Utils.pad("Next",j)+"|"+Phaser.Utils.pad("Previous",j)+"|"+Phaser.Utils.pad("First",j)+"|"+Phaser.Utils.pad("Last",j);console.log(e);var e=Phaser.Utils.pad("----------",j)+"|"+Phaser.Utils.pad("----------",j)+"|"+Phaser.Utils.pad("----------",j)+"|"+Phaser.Utils.pad("----------",j)+"|"+Phaser.Utils.pad("----------",j);console.log(e);var g=this;var c=g.last.next;g=g.first;do{var d=g.sprite.name||"*";var f="-";var b="-";var h="-";var i="-";if(g.next){f=g.next.sprite.name}if(g.prev){b=g.prev.sprite.name}if(g.first){h=g.first.sprite.name}if(g.last){i=g.last.sprite.name}if(typeof f==="undefined"){f="-"}if(typeof b==="undefined"){b="-"}if(typeof h==="undefined"){h="-"}if(typeof i==="undefined"){i="-"}var e=Phaser.Utils.pad(d,j)+"|"+Phaser.Utils.pad(f,j)+"|"+Phaser.Utils.pad(b,j)+"|"+Phaser.Utils.pad(h,j)+"|"+Phaser.Utils.pad(i,j);console.log(e);g=g.next}while(g!=c)}};Phaser.Signal=function(){this._bindings=[];this._prevParams=null;var b=this;this.dispatch=function(){Phaser.Signal.prototype.dispatch.apply(b,arguments)}};Phaser.Signal.prototype={memorize:false,_shouldPropagate:true,active:true,validateListener:function(b,c){if(typeof b!=="function"){throw new Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",c))}},_registerListener:function(f,d,e,c){var b=this._indexOfListener(f,e),g;if(b!==-1){g=this._bindings[b];if(g.isOnce()!==d){throw new Error("You cannot add"+(d?"":"Once")+"() then add"+(!d?"":"Once")+"() the same listener without removing the relationship first.")}}else{g=new Phaser.SignalBinding(this,f,d,e,c);this._addBinding(g)}if(this.memorize&&this._prevParams){g.execute(this._prevParams)}return g},_addBinding:function(b){var c=this._bindings.length;do{--c}while(this._bindings[c]&&b._priority<=this._bindings[c]._priority);this._bindings.splice(c+1,0,b)},_indexOfListener:function(c,b){var e=this._bindings.length,d;while(e--){d=this._bindings[e];if(d._listener===c&&d.context===b){return e}}return -1},has:function(c,b){return this._indexOfListener(c,b)!==-1},add:function(d,c,b){this.validateListener(d,"add");return this._registerListener(d,false,c,b)},addOnce:function(d,c,b){this.validateListener(d,"addOnce");return this._registerListener(d,true,c,b)},remove:function(d,c){this.validateListener(d,"remove");var b=this._indexOfListener(d,c);if(b!==-1){this._bindings[b]._destroy();this._bindings.splice(b,1)}return d},removeAll:function(){var b=this._bindings.length;while(b--){this._bindings[b]._destroy()}this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=false},dispatch:function(c){if(!this.active){return}var b=Array.prototype.slice.call(arguments),e=this._bindings.length,d;if(this.memorize){this._prevParams=b}if(!e){return}d=this._bindings.slice();this._shouldPropagate=true;do{e--}while(d[e]&&this._shouldPropagate&&d[e].execute(b)!==false)},forget:function(){this._prevParams=null},dispose:function(){this.removeAll();delete this._bindings;delete this._prevParams},toString:function(){return"[Phaser.Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};Phaser.SignalBinding=function(f,e,c,d,b){this._listener=e;this._isOnce=c;this.context=d;this._signal=f;this._priority=b||0};Phaser.SignalBinding.prototype={active:true,params:null,execute:function(b){var d,c;if(this.active&&!!this._listener){c=this.params?this.params.concat(b):b;d=this._listener.apply(this.context,c);if(this._isOnce){this.detach()}}return d},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return(!!this._signal&&!!this._listener)},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal;delete this._listener;delete this.context},toString:function(){return"[Phaser.SignalBinding isOnce:"+this._isOnce+", isBound:"+this.isBound()+", active:"+this.active+"]"}};Phaser.Plugin=function(b,c){this.game=b;this.parent=c;this.active=false;this.visible=false;this.hasPreUpdate=false;this.hasUpdate=false;this.hasRender=false;this.hasPostRender=false};Phaser.Plugin.prototype={preUpdate:function(){},update:function(){},render:function(){},postRender:function(){},destroy:function(){this.game=null;this.parent=null;this.active=false;this.visible=false}};Phaser.PluginManager=function(b,c){this.game=b;this._parent=c;this.plugins=[];this._pluginsLength=0};Phaser.PluginManager.prototype={add:function(c){var b=false;if(typeof c==="function"){c=new c(this.game,this._parent)}else{c.game=this.game;c.parent=this._parent}if(typeof c.preUpdate==="function"){c.hasPreUpdate=true;b=true}if(typeof c.update==="function"){c.hasUpdate=true;b=true}if(typeof c.render==="function"){c.hasRender=true;b=true}if(typeof c.postRender==="function"){c.hasPostRender=true;b=true}if(b){if(c.hasPreUpdate||c.hasUpdate){c.active=true}if(c.hasRender||c.hasPostRender){c.visible=true}this._pluginsLength=this.plugins.push(c);return c}else{return null}},remove:function(b){this._pluginsLength--},preUpdate:function(){if(this._pluginsLength==0){return}for(this._p=0;this._p0)},removeBetween:function(d,c){if(d>c||d<0||c>this._container.children.length){return false}for(var b=d;b=this.game.width){this.bounds.width=c}if(b>=this.game.height){this.bounds.height=b}}};Object.defineProperty(Phaser.World.prototype,"width",{get:function(){return this.bounds.width},set:function(b){this.bounds.width=b}});Object.defineProperty(Phaser.World.prototype,"height",{get:function(){return this.bounds.height},set:function(b){this.bounds.height=b}});Object.defineProperty(Phaser.World.prototype,"centerX",{get:function(){return this.bounds.halfWidth}});Object.defineProperty(Phaser.World.prototype,"centerY",{get:function(){return this.bounds.halfHeight}});Object.defineProperty(Phaser.World.prototype,"randomX",{get:function(){return Math.round(Math.random()*this.bounds.width)}});Object.defineProperty(Phaser.World.prototype,"randomY",{get:function(){return Math.round(Math.random()*this.bounds.height)}});Phaser.Game=function(e,b,g,d,f,h,c){e=e||800;b=b||600;g=g||Phaser.AUTO;d=d||"";f=f||null;h=h||false;c=c||true;this.id=Phaser.GAMES.push(this)-1;this.parent=d;this.width=e;this.height=b;this.transparent=h;this.antialias=c;this.renderer=null;this.state=new Phaser.StateManager(this,f);this._paused=false;this.renderType=g;this._loadComplete=false;this.isBooted=false;this.isRunning=false;this.raf=null;this.add=null;this.cache=null;this.input=null;this.load=null;this.math=null;this.net=null;this.sound=null;this.stage=null;this.time=null;this.tweens=null;this.world=null;this.physics=null;this.rnd=null;this.device=null;this.camera=null;this.canvas=null;this.context=null;this.debug=null;this.particles=null;var i=this;this._onBoot=function(){return i.boot()};if(document.readyState==="complete"||document.readyState==="interactive"){window.setTimeout(this._onBoot,0)}else{document.addEventListener("DOMContentLoaded",this._onBoot,false);window.addEventListener("load",this._onBoot,false)}return this};Phaser.Game.prototype={boot:function(){if(this.isBooted){return}if(!document.body){window.setTimeout(this._onBoot,20)}else{document.removeEventListener("DOMContentLoaded",this._onBoot);window.removeEventListener("load",this._onBoot);this.onPause=new Phaser.Signal;this.onResume=new Phaser.Signal;this.isBooted=true;this.device=new Phaser.Device();this.math=Phaser.Math;this.rnd=new Phaser.RandomDataGenerator([(Date.now()*Math.random()).toString()]);this.stage=new Phaser.Stage(this,this.width,this.height);this.setUpRenderer();this.world=new Phaser.World(this);this.add=new Phaser.GameObjectFactory(this);this.cache=new Phaser.Cache(this);this.load=new Phaser.Loader(this);this.time=new Phaser.Time(this);this.tweens=new Phaser.TweenManager(this);this.input=new Phaser.Input(this);this.sound=new Phaser.SoundManager(this);this.physics=new Phaser.Physics.Arcade(this);this.particles=new Phaser.Particles(this);this.plugins=new Phaser.PluginManager(this,this);this.net=new Phaser.Net(this);this.debug=new Phaser.Utils.Debug(this);this.load.onLoadComplete.add(this.loadComplete,this);this.stage.boot();this.world.boot();this.state.boot();this.input.boot();this.sound.boot();if(this.renderType==Phaser.CANVAS){console.log("%cPhaser "+Phaser.VERSION+" initialized. Rendering to Canvas","color: #ffff33; background: #000000")}else{console.log("%cPhaser "+Phaser.VERSION+" initialized. Rendering to WebGL","color: #ffff33; background: #000000")}this.isRunning=true;this._loadComplete=false;this.raf=new Phaser.RequestAnimationFrame(this);this.raf.start()}},setUpRenderer:function(){if(this.renderType===Phaser.CANVAS||(this.renderType===Phaser.AUTO&&this.device.webGL==false)){if(this.device.canvas){this.renderType=Phaser.CANVAS;this.renderer=new PIXI.CanvasRenderer(this.width,this.height,this.stage.canvas,this.transparent);Phaser.Canvas.setSmoothingEnabled(this.renderer.context,this.antialias);this.canvas=this.renderer.view;this.context=this.renderer.context}else{throw new Error("Phaser.Game - cannot create Canvas or WebGL context, aborting.")}}else{this.renderType=Phaser.WEBGL;this.renderer=new PIXI.WebGLRenderer(this.width,this.height,this.stage.canvas,this.transparent,this.antialias);this.canvas=this.renderer.view;this.context=null}Phaser.Canvas.addToDOM(this.renderer.view,this.parent,true);Phaser.Canvas.setTouchAction(this.renderer.view)},loadComplete:function(){this._loadComplete=true;this.state.loadComplete()},update:function(b){this.time.update(b);if(!this._paused){this.plugins.preUpdate();this.physics.preUpdate();this.input.update();this.tweens.update();this.sound.update();this.world.update();this.particles.update();this.state.update();this.plugins.update();this.renderer.render(this.stage._stage);this.plugins.render();this.state.render();this.plugins.postRender()}},destroy:function(){this.state.destroy();this.state=null;this.cache=null;this.input=null;this.load=null;this.sound=null;this.stage=null;this.time=null;this.world=null;this.isBooted=false}};Object.defineProperty(Phaser.Game.prototype,"paused",{get:function(){return this._paused},set:function(b){if(b===true){if(this._paused==false){this._paused=true;this.onPause.dispatch(this)}}else{if(this._paused){this._paused=false;this.onResume.dispatch(this)}}}});Phaser.Input=function(b){this.game=b;this.hitCanvas=null;this.hitContext=null};Phaser.Input.MOUSE_OVERRIDES_TOUCH=0;Phaser.Input.TOUCH_OVERRIDES_MOUSE=1;Phaser.Input.MOUSE_TOUCH_COMBINE=2;Phaser.Input.prototype={game:null,pollRate:0,_pollCounter:0,_oldPosition:null,_x:0,_y:0,disabled:false,multiInputOverride:Phaser.Input.MOUSE_TOUCH_COMBINE,position:null,speed:null,circle:null,scale:null,maxPointers:10,currentPointers:0,tapRate:200,doubleTapRate:300,holdRate:2000,justPressedRate:200,justReleasedRate:200,recordPointerHistory:false,recordRate:100,recordLimit:100,pointer1:null,pointer2:null,pointer3:null,pointer4:null,pointer5:null,pointer6:null,pointer7:null,pointer8:null,pointer9:null,pointer10:null,activePointer:null,mousePointer:null,mouse:null,keyboard:null,touch:null,mspointer:null,onDown:null,onUp:null,onTap:null,onHold:null,interactiveItems:new Phaser.LinkedList(),boot:function(){this.mousePointer=new Phaser.Pointer(this.game,0);this.pointer1=new Phaser.Pointer(this.game,1);this.pointer2=new Phaser.Pointer(this.game,2);this.mouse=new Phaser.Mouse(this.game);this.keyboard=new Phaser.Keyboard(this.game);this.touch=new Phaser.Touch(this.game);this.mspointer=new Phaser.MSPointer(this.game);this.onDown=new Phaser.Signal();this.onUp=new Phaser.Signal();this.onTap=new Phaser.Signal();this.onHold=new Phaser.Signal();this.scale=new Phaser.Point(1,1);this.speed=new Phaser.Point();this.position=new Phaser.Point();this._oldPosition=new Phaser.Point();this.circle=new Phaser.Circle(0,0,44);this.activePointer=this.mousePointer;this.currentPointers=0;this.hitCanvas=document.createElement("canvas");this.hitCanvas.width=1;this.hitCanvas.height=1;this.hitContext=this.hitCanvas.getContext("2d");this.mouse.start();this.keyboard.start();this.touch.start();this.mspointer.start();this.mousePointer.active=true},addPointer:function(){var c=0;for(var b=10;b>0;b--){if(this["pointer"+b]===null){c=b}}if(c==0){console.warn("You can only have 10 Pointer objects");return null}else{this["pointer"+c]=new Phaser.Pointer(this.game,c);return this["pointer"+c]}},update:function(){if(this.pollRate>0&&this._pollCounter0&&this._pollCounter=this.game.input.holdRate){if(this.game.input.multiInputOverride==Phaser.Input.MOUSE_OVERRIDES_TOUCH||this.game.input.multiInputOverride==Phaser.Input.MOUSE_TOUCH_COMBINE||(this.game.input.multiInputOverride==Phaser.Input.TOUCH_OVERRIDES_MOUSE&&this.game.input.currentPointers==0)){this.game.input.onHold.dispatch(this)}this._holdSent=true}if(this.game.input.recordPointerHistory&&this.game.time.now>=this._nextDrop){this._nextDrop=this.game.time.now+this.game.input.recordRate;this._history.push({x:this.position.x,y:this.position.y});if(this._history.length>this.game.input.recordLimit){this._history.shift()}}}},move:function(c){if(this.game.input.pollLocked){return}if(c.button){this.button=c.button}this.clientX=c.clientX;this.clientY=c.clientY;this.pageX=c.pageX;this.pageY=c.pageY;this.screenX=c.screenX;this.screenY=c.screenY;this.x=(this.pageX-this.game.stage.offset.x)*this.game.input.scale.x;this.y=(this.pageY-this.game.stage.offset.y)*this.game.input.scale.y;this.position.setTo(this.x,this.y);this.circle.x=this.x;this.circle.y=this.y;if(this.game.input.multiInputOverride==Phaser.Input.MOUSE_OVERRIDES_TOUCH||this.game.input.multiInputOverride==Phaser.Input.MOUSE_TOUCH_COMBINE||(this.game.input.multiInputOverride==Phaser.Input.TOUCH_OVERRIDES_MOUSE&&this.game.input.currentPointers==0)){this.game.input.activePointer=this;this.game.input.x=this.x;this.game.input.y=this.y;this.game.input.position.setTo(this.game.input.x,this.game.input.y);this.game.input.circle.x=this.game.input.x;this.game.input.circle.y=this.game.input.y}if(this.game.paused){return this}if(this.targetObject!==null&&this.targetObject.isDragged==true){if(this.targetObject.update(this)==false){this.targetObject=null}return this}this._highestRenderOrderID=-1;this._highestRenderObject=null;this._highestInputPriorityID=-1;if(this.game.input.interactiveItems.total>0){var b=this.game.input.interactiveItems.next;do{if(b.priorityID>this._highestInputPriorityID||(b.priorityID==this._highestInputPriorityID&&b.sprite.renderOrderID>this._highestRenderOrderID)){if(b.checkPointerOver(this)){this._highestRenderOrderID=b.sprite.renderOrderID;this._highestInputPriorityID=b.priorityID;this._highestRenderObject=b}}b=b.next}while(b!=null)}if(this._highestRenderObject==null){if(this.targetObject){this.targetObject._pointerOutHandler(this);this.targetObject=null}}else{if(this.targetObject==null){this.targetObject=this._highestRenderObject;this._highestRenderObject._pointerOverHandler(this)}else{if(this.targetObject==this._highestRenderObject){if(this._highestRenderObject.update(this)==false){this.targetObject=null}}else{this.targetObject._pointerOutHandler(this);this.targetObject=this._highestRenderObject;this.targetObject._pointerOverHandler(this)}}}return this},leave:function(b){this.withinGame=false;this.move(b)},stop:function(c){if(this._stateReset){c.preventDefault();return}this.timeUp=this.game.time.now;if(this.game.input.multiInputOverride==Phaser.Input.MOUSE_OVERRIDES_TOUCH||this.game.input.multiInputOverride==Phaser.Input.MOUSE_TOUCH_COMBINE||(this.game.input.multiInputOverride==Phaser.Input.TOUCH_OVERRIDES_MOUSE&&this.game.input.currentPointers==0)){this.game.input.onUp.dispatch(this);if(this.duration>=0&&this.duration<=this.game.input.tapRate){if(this.timeUp-this.previousTapTime0){this.active=false}this.withinGame=false;this.isDown=false;this.isUp=true;if(this.isMouse==false){this.game.input.currentPointers--}if(this.game.input.interactiveItems.total>0){var b=this.game.input.interactiveItems.next;do{if(b){b._releasedHandler(this)}b=b.next}while(b!=null)}if(this.targetObject){this.targetObject._releasedHandler(this)}this.targetObject=null;return this},justPressed:function(b){b=b||this.game.input.justPressedRate;return(this.isDown===true&&(this.timeDown+b)>this.game.time.now)},justReleased:function(b){b=b||this.game.input.justReleasedRate;return(this.isUp===true&&(this.timeUp+b)>this.game.time.now)},reset:function(){if(this.isMouse==false){this.active=false}this.identifier=null;this.isDown=false;this.isUp=true;this.totalTouches=0;this._holdSent=false;this._history.length=0;this._stateReset=true;if(this.targetObject){this.targetObject._releasedHandler(this)}this.targetObject=null},toString:function(){return"[{Pointer (id="+this.id+" identifer="+this.identifier+" active="+this.active+" duration="+this.duration+" withinGame="+this.withinGame+" x="+this.x+" y="+this.y+" clientX="+this.clientX+" clientY="+this.clientY+" screenX="+this.screenX+" screenY="+this.screenY+" pageX="+this.pageX+" pageY="+this.pageY+")}]"}};Object.defineProperty(Phaser.Pointer.prototype,"duration",{get:function(){if(this.isUp){return -1}return this.game.time.now-this.timeDown}});Object.defineProperty(Phaser.Pointer.prototype,"worldX",{get:function(){return this.game.world.camera.x+this.x}});Object.defineProperty(Phaser.Pointer.prototype,"worldY",{get:function(){return this.game.world.camera.y+this.y}});Phaser.Touch=function(b){this.game=b;this.callbackContext=this.game;this.touchStartCallback=null;this.touchMoveCallback=null;this.touchEndCallback=null;this.touchEnterCallback=null;this.touchLeaveCallback=null;this.touchCancelCallback=null;this.preventDefault=true};Phaser.Touch.prototype={game:null,disabled:false,_onTouchStart:null,_onTouchMove:null,_onTouchEnd:null,_onTouchEnter:null,_onTouchLeave:null,_onTouchCancel:null,_onTouchMove:null,start:function(){var b=this;if(this.game.device.touch){this._onTouchStart=function(c){return b.onTouchStart(c)};this._onTouchMove=function(c){return b.onTouchMove(c)};this._onTouchEnd=function(c){return b.onTouchEnd(c)};this._onTouchEnter=function(c){return b.onTouchEnter(c)};this._onTouchLeave=function(c){return b.onTouchLeave(c)};this._onTouchCancel=function(c){return b.onTouchCancel(c)};this.game.renderer.view.addEventListener("touchstart",this._onTouchStart,false);this.game.renderer.view.addEventListener("touchmove",this._onTouchMove,false);this.game.renderer.view.addEventListener("touchend",this._onTouchEnd,false);this.game.renderer.view.addEventListener("touchenter",this._onTouchEnter,false);this.game.renderer.view.addEventListener("touchleave",this._onTouchLeave,false);this.game.renderer.view.addEventListener("touchcancel",this._onTouchCancel,false)}},consumeDocumentTouches:function(){this._documentTouchMove=function(b){b.preventDefault()};document.addEventListener("touchmove",this._documentTouchMove,false)},onTouchStart:function(c){if(this.touchStartCallback){this.touchStartCallback.call(this.callbackContext,c)}if(this.game.input.disabled||this.disabled){return}if(this.preventDefault){c.preventDefault()}for(var b=0;bb&&this._tempPoint.xc&&this._tempPoint.y=this.pixelPerfectAlpha){return true}}return false},update:function(b){if(this.enabled==false||this.sprite.visible==false){this._pointerOutHandler(b);return false}if(this.draggable&&this._draggedPointerID==b.id){return this.updateDrag(b)}else{if(this._pointerData[b.id].isOver==true){if(this.checkPointerOver(b)){this._pointerData[b.id].x=b.x-this.sprite.x;this._pointerData[b.id].y=b.y-this.sprite.y;return true}else{this._pointerOutHandler(b);return false}}}},_pointerOverHandler:function(b){if(this._pointerData[b.id].isOver==false){this._pointerData[b.id].isOver=true;this._pointerData[b.id].isOut=false;this._pointerData[b.id].timeOver=this.game.time.now;this._pointerData[b.id].x=b.x-this.sprite.x;this._pointerData[b.id].y=b.y-this.sprite.y;if(this.useHandCursor&&this._pointerData[b.id].isDragged==false){this.game.stage.canvas.style.cursor="pointer"}this.sprite.events.onInputOver.dispatch(this.sprite,b)}},_pointerOutHandler:function(b){this._pointerData[b.id].isOver=false;this._pointerData[b.id].isOut=true;this._pointerData[b.id].timeOut=this.game.time.now;if(this.useHandCursor&&this._pointerData[b.id].isDragged==false){this.game.stage.canvas.style.cursor="default"}this.sprite.events.onInputOut.dispatch(this.sprite,b)},_touchedHandler:function(b){if(this._pointerData[b.id].isDown==false&&this._pointerData[b.id].isOver==true){this._pointerData[b.id].isDown=true;this._pointerData[b.id].isUp=false;this._pointerData[b.id].timeDown=this.game.time.now;this.sprite.events.onInputDown.dispatch(this.sprite,b);if(this.draggable&&this.isDragged==false){this.startDrag(b)}if(this.bringToTop){this.sprite.bringToTop()}}return this.consumePointerEvent},_releasedHandler:function(b){if(this._pointerData[b.id].isDown&&b.isUp){this._pointerData[b.id].isDown=false;this._pointerData[b.id].isUp=true;this._pointerData[b.id].timeUp=this.game.time.now;this._pointerData[b.id].downDuration=this._pointerData[b.id].timeUp-this._pointerData[b.id].timeDown;if(this.checkPointerOver(b)){this.sprite.events.onInputUp.dispatch(this.sprite,b)}else{if(this.useHandCursor){this.game.stage.canvas.style.cursor="default"}}if(this.draggable&&this.isDragged&&this._draggedPointerID==b.id){this.stopDrag(b)}}},updateDrag:function(b){if(b.isUp){this.stopDrag(b);return false}if(this.allowHorizontalDrag){this.sprite.x=b.x+this._dragPoint.x+this.dragOffset.x}if(this.allowVerticalDrag){this.sprite.y=b.y+this._dragPoint.y+this.dragOffset.y}if(this.boundsRect){this.checkBoundsRect()}if(this.boundsSprite){this.checkBoundsSprite()}if(this.snapOnDrag){this.sprite.x=Math.floor(this.sprite.x/this.snapX)*this.snapX;this.sprite.y=Math.floor(this.sprite.y/this.snapY)*this.snapY}return true},justOver:function(c,b){c=c||0;b=b||500;return(this._pointerData[c].isOver&&this.overDuration(c)this.boundsRect.right){this.sprite.x=this.boundsRect.right-this.sprite.width}}if(this.sprite.ythis.boundsRect.bottom){this.sprite.y=this.boundsRect.bottom-this.sprite.height}}},checkBoundsSprite:function(){if(this.sprite.x(this.boundsSprite.x+this.boundsSprite.width)){this.sprite.x=(this.boundsSprite.x+this.boundsSprite.width)-this.sprite.width}}if(this.sprite.y(this.boundsSprite.y+this.boundsSprite.height)){this.sprite.y=(this.boundsSprite.y+this.boundsSprite.height)-this.sprite.height}}}};Phaser.Canvas={create:function(d,b){d=d||256;b=b||256;var c=document.createElement("canvas");c.width=d;c.height=b;c.style.display="block";return c},getOffset:function(c,b){b=b||new Phaser.Point;var d=c.getBoundingClientRect();var h=c.clientTop||document.body.clientTop||0;var g=c.clientLeft||document.body.clientLeft||0;var e=window.pageYOffset||c.scrollTop||document.body.scrollTop;var f=window.pageXOffset||c.scrollLeft||document.body.scrollLeft;b.x=d.left+f-g;b.y=d.top+e-h;return b},getAspectRatio:function(b){return b.width/b.height},setBackgroundColor:function(c,b){b=b||"rgb(0,0,0)";c.style.backgroundColor=b;return c},setTouchAction:function(b,c){c=c||"none";b.style.msTouchAction=c;b.style["ms-touch-action"]=c;b.style["touch-action"]=c;return b},addToDOM:function(b,c,d){c=c||"";d=d||true;if(c!==""){if(document.getElementById(c)){document.getElementById(c).appendChild(b)}else{document.body.appendChild(b)}if(d){document.getElementById(c).style.overflow="hidden"}}else{document.body.appendChild(b)}return b},setTransform:function(f,h,g,d,b,e,c){f.setTransform(d,e,c,b,h,g);return f},setSmoothingEnabled:function(b,c){b.imageSmoothingEnabled=c;b.mozImageSmoothingEnabled=c;b.oImageSmoothingEnabled=c;b.webkitImageSmoothingEnabled=c;b.msImageSmoothingEnabled=c;return b},setImageRenderingCrisp:function(b){b.style["image-rendering"]="crisp-edges";b.style["image-rendering"]="-moz-crisp-edges";b.style["image-rendering"]="-webkit-optimize-contrast";b.style.msInterpolationMode="nearest-neighbor";return b},setImageRenderingBicubic:function(b){b.style["image-rendering"]="auto";b.style.msInterpolationMode="bicubic";return b}};Phaser.Events=function(b){this.parent=b;this.onAddedToGroup=new Phaser.Signal;this.onRemovedFromGroup=new Phaser.Signal;this.onKilled=new Phaser.Signal;this.onRevived=new Phaser.Signal;this.onOutOfBounds=new Phaser.Signal;this.onInputOver=null;this.onInputOut=null;this.onInputDown=null;this.onInputUp=null;this.onDragStart=null;this.onDragStop=null;this.onAnimationStart=null;this.onAnimationComplete=null;this.onAnimationLoop=null};Phaser.GameObjectFactory=function(b){this.game=b;this.world=this.game.world};Phaser.GameObjectFactory.prototype={game:null,world:null,existing:function(b){return this.world.group.add(b)},sprite:function(b,e,c,d){return this.world.group.add(new Phaser.Sprite(this.game,b,e,c,d))},child:function(d,b,g,c,e){var f=this.world.group.add(new Phaser.Sprite(this.game,b,g,c,e));d.addChild(f);return f},tween:function(b){return this.game.tweens.create(b)},group:function(c,b){return new Phaser.Group(this.game,c,b)},audio:function(c,d,b){return this.game.sound.add(c,d,b)},tileSprite:function(c,g,e,b,d,f){return this.world.group.add(new Phaser.TileSprite(this.game,c,g,e,b,d,f))},text:function(b,e,d,c){return this.world.group.add(new Phaser.Text(this.game,b,e,d,c))},button:function(b,i,g,h,e,d,f,c){return this.world.group.add(new Phaser.Button(this.game,b,i,g,h,e,d,f,c))},graphics:function(b,c){return this.world.group.add(new Phaser.Graphics(this.game,b,c))},emitter:function(b,d,c){return this.game.particles.add(new Phaser.Particles.Arcade.Emitter(this.game,b,d,c))},bitmapText:function(b,e,d,c){return this.world.group.add(new Phaser.BitmapText(this.game,b,e,d,c))},tilemap:function(b,g,d,e,f,c){return this.world.group.add(new Phaser.Tilemap(this.game,d,b,g,e,f,c))},renderTexture:function(c,d,b){var e=new Phaser.RenderTexture(this.game,c,d,b);this.game.cache.addRenderTexture(c,e);return e}};Phaser.Sprite=function(c,b,f,d,e){b=b||0;f=f||0;d=d||null;e=e||null;this.game=c;this.exists=true;this.alive=true;this.group=null;this.name="";this.type=Phaser.SPRITE;this.renderOrderID=-1;this.lifespan=0;this.events=new Phaser.Events(this);this.animations=new Phaser.AnimationManager(this);this.input=new Phaser.InputHandler(this);this.key=d;if(d instanceof Phaser.RenderTexture){PIXI.Sprite.call(this,d);this.currentFrame=this.game.cache.getTextureFrame(d.name)}else{if(d==null||this.game.cache.checkImageKey(d)==false){d="__default"}PIXI.Sprite.call(this,PIXI.TextureCache[d]);if(this.game.cache.isSpriteSheet(d)){this.animations.loadFrameData(this.game.cache.getFrameData(d));if(e!==null){if(typeof e==="string"){this.frameName=e}else{this.frame=e}}}else{this.currentFrame=this.game.cache.getFrame(d)}}this.anchor=new Phaser.Point();this._cropUUID=null;this._cropRect=null;this.x=b;this.y=f;this.position.x=b;this.position.y=f;this.autoCull=false;this.scale=new Phaser.Point(1,1);this.scrollFactor=new Phaser.Point(1,1);this._cache={dirty:false,a00:1,a01:0,a02:b,a10:0,a11:1,a12:f,id:1,i01:0,i10:0,idi:1,left:null,right:null,top:null,bottom:null,x:-1,y:-1,scaleX:1,scaleY:1,width:this.currentFrame.sourceSizeW,height:this.currentFrame.sourceSizeH,halfWidth:Math.floor(this.currentFrame.sourceSizeW/2),halfHeight:Math.floor(this.currentFrame.sourceSizeH/2),frameID:this.currentFrame.uuid,frameWidth:this.currentFrame.width,frameHeight:this.currentFrame.height,boundsX:0,boundsY:0,cameraVisible:true};this.offset=new Phaser.Point;this.center=new Phaser.Point(b+Math.floor(this._cache.width/2),f+Math.floor(this._cache.height/2));this.topLeft=new Phaser.Point(b,f);this.topRight=new Phaser.Point(b+this._cache.width,f);this.bottomRight=new Phaser.Point(b+this._cache.width,f+this._cache.height);this.bottomLeft=new Phaser.Point(b,f+this._cache.height);this.bounds=new Phaser.Rectangle(b,f,this._cache.width,this._cache.height);this.body=new Phaser.Physics.Arcade.Body(this);this.velocity=this.body.velocity;this.acceleration=this.body.acceleration;this.inWorld=Phaser.Rectangle.intersects(this.bounds,this.game.world.bounds);this.inWorldThreshold=0;this._outOfBoundsFired=false};Phaser.Sprite.prototype=Object.create(PIXI.Sprite.prototype);Phaser.Sprite.prototype.constructor=Phaser.Sprite;Phaser.Sprite.prototype.preUpdate=function(){if(!this.exists){this.renderOrderID=-1;return}if(this.lifespan>0){this.lifespan-=this.game.time.elapsed;if(this.lifespan<=0){this.kill();return}}this._cache.dirty=false;if(this.animations.update()){this._cache.dirty=true}this._cache.x=this.x-(this.game.world.camera.x*this.scrollFactor.x);this._cache.y=this.y-(this.game.world.camera.y*this.scrollFactor.y);if(this.position.x!=this._cache.x||this.position.y!=this._cache.y){this.position.x=this._cache.x;this.position.y=this._cache.y;this._cache.dirty=true}if(this.visible){this.renderOrderID=this.game.world.currentRenderOrderID++;if(this.worldTransform[0]!=this._cache.a00||this.worldTransform[1]!=this._cache.a01){this._cache.a00=this.worldTransform[0];this._cache.a01=this.worldTransform[1];this._cache.i01=this.worldTransform[1];this._cache.scaleX=Math.sqrt((this._cache.a00*this._cache.a00)+(this._cache.a01*this._cache.a01));this._cache.a01*=-1;this._cache.dirty=true}if(this.worldTransform[3]!=this._cache.a10||this.worldTransform[4]!=this._cache.a11){this._cache.a10=this.worldTransform[3];this._cache.i10=this.worldTransform[3];this._cache.a11=this.worldTransform[4];this._cache.scaleY=Math.sqrt((this._cache.a10*this._cache.a10)+(this._cache.a11*this._cache.a11));this._cache.a10*=-1;this._cache.dirty=true}if(this.worldTransform[2]!=this._cache.a02||this.worldTransform[5]!=this._cache.a12){this._cache.a02=this.worldTransform[2];this._cache.a12=this.worldTransform[5];this._cache.dirty=true}if(this.currentFrame.uuid!=this._cache.frameID){this._cache.frameWidth=this.texture.frame.width;this._cache.frameHeight=this.texture.frame.height;this._cache.frameID=this.currentFrame.uuid;this._cache.dirty=true}if(this._cache.dirty){this._cache.width=Math.floor(this.currentFrame.sourceSizeW*this._cache.scaleX);this._cache.height=Math.floor(this.currentFrame.sourceSizeH*this._cache.scaleY);this._cache.halfWidth=Math.floor(this._cache.width/2);this._cache.halfHeight=Math.floor(this._cache.height/2);this._cache.id=1/(this._cache.a00*this._cache.a11+this._cache.a01*-this._cache.a10);this._cache.idi=1/(this._cache.a00*this._cache.a11+this._cache.i01*-this._cache.i10);this.updateBounds()}}else{if(this._cache.dirty&&this.visible==false){this.bounds.x-=this._cache.boundsX-this._cache.x;this._cache.boundsX=this._cache.x;this.bounds.y-=this._cache.boundsy-this._cache.y;this._cache.boundsY=this._cache.y}}if(this._cache.dirty){this._cache.cameraVisible=Phaser.Rectangle.intersects(this.game.world.camera.screenView,this.bounds,0);if(this.autoCull==true){this.visible=this._cache.cameraVisible}this.body.updateBounds(this.center.x,this.center.y,this._cache.scaleX,this._cache.scaleY)}this.body.update()};Phaser.Sprite.prototype.revive=function(){this.alive=true;this.exists=true;this.visible=true;this.events.onRevived.dispatch(this)};Phaser.Sprite.prototype.kill=function(){this.alive=false;this.exists=false;this.visible=false;this.events.onKilled.dispatch(this)};Phaser.Sprite.prototype.reset=function(b,c){this.x=b;this.y=c;this.position.x=b;this.position.y=c;this.alive=true;this.exists=true;this.visible=true;this._outOfBoundsFired=false;this.body.reset()};Phaser.Sprite.prototype.updateBounds=function(){this.offset.setTo(this._cache.a02-(this.anchor.x*this._cache.width),this._cache.a12-(this.anchor.y*this._cache.height));this.getLocalPosition(this.center,this.offset.x+this._cache.halfWidth,this.offset.y+this._cache.halfHeight);this.getLocalPosition(this.topLeft,this.offset.x,this.offset.y);this.getLocalPosition(this.topRight,this.offset.x+this._cache.width,this.offset.y);this.getLocalPosition(this.bottomLeft,this.offset.x,this.offset.y+this._cache.height);this.getLocalPosition(this.bottomRight,this.offset.x+this._cache.width,this.offset.y+this._cache.height);this._cache.left=Phaser.Math.min(this.topLeft.x,this.topRight.x,this.bottomLeft.x,this.bottomRight.x);this._cache.right=Phaser.Math.max(this.topLeft.x,this.topRight.x,this.bottomLeft.x,this.bottomRight.x);this._cache.top=Phaser.Math.min(this.topLeft.y,this.topRight.y,this.bottomLeft.y,this.bottomRight.y);this._cache.bottom=Phaser.Math.max(this.topLeft.y,this.topRight.y,this.bottomLeft.y,this.bottomRight.y);this.bounds.setTo(this._cache.left,this._cache.top,this._cache.right-this._cache.left,this._cache.bottom-this._cache.top);this._cache.boundsX=this._cache.x;this._cache.boundsY=this._cache.y;if(this.inWorld==false){this.inWorld=Phaser.Rectangle.intersects(this.bounds,this.game.world.bounds,this.inWorldThreshold);if(this.inWorld){this._outOfBoundsFired=false}}else{this.inWorld=Phaser.Rectangle.intersects(this.bounds,this.game.world.bounds,this.inWorldThreshold);if(this.inWorld==false){this.events.onOutOfBounds.dispatch(this);this._outOfBoundsFired=true}}};Phaser.Sprite.prototype.getLocalPosition=function(c,b,d){c.x=((this._cache.a11*this._cache.id*b+-this._cache.a01*this._cache.id*d+(this._cache.a12*this._cache.a01-this._cache.a02*this._cache.a11)*this._cache.id)*this._cache.scaleX)+this._cache.a02;c.y=((this._cache.a00*this._cache.id*d+-this._cache.a10*this._cache.id*b+(-this._cache.a12*this._cache.a00+this._cache.a02*this._cache.a10)*this._cache.id)*this._cache.scaleY)+this._cache.a12;return c};Phaser.Sprite.prototype.getLocalUnmodifiedPosition=function(c,b,d){c.x=this._cache.a11*this._cache.idi*b+-this._cache.i01*this._cache.idi*d+(this._cache.a12*this._cache.i01-this._cache.a02*this._cache.a11)*this._cache.idi;c.y=this._cache.a00*this._cache.idi*d+-this._cache.i10*this._cache.idi*b+(-this._cache.a12*this._cache.a00+this._cache.a02*this._cache.i10)*this._cache.idi;return c};Phaser.Sprite.prototype.bringToTop=function(){if(this.group){this.group.bringToTop(this)}else{this.game.world.bringToTop(this)}};Phaser.Sprite.prototype.getBounds=function(d){d=d||new Phaser.Rectangle;var f=Phaser.Math.min(this.topLeft.x,this.topRight.x,this.bottomLeft.x,this.bottomRight.x);var c=Phaser.Math.max(this.topLeft.x,this.topRight.x,this.bottomLeft.x,this.bottomRight.x);var e=Phaser.Math.min(this.topLeft.y,this.topRight.y,this.bottomLeft.y,this.bottomRight.y);var b=Phaser.Math.max(this.topLeft.y,this.topRight.y,this.bottomLeft.y,this.bottomRight.y);d.x=f;d.y=e;d.width=c-f;d.height=b-e;return d};Object.defineProperty(Phaser.Sprite.prototype,"angle",{get:function(){return Phaser.Math.radToDeg(this.rotation)},set:function(b){this.rotation=Phaser.Math.degToRad(b)}});Object.defineProperty(Phaser.Sprite.prototype,"frame",{get:function(){return this.animations.frame},set:function(b){this.animations.frame=b}});Object.defineProperty(Phaser.Sprite.prototype,"frameName",{get:function(){return this.animations.frameName},set:function(b){this.animations.frameName=b}});Object.defineProperty(Phaser.Sprite.prototype,"inCamera",{get:function(){return this._cache.cameraVisible}});Object.defineProperty(Phaser.Sprite.prototype,"crop",{get:function(){return this._cropRect},set:function(b){if(b instanceof Phaser.Rectangle){if(this._cropUUID==null){this._cropUUID=this.game.rnd.uuid();PIXI.TextureCache[this._cropUUID]=new PIXI.Texture(PIXI.BaseTextureCache[this.key],{x:b.x,y:b.y,width:b.width,height:b.height})}else{PIXI.TextureCache[this._cropUUID].frame=b}this._cropRect=b;this.setTexture(PIXI.TextureCache[this._cropUUID])}}});Object.defineProperty(Phaser.Sprite.prototype,"inputEnabled",{get:function(){return(this.input.enabled)},set:function(b){if(b){if(this.input.enabled==false){this.input.start()}}else{if(this.input.enabled){this.input.stop()}}}});Phaser.TileSprite=function(d,c,h,f,b,e,g){c=c||0;h=h||0;f=f||256;b=b||256;e=e||null;g=g||null;Phaser.Sprite.call(this,d,c,h,e,g);this.texture=PIXI.TextureCache[e];PIXI.TilingSprite.call(this,this.texture,f,b);this.type=Phaser.TILESPRITE;this.tileScale=new Phaser.Point(1,1);this.tilePosition=new Phaser.Point(0,0)};Phaser.TileSprite.prototype=Phaser.Utils.extend(true,PIXI.TilingSprite.prototype,Phaser.Sprite.prototype);Phaser.TileSprite.prototype.constructor=Phaser.TileSprite;Phaser.Text=function(c,b,g,f,d){b=b||0;g=g||0;f=f||"";d=d||"";this.canvas=document.createElement("canvas");this.context=this.canvas.getContext("2d");var e=c.rnd.uuid();PIXI.TextureCache[e]=new PIXI.Texture(new PIXI.BaseTexture(this.canvas));Phaser.Sprite.call(this,c,b,g,e);this.type=Phaser.TEXT;this.setText(f);this.setStyle(d);this.updateText();this.dirty=false};Phaser.Text.prototype=Phaser.Utils.extend(true,Phaser.Sprite.prototype,PIXI.Text.prototype);Phaser.Text.prototype.constructor=Phaser.Text;Phaser.Button=function(j,g,f,h,i,c,d,b,e){g=g||0;f=f||0;h=h||null;i=i||null;c=c||this;Phaser.Sprite.call(this,j,g,f,h,b);this.type=Phaser.BUTTON;this._onOverFrameName=null;this._onOutFrameName=null;this._onDownFrameName=null;this._onUpFrameName=null;this._onOverFrameID=null;this._onOutFrameID=null;this._onDownFrameID=null;this._onUpFrameID=null;this.onInputOver=new Phaser.Signal;this.onInputOut=new Phaser.Signal;this.onInputDown=new Phaser.Signal;this.onInputUp=new Phaser.Signal;this.setFrames(d,b,e);if(i!==null){this.onInputUp.add(i,c)}this.input.start(0,false,true);this.events.onInputOver.add(this.onInputOverHandler,this);this.events.onInputOut.add(this.onInputOutHandler,this);this.events.onInputDown.add(this.onInputDownHandler,this);this.events.onInputUp.add(this.onInputUpHandler,this)};Phaser.Button.prototype=Phaser.Utils.extend(true,Phaser.Sprite.prototype,PIXI.Sprite.prototype);Phaser.Button.prototype.constructor=Phaser.Button;Phaser.Button.prototype.setFrames=function(c,d,b){if(c!==null){if(typeof c==="string"){this._onOverFrameName=c}else{this._onOverFrameID=c}}if(d!==null){if(typeof d==="string"){this._onOutFrameName=d;this._onUpFrameName=d}else{this._onOutFrameID=d;this._onUpFrameID=d}}if(b!==null){if(typeof b==="string"){this._onDownFrameName=b}else{this._onDownFrameID=b}}};Phaser.Button.prototype.onInputOverHandler=function(b){if(this._onOverFrameName!=null){this.frameName=this._onOverFrameName}else{if(this._onOverFrameID!=null){this.frame=this._onOverFrameID}}if(this.onInputOver){this.onInputOver.dispatch(this,b)}};Phaser.Button.prototype.onInputOutHandler=function(b){if(this._onOutFrameName!=null){this.frameName=this._onOutFrameName}else{if(this._onOutFrameID!=null){this.frame=this._onOutFrameID}}if(this.onInputOut){this.onInputOut.dispatch(this,b)}};Phaser.Button.prototype.onInputDownHandler=function(b){if(this._onDownFrameName!=null){this.frameName=this._onDownFrameName}else{if(this._onDownFrameID!=null){this.frame=this._onDownFrameID}}if(this.onInputDown){this.onInputDown.dispatch(this,b)}};Phaser.Button.prototype.onInputUpHandler=function(b){if(this._onUpFrameName!=null){this.frameName=this._onUpFrameName}else{if(this._onUpFrameID!=null){this.frame=this._onUpFrameID}}if(this.onInputUp){this.onInputUp.dispatch(this,b)}};Phaser.Graphics=function(c,b,d){this.exists=true;this.alive=true;this.group=null;this.name="";this.game=c;PIXI.DisplayObjectContainer.call(this);this.type=Phaser.GRAPHICS;this.position.x=b;this.position.y=d;this.scale=new Phaser.Point(1,1);this.scrollFactor=new Phaser.Point(1,1);this._cache={dirty:false,a00:1,a01:0,a02:b,a10:0,a11:1,a12:d,id:1,x:-1,y:-1,scaleX:1,scaleY:1};this._cache.x=this.x-(this.game.world.camera.x*this.scrollFactor.x);this._cache.y=this.y-(this.game.world.camera.y*this.scrollFactor.y);this.renderable=true;this.fillAlpha=1;this.lineWidth=0;this.lineColor="black";this.graphicsData=[];this.currentPath={points:[]}};Phaser.Graphics.prototype=Phaser.Utils.extend(true,PIXI.Graphics.prototype,PIXI.DisplayObjectContainer.prototype,Phaser.Sprite.prototype);Phaser.Graphics.prototype.constructor=Phaser.Graphics;Phaser.Graphics.prototype.update=function(){if(!this.exists){return}this._cache.dirty=false;this._cache.x=this.x-(this.game.world.camera.x*this.scrollFactor.x);this._cache.y=this.y-(this.game.world.camera.y*this.scrollFactor.y);if(this.position.x!=this._cache.x||this.position.y!=this._cache.y){this.position.x=this._cache.x;this.position.y=this._cache.y;this._cache.dirty=true}};Object.defineProperty(Phaser.Graphics.prototype,"angle",{get:function(){return Phaser.Math.radToDeg(this.rotation)},set:function(b){this.rotation=Phaser.Math.degToRad(b)}});Object.defineProperty(Phaser.Graphics.prototype,"x",{get:function(){return this.position.x},set:function(b){this.position.x=b}});Object.defineProperty(Phaser.Graphics.prototype,"y",{get:function(){return this.position.y},set:function(b){this.position.y=b}});Phaser.RenderTexture=function(c,d,e,b){this.game=c;this.name=d;PIXI.EventTarget.call(this);this.width=e||100;this.height=b||100;this.indetityMatrix=PIXI.mat3.create();this.frame=new PIXI.Rectangle(0,0,this.width,this.height);this.type=Phaser.RENDERTEXTURE;if(PIXI.gl){this.initWebGL()}else{this.initCanvas()}};Phaser.RenderTexture.prototype=Phaser.Utils.extend(true,PIXI.RenderTexture.prototype);Phaser.RenderTexture.prototype.constructor=Phaser.RenderTexture;Phaser.BitmapText=function(c,b,f,e,d){b=b||0;f=f||0;e=e||"";d=d||"";this.exists=true;this.alive=true;this.group=null;this.name="";this.game=c;PIXI.BitmapText.call(this,e,d);this.position.x=b;this.position.y=f;this.scale=new Phaser.Point(1,1);this.scrollFactor=new Phaser.Point(1,1);this._cache={dirty:false,a00:1,a01:0,a02:b,a10:0,a11:1,a12:f,id:1,x:-1,y:-1,scaleX:1,scaleY:1};this._cache.x=this.x-(this.game.world.camera.x*this.scrollFactor.x);this._cache.y=this.y-(this.game.world.camera.y*this.scrollFactor.y);this.renderable=true};Phaser.BitmapText.prototype=Phaser.Utils.extend(true,PIXI.BitmapText.prototype);Phaser.BitmapText.prototype.constructor=Phaser.BitmapText;Phaser.BitmapText.prototype.update=function(){if(!this.exists){return}this._cache.dirty=false;this._cache.x=this.x-(this.game.world.camera.x*this.scrollFactor.x);this._cache.y=this.y-(this.game.world.camera.y*this.scrollFactor.y);if(this.position.x!=this._cache.x||this.position.y!=this._cache.y){this.position.x=this._cache.x;this.position.y=this._cache.y;this._cache.dirty=true}};Object.defineProperty(Phaser.BitmapText.prototype,"angle",{get:function(){return Phaser.Math.radToDeg(this.rotation)},set:function(b){this.rotation=Phaser.Math.degToRad(b)}});Object.defineProperty(Phaser.BitmapText.prototype,"x",{get:function(){return this.position.x},set:function(b){this.position.x=b}});Object.defineProperty(Phaser.BitmapText.prototype,"y",{get:function(){return this.position.y},set:function(b){this.position.y=b}});Phaser.Canvas={create:function(d,b){d=d||256;b=b||256;var c=document.createElement("canvas");c.width=d;c.height=b;c.style.display="block";return c},getOffset:function(c,b){b=b||new Phaser.Point;var d=c.getBoundingClientRect();var h=c.clientTop||document.body.clientTop||0;var g=c.clientLeft||document.body.clientLeft||0;var e=window.pageYOffset||c.scrollTop||document.body.scrollTop;var f=window.pageXOffset||c.scrollLeft||document.body.scrollLeft;b.x=d.left+f-g;b.y=d.top+e-h;return b},getAspectRatio:function(b){return b.width/b.height},setBackgroundColor:function(c,b){b=b||"rgb(0,0,0)";c.style.backgroundColor=b;return c},setTouchAction:function(b,c){c=c||"none";b.style.msTouchAction=c;b.style["ms-touch-action"]=c;b.style["touch-action"]=c;return b},addToDOM:function(b,c,d){c=c||"";d=d||true;if(c!==""){if(document.getElementById(c)){document.getElementById(c).appendChild(b)}else{document.body.appendChild(b)}if(d){document.getElementById(c).style.overflow="hidden"}}else{document.body.appendChild(b)}return b},setTransform:function(f,h,g,d,b,e,c){f.setTransform(d,e,c,b,h,g);return f},setSmoothingEnabled:function(b,c){b.imageSmoothingEnabled=c;b.mozImageSmoothingEnabled=c;b.oImageSmoothingEnabled=c;b.webkitImageSmoothingEnabled=c;b.msImageSmoothingEnabled=c;return b},setImageRenderingCrisp:function(b){b.style["image-rendering"]="crisp-edges";b.style["image-rendering"]="-moz-crisp-edges";b.style["image-rendering"]="-webkit-optimize-contrast";b.style.msInterpolationMode="nearest-neighbor";return b},setImageRenderingBicubic:function(b){b.style["image-rendering"]="auto";b.style.msInterpolationMode="bicubic";return b}};Phaser.StageScaleMode=function(c,d,b){this._startHeight=0;this.forceLandscape=false;this.forcePortrait=false;this.incorrectOrientation=false;this.pageAlignHorizontally=false;this.pageAlignVeritcally=false;this.minWidth=null;this.maxWidth=null;this.minHeight=null;this.maxHeight=null;this.width=0;this.height=0;this.maxIterations=5;this.game=c;this.enterLandscape=new Phaser.Signal();this.enterPortrait=new Phaser.Signal();if(window.orientation){this.orientation=window.orientation}else{if(window.outerWidth>window.outerHeight){this.orientation=90}else{this.orientation=0}}this.scaleFactor=new Phaser.Point(1,1);this.aspectRatio=0;var e=this;window.addEventListener("orientationchange",function(f){return e.checkOrientation(f)},false);window.addEventListener("resize",function(f){return e.checkResize(f)},false)};Phaser.StageScaleMode.EXACT_FIT=0;Phaser.StageScaleMode.NO_SCALE=1;Phaser.StageScaleMode.SHOW_ALL=2;Phaser.StageScaleMode.prototype={startFullScreen:function(){if(this.isFullScreen){return}var b=this.game.canvas;if(b.requestFullScreen){b.requestFullScreen()}else{if(b.mozRequestFullScreen){b.mozRequestFullScreen()}else{if(b.webkitRequestFullScreen){b.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}}}this.game.stage.canvas.style.width="100%";this.game.stage.canvas.style.height="100%"},stopFullScreen:function(){if(document.cancelFullScreen){document.cancelFullScreen()}else{if(document.mozCancelFullScreen){document.mozCancelFullScreen()}else{if(document.webkitCancelFullScreen){document.webkitCancelFullScreen()}}}},checkOrientationState:function(){if(this.incorrectOrientation){if((this.forceLandscape&&window.innerWidth>window.innerHeight)||(this.forcePortrait&&window.innerHeight>window.innerWidth)){this.game.paused=false;this.incorrectOrientation=false;this.refresh()}}else{if((this.forceLandscape&&window.innerWidthwindow.outerHeight){this.orientation=90}else{this.orientation=0}if(this.isLandscape){this.enterLandscape.dispatch(this.orientation,true,false)}else{this.enterPortrait.dispatch(this.orientation,false,true)}if(this.game.stage.scaleMode!==Phaser.StageScaleMode.NO_SCALE){this.refresh()}},refresh:function(){var b=this;if(this.game.device.iPad==false&&this.game.device.webApp==false&&this.game.device.desktop==false){if(this.game.device.android&&this.game.device.chrome==false){window.scrollTo(0,1)}else{window.scrollTo(0,0)}}if(this._check==null&&this.maxIterations>0){this._iterations=this.maxIterations;this._check=window.setInterval(function(){return b.setScreenSize()},10);this.setScreenSize()}},setScreenSize:function(b){if(typeof b=="undefined"){b=false}if(this.game.device.iPad==false&&this.game.device.webApp==false&&this.game.device.desktop==false){if(this.game.device.android&&this.game.device.chrome==false){window.scrollTo(0,1)}else{window.scrollTo(0,0)}}this._iterations--;if(b||window.innerHeight>this._startHeight||this._iterations<0){document.documentElement.style.minHeight=window.innerHeight+"px";if(this.incorrectOrientation==true){this.setMaximum()}else{if(this.game.stage.scaleMode==Phaser.StageScaleMode.EXACT_FIT){this.setExactFit()}else{if(this.game.stage.scaleMode==Phaser.StageScaleMode.SHOW_ALL){this.setShowAll()}}}this.setSize();clearInterval(this._check);this._check=null}},setSize:function(){if(this.incorrectOrientation==false){if(this.maxWidth&&this.width>this.maxWidth){this.width=this.maxWidth}if(this.maxHeight&&this.height>this.maxHeight){this.height=this.maxHeight}if(this.minWidth&&this.widththis.maxWidth){this.width=this.maxWidth}else{this.width=b}if(this.maxHeight&&c>this.maxHeight){this.height=this.maxHeight}else{this.height=c}console.log("setExactFit",this.width,this.height,this.game.stage.offset)}};Object.defineProperty(Phaser.StageScaleMode.prototype,"isFullScreen",{get:function(){if(document.fullscreenElement===null||document.mozFullScreenElement===null||document.webkitFullscreenElement===null){return false}return true}});Object.defineProperty(Phaser.StageScaleMode.prototype,"isPortrait",{get:function(){return this.orientation==0||this.orientation==180}});Object.defineProperty(Phaser.StageScaleMode.prototype,"isLandscape",{get:function(){return this.orientation===90||this.orientation===-90}});Phaser.Device=function(){this.patchAndroidClearRectBug=false;this.desktop=false;this.iOS=false;this.android=false;this.chromeOS=false;this.linux=false;this.macOS=false;this.windows=false;this.canvas=false;this.file=false;this.fileSystem=false;this.localStorage=false;this.webGL=false;this.worker=false;this.touch=false;this.mspointer=false;this.css3D=false;this.pointerLock=false;this.arora=false;this.chrome=false;this.epiphany=false;this.firefox=false;this.ie=false;this.ieVersion=0;this.mobileSafari=false;this.midori=false;this.opera=false;this.safari=false;this.webApp=false;this.audioData=false;this.webAudio=false;this.ogg=false;this.opus=false;this.mp3=false;this.wav=false;this.m4a=false;this.webm=false;this.iPhone=false;this.iPhone4=false;this.iPad=false;this.pixelRatio=0;this._checkAudio();this._checkBrowser();this._checkCSS3D();this._checkDevice();this._checkFeatures();this._checkOS()};Phaser.Device.prototype={_checkOS:function(){var b=navigator.userAgent;if(/Android/.test(b)){this.android=true}else{if(/CrOS/.test(b)){this.chromeOS=true}else{if(/iP[ao]d|iPhone/i.test(b)){this.iOS=true}else{if(/Linux/.test(b)){this.linux=true}else{if(/Mac OS/.test(b)){this.macOS=true}else{if(/Windows/.test(b)){this.windows=true}}}}}}if(this.windows||this.macOS||this.linux){this.desktop=true}},_checkFeatures:function(){this.canvas=!!window.CanvasRenderingContext2D;try{this.localStorage=!!localStorage.getItem}catch(b){this.localStorage=false}this.file=!!window.File&&!!window.FileReader&&!!window.FileList&&!!window.Blob;this.fileSystem=!!window.requestFileSystem;this.webGL=(function(){try{return !!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(c){return false}})();this.worker=!!window.Worker;if("ontouchstart" in document.documentElement||window.navigator.msPointerEnabled){this.touch=true}if(window.navigator.msPointerEnabled){this.mspointer=true}this.pointerLock="pointerLockElement" in document||"mozPointerLockElement" in document||"webkitPointerLockElement" in document},_checkBrowser:function(){var b=navigator.userAgent;if(/Arora/.test(b)){this.arora=true}else{if(/Chrome/.test(b)){this.chrome=true}else{if(/Epiphany/.test(b)){this.epiphany=true}else{if(/Firefox/.test(b)){this.firefox=true}else{if(/Mobile Safari/.test(b)){this.mobileSafari=true}else{if(/MSIE (\d+\.\d+);/.test(b)){this.ie=true;this.ieVersion=parseInt(RegExp.$1)}else{if(/Midori/.test(b)){this.midori=true}else{if(/Opera/.test(b)){this.opera=true}else{if(/Safari/.test(b)){this.safari=true}}}}}}}}}if(navigator.standalone){this.webApp=true}},_checkAudio:function(){this.audioData=!!(window.Audio);this.webAudio=!!(window.webkitAudioContext||window.AudioContext);var d=document.createElement("audio");var b=false;try{if(b=!!d.canPlayType){if(d.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,"")){this.ogg=true}if(d.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,"")){this.opus=true}if(d.canPlayType("audio/mpeg;").replace(/^no$/,"")){this.mp3=true}if(d.canPlayType('audio/wav; codecs="1"').replace(/^no$/,"")){this.wav=true}if(d.canPlayType("audio/x-m4a;")||d.canPlayType("audio/aac;").replace(/^no$/,"")){this.m4a=true}if(d.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")){this.webm=true}}}catch(c){}},_checkDevice:function(){this.pixelRatio=window.devicePixelRatio||1;this.iPhone=navigator.userAgent.toLowerCase().indexOf("iphone")!=-1;this.iPhone4=(this.pixelRatio==2&&this.iPhone);this.iPad=navigator.userAgent.toLowerCase().indexOf("ipad")!=-1},_checkCSS3D:function(){var d=document.createElement("p");var e;var c={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.insertBefore(d,null);for(var b in c){if(d.style[b]!==undefined){d.style[b]="translate3d(1px,1px,1px)";e=window.getComputedStyle(d).getPropertyValue(c[b])}}document.body.removeChild(d);this.css3D=(e!==undefined&&e.length>0&&e!=="none")},canPlayAudio:function(b){if(b=="mp3"&&this.mp3){return true}else{if(b=="ogg"&&(this.ogg||this.opus)){return true}else{if(b=="m4a"&&this.m4a){return true}else{if(b=="wav"&&this.wav){return true}else{if(b=="webm"&&this.webm){return true}}}}}return false},isConsoleOpen:function(){if(window.console&&window.console.firebug){return true}if(window.console){console.profile();console.profileEnd();if(console.clear){console.clear()}return console.profiles.length>0}return false}};Phaser.RequestAnimationFrame=function(c){this.game=c;this._isSetTimeOut=false;this.isRunning=false;var d=["ms","moz","webkit","o"];for(var b=0;b>>0;c-=e;c*=e;e=c>>>0;c-=e;e+=c*4294967296}return(e>>>0)*2.3283064365386963e-10},integer:function(){return this.rnd.apply(this)*4294967296},frac:function(){return this.rnd.apply(this)+(this.rnd.apply(this)*2097152|0)*1.1102230246251565e-16},real:function(){return this.integer()+this.frac()},integerInRange:function(c,b){return Math.floor(this.realInRange(c,b))},realInRange:function(c,b){c=c||0;b=b||0;return this.frac()*(b-c)+c},normal:function(){return 1-2*this.frac()},uuid:function(){var d,c;for(c=d="";d++<36;c+=~d%5|d*3&4?(d^15?8^this.frac()*(d^20?16:4):4).toString(16):"-"){}return c},pick:function(b){return b[this.integerInRange(0,b.length)]},weightedPick:function(b){return b[~~(Math.pow(this.frac(),2)*b.length)]},timestamp:function(d,c){return this.realInRange(d||946684800000,c||1577862000000)},angle:function(){return this.integerInRange(-180,180)}};Phaser.Math={PI2:Math.PI*2,fuzzyEqual:function(d,c,e){if(typeof e==="undefined"){e=0.0001}return Math.abs(d-c)c-e},fuzzyCeil:function(b,c){if(typeof c==="undefined"){c=0.0001}return Math.ceil(b-c)},fuzzyFloor:function(b,c){if(typeof c==="undefined"){c=0.0001}return Math.floor(b+c)},average:function(){var b=[];for(var d=0;d<(arguments.length-0);d++){b[d]=arguments[d+0]}var e=0;for(var c=0;c0)?Math.floor(b):Math.ceil(b)},shear:function(b){return b%1},snapTo:function(b,d,c){if(typeof c==="undefined"){c=0}if(d==0){return b}b-=c;b=d*Math.round(b/d);return c+b},snapToFloor:function(b,d,c){if(typeof c==="undefined"){c=0}if(d==0){return b}b-=c;b=d*Math.floor(b/d);return c+b},snapToCeil:function(b,d,c){if(typeof c==="undefined"){c=0}if(d==0){return b}b-=c;b=d*Math.ceil(b/d);return c+b},snapToInArray:function(d,c,f){if(typeof f==="undefined"){f=true}if(f){c.sort()}if(dd/2){c+=d*2}if(b<-d/2&&c>d/2){b+=d*2}return b-c},interpolateAngles:function(c,b,d,e,f){if(typeof e==="undefined"){e=true}if(typeof f==="undefined"){f=null}c=this.normalizeAngle(c,e);b=this.normalizeAngleToAnother(b,c,e);return(typeof f==="function")?f(d,c,b-c,1):this.interpolateFloat(c,b,d)},chanceRoll:function(b){if(typeof b==="undefined"){b=50}if(b<=0){return false}else{if(b>=100){return true}else{if(Math.random()*100>=b){return false}else{return true}}}},maxAdd:function(d,c,b){d+=c;if(d>b){d=b}return d},minSub:function(d,c,b){d-=c;if(d0.5)?1:-1},isOdd:function(b){return(b&1)},isEven:function(b){if(b&1){return false}else{return true}},max:function(){for(var d=1,c=0,b=arguments.length;d=-180&&c<=180){return c}b=(c+180)%360;if(b<0){b+=360}return b-180},angleLimit:function(e,d,c){var b=e;if(e>c){b=c}else{if(e1){return this.linear(d[b],d[b-1],b-g)}return this.linear(d[e],d[e+1>b?b:e+1],g-e)},bezierInterpolation:function(e,d){var c=0;var g=e.length-1;for(var f=0;f<=g;f++){c+=Math.pow(1-d,g-f)*Math.pow(d,f)*e[f]*this.bernstein(g,f)}return c},catmullRomInterpolation:function(d,c){var b=d.length-1;var g=b*c;var e=Math.floor(g);if(d[0]===d[b]){if(c<0){e=Math.floor(g=b*(1+c))}return this.catmullRom(d[(e-1+b)%b],d[e],d[(e+1)%b],d[(e+2)%b],g-e)}else{if(c<0){return d[0]-(this.catmullRom(d[0],d[0],d[1],d[1],-g)-d[0])}if(c>1){return d[b]-(this.catmullRom(d[b],d[b],d[b-1],d[b-1],g-b)-d[b])}return this.catmullRom(d[e?e-1:0],d[e],d[bd.length-e)){b=d.length-e}if(b>0){return d[e+Math.floor(Math.random()*b)]}}return null},floor:function(b){var c=b|0;return(b>0)?(c):((c!=b)?(c-1):(c))},ceil:function(b){var c=b|0;return(b>0)?((c!=b)?(c+1):(c)):(c)},sinCosGenerator:function(b,j,d,h){if(typeof j==="undefined"){j=1}if(typeof d==="undefined"){d=1}if(typeof h==="undefined"){h=1}var i=j;var l=d;var f=h*Math.PI/b;var e=[];var k=[];for(var g=0;g0;d--){var c=Math.floor(Math.random()*(d+1));var b=e[d];e[d]=e[c];e[c]=b}return e},distance:function(e,g,d,f){var c=e-d;var b=g-f;return Math.sqrt(c*c+b*b)},distanceRounded:function(c,e,b,d){return Math.round(Phaser.Math.distance(c,e,b,d))},clamp:function(d,e,c){return(dc)?c:d)},clampBottom:function(b,c){return b=b){return 1}c=(c-d)/(b-d);return c*c*(3-2*c)},smootherstep:function(c,d,b){if(c<=d){return 0}if(c>=b){return 1}c=(c-d)/(b-d);return c*c*c*(c*(c*6-15)+10)},sign:function(b){return(b<0)?-1:((b>0)?1:0)},degToRad:function(){var b=Math.PI/180;return function(c){return c*b}}(),radToDeg:function(){var b=180/Math.PI;return function(c){return c*b}}()};Phaser.QuadTree=function(g,c,i,f,b,e,d,h){this.physicsManager=g;this.ID=g.quadTreeID;g.quadTreeID++;this.maxObjects=e||10;this.maxLevels=d||4;this.level=h||0;this.bounds={x:Math.round(c),y:Math.round(i),width:f,height:b,subWidth:Math.floor(f/2),subHeight:Math.floor(b/2),right:Math.round(c)+Math.floor(f/2),bottom:Math.round(i)+Math.floor(b/2)};this.objects=[];this.nodes=[]};Phaser.QuadTree.prototype={split:function(){this.level++;this.nodes[0]=new Phaser.QuadTree(this.physicsManager,this.bounds.right,this.bounds.y,this.bounds.subWidth,this.bounds.subHeight,this.maxObjects,this.maxLevels,this.level);this.nodes[1]=new Phaser.QuadTree(this.physicsManager,this.bounds.x,this.bounds.y,this.bounds.subWidth,this.bounds.subHeight,this.maxObjects,this.maxLevels,this.level);this.nodes[2]=new Phaser.QuadTree(this.physicsManager,this.bounds.x,this.bounds.bottom,this.bounds.subWidth,this.bounds.subHeight,this.maxObjects,this.maxLevels,this.level);this.nodes[3]=new Phaser.QuadTree(this.physicsManager,this.bounds.right,this.bounds.bottom,this.bounds.subWidth,this.bounds.subHeight,this.maxObjects,this.maxLevels,this.level)},insert:function(b){var d=0;var c;if(this.nodes[0]!=null){c=this.getIndex(b);if(c!==-1){this.nodes[c].insert(b);return}}this.objects.push(b);if(this.objects.length>this.maxObjects&&this.levelthis.bounds.bottom)){b=2}}}else{if(c.x>this.bounds.right){if((c.ythis.bounds.bottom)){b=3}}}}return b},retrieve:function(b){var c=this.objects;b.body.quadTreeIndex=this.getIndex(b.body);b.body.quadTreeIDs.push(this.ID);if(this.nodes[0]){if(b.body.quadTreeIndex!==-1){c=c.concat(this.nodes[b.body.quadTreeIndex].retrieve(b))}else{c=c.concat(this.nodes[0].retrieve(b));c=c.concat(this.nodes[1].retrieve(b));c=c.concat(this.nodes[2].retrieve(b));c=c.concat(this.nodes[3].retrieve(b))}}return c},clear:function(){this.objects=[];for(var c=0,b=this.nodes.length;c0){this._radius=c*0.5}else{this._radius=0}};Phaser.Circle.prototype={circumference:function(){return 2*(Math.PI*this._radius)},setTo:function(b,d,c){this.x=b;this.y=d;this._diameter=c;this._radius=c*0.5;return this},copyFrom:function(b){return this.setTo(b.x,b.y,b.diameter)},copyTo:function(b){b[x]=this.x;b[y]=this.y;b[diameter]=this._diameter;return b},distance:function(c,b){if(typeof b==="undefined"){b=false}if(b){return Phaser.Math.distanceRound(this.x,this.y,c.x,c.y)}else{return Phaser.Math.distance(this.x,this.y,c.x,c.y)}},clone:function(b){if(typeof b==="undefined"){b=new Phaser.Circle()}return b.setTo(a.x,a.y,a.diameter)},contains:function(b,c){return Phaser.Circle.contains(this,b,c)},circumferencePoint:function(d,c,b){return Phaser.Circle.circumferencePoint(this,d,c,b)},offset:function(c,b){this.x+=c;this.y+=b;return this},offsetPoint:function(b){return this.offset(b.x,b.y)},toString:function(){return"[{Phaser.Circle (x="+this.x+" y="+this.y+" diameter="+this.diameter+" radius="+this.radius+")}]"}};Object.defineProperty(Phaser.Circle.prototype,"diameter",{get:function(){return this._diameter},set:function(b){if(b>0){this._diameter=b;this._radius=b*0.5}}});Object.defineProperty(Phaser.Circle.prototype,"radius",{get:function(){return this._radius},set:function(b){if(b>0){this._radius=b;this._diameter=b*2}}});Object.defineProperty(Phaser.Circle.prototype,"left",{get:function(){return this.x-this._radius},set:function(b){if(b>this.x){this._radius=0;this._diameter=0}else{this.radius=this.x-b}}});Object.defineProperty(Phaser.Circle.prototype,"right",{get:function(){return this.x+this._radius},set:function(b){if(bthis.y){this._radius=0;this._diameter=0}else{this.radius=this.y-b}}});Object.defineProperty(Phaser.Circle.prototype,"bottom",{get:function(){return this.y+this._radius},set:function(b){if(b0){return Math.PI*this._radius*this._radius}else{return 0}}});Object.defineProperty(Phaser.Circle.prototype,"empty",{get:function(){return(this._diameter==0)},set:function(b){this.setTo(0,0,0)}});Phaser.Circle.contains=function(d,b,f){if(b>=d.left&&b<=d.right&&f>=d.top&&f<=d.bottom){var e=(d.x-b)*(d.x-b);var c=(d.y-f)*(d.y-f);return(e+c)<=(d.radius*d.radius)}return false};Phaser.Circle.equals=function(d,c){return(d.x==c.x&&d.y==c.y&&d.diameter==c.diameter)};Phaser.Circle.intersects=function(d,c){return(Phaser.Math.distance(d.x,d.y,c.x,c.y)<=(d.radius+c.radius))};Phaser.Circle.circumferencePoint=function(b,e,d,c){if(typeof d==="undefined"){d=false}if(typeof c==="undefined"){c=new Phaser.Point()}if(d===true){e=Phaser.Math.radToDeg(e)}c.x=b.x+b.radius*Math.cos(e);c.y=b.y+b.radius*Math.sin(e);return c};Phaser.Circle.intersectsRectangle=function(m,d){var g=Math.abs(m.x-d.x-d.halfWidth);var l=d.halfWidth+m.radius;if(g>l){return false}var f=Math.abs(m.y-d.y-d.halfHeight);var j=d.halfHeight+m.radius;if(f>j){return false}if(g<=d.halfWidth||f<=d.halfHeight){return true}var h=g-d.halfWidth;var e=f-d.halfHeight;var k=h*h;var b=e*e;var i=m.radius*m.radius;return k+b<=i};Phaser.Point=function(b,c){b=b||0;c=c||0;this.x=b;this.y=c};Phaser.Point.prototype={copyFrom:function(b){return this.setTo(b.x,b.y)},invert:function(){return this.setTo(this.y,this.x)},setTo:function(b,c){this.x=b;this.y=c;return this},add:function(b,c){this.x+=b;this.y+=c;return this},subtract:function(b,c){this.x-=b;this.y-=c;return this},multiply:function(b,c){this.x*=b;this.y*=c;return this},divide:function(b,c){this.x/=b;this.y/=c;return this},clampX:function(c,b){this.x=Phaser.Math.clamp(this.x,c,b);return this},clampY:function(c,b){this.y=Phaser.Math.clamp(this.y,c,b);return this},clamp:function(c,b){this.x=Phaser.Math.clamp(this.x,c,b);this.y=Phaser.Math.clamp(this.y,c,b);return this},clone:function(b){if(typeof b==="undefined"){b=new Phaser.Point}return b.setTo(this.x,this.y)},copyFrom:function(b){return this.setTo(b.x,b.y)},copyTo:function(b){b[x]=this.x;b[y]=this.y;return b},distance:function(c,b){return Phaser.Point.distance(this,c,b)},equals:function(b){return(b.x==this.x&&b.y==this.y)},rotate:function(b,f,d,c,e){return Phaser.Point.rotate(this,b,f,d,c,e)},toString:function(){return"[{Point (x="+this.x+" y="+this.y+")}]"}};Phaser.Point.add=function(d,c,e){if(typeof e==="undefined"){e=new Phaser.Point()}e.x=d.x+c.x;e.y=d.y+c.y;return e};Phaser.Point.subtract=function(d,c,e){if(typeof e==="undefined"){e=new Phaser.Point()}e.x=d.x-c.x;e.y=d.y-c.y;return e};Phaser.Point.multiply=function(d,c,e){if(typeof e==="undefined"){e=new Phaser.Point()}e.x=d.x*c.x;e.y=d.y*c.y;return e};Phaser.Point.divide=function(d,c,e){if(typeof e==="undefined"){e=new Phaser.Point()}e.x=d.x/c.x;e.y=d.y/c.y;return e};Phaser.Point.equals=function(d,c){return(d.x==c.x&&d.y==c.y)};Phaser.Point.distance=function(d,c,e){if(typeof e==="undefined"){e=false}if(e){return Phaser.Math.distanceRound(d.x,d.y,c.x,c.y)}else{return Phaser.Math.distance(d.x,d.y,c.x,c.y)}},Phaser.Point.rotate=function(c,b,g,e,d,f){d=d||false;f=f||null;if(d){e=Phaser.Math.radToDeg(e)}if(f===null){f=Math.sqrt(((b-c.x)*(b-c.x))+((g-c.y)*(g-c.y)))}return c.setTo(b+f*Math.cos(e),g+f*Math.sin(e))};Phaser.Rectangle=function(c,e,d,b){c=c||0;e=e||0;d=d||0;b=b||0;this.x=c;this.y=e;this.width=d;this.height=b};Phaser.Rectangle.prototype={offset:function(c,b){this.x+=c;this.y+=b;return this},offsetPoint:function(b){return this.offset(b.x,b.y)},setTo:function(c,e,d,b){this.x=c;this.y=e;this.width=d;this.height=b;return this},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y)},copyFrom:function(b){return this.setTo(b.x,b.y,b.width,b.height)},copyTo:function(b){b.x=this.x;b.y=this.y;b.width=this.width;b.height=this.height;return b},inflate:function(c,b){return Phaser.Rectangle.inflate(this,c,b)},size:function(b){return Phaser.Rectangle.size(this,b)},clone:function(b){return Phaser.Rectangle.clone(this,b)},contains:function(b,c){return Phaser.Rectangle.contains(this,b,c)},containsRect:function(c){return Phaser.Rectangle.containsRect(this,c)},equals:function(c){return Phaser.Rectangle.equals(this,c)},intersection:function(c,d){return Phaser.Rectangle.intersection(this,c,output)},intersects:function(c,d){return Phaser.Rectangle.intersects(this,c,d)},intersectsRaw:function(f,d,e,c,b){return Phaser.Rectangle.intersectsRaw(this,f,d,e,c,b)},union:function(c,d){return Phaser.Rectangle.union(this,c,d)},toString:function(){return"[{Rectangle (x="+this.x+" y="+this.y+" width="+this.width+" height="+this.height+" empty="+this.empty+")}]"}};Object.defineProperty(Phaser.Rectangle.prototype,"halfWidth",{get:function(){return Math.round(this.width/2)}});Object.defineProperty(Phaser.Rectangle.prototype,"halfHeight",{get:function(){return Math.round(this.height/2)}});Object.defineProperty(Phaser.Rectangle.prototype,"bottom",{get:function(){return this.y+this.height},set:function(b){if(b<=this.y){this.height=0}else{this.height=(this.y-b)}}});Object.defineProperty(Phaser.Rectangle.prototype,"bottomRight",{get:function(){return new Phaser.Point(this.right,this.bottom)},set:function(b){this.right=b.x;this.bottom=b.y}});Object.defineProperty(Phaser.Rectangle.prototype,"left",{get:function(){return this.x},set:function(b){if(b>=this.right){this.width=0}else{this.width=this.right-b}this.x=b}});Object.defineProperty(Phaser.Rectangle.prototype,"right",{get:function(){return this.x+this.width},set:function(b){if(b<=this.x){this.width=0}else{this.width=this.x+b}}});Object.defineProperty(Phaser.Rectangle.prototype,"volume",{get:function(){return this.width*this.height}});Object.defineProperty(Phaser.Rectangle.prototype,"perimeter",{get:function(){return(this.width*2)+(this.height*2)}});Object.defineProperty(Phaser.Rectangle.prototype,"centerX",{get:function(){return this.x+this.halfWidth},set:function(b){this.x=b-this.halfWidth}});Object.defineProperty(Phaser.Rectangle.prototype,"centerY",{get:function(){return this.y+this.halfHeight},set:function(b){this.y=b-this.halfHeight}});Object.defineProperty(Phaser.Rectangle.prototype,"top",{get:function(){return this.y},set:function(b){if(b>=this.bottom){this.height=0;this.y=b}else{this.height=(this.bottom-b)}}});Object.defineProperty(Phaser.Rectangle.prototype,"topLeft",{get:function(){return new Phaser.Point(this.x,this.y)},set:function(b){this.x=b.x;this.y=b.y}});Object.defineProperty(Phaser.Rectangle.prototype,"empty",{get:function(){return(!this.width||!this.height)},set:function(b){this.setTo(0,0,0,0)}});Phaser.Rectangle.inflate=function(c,d,b){c.x-=d;c.width+=2*d;c.y-=b;c.height+=2*b;return c};Phaser.Rectangle.inflatePoint=function(c,b){return Phaser.Phaser.Rectangle.inflate(c,b.x,b.y)};Phaser.Rectangle.size=function(b,c){if(typeof c==="undefined"){c=new Phaser.Point()}return c.setTo(b.width,b.height)};Phaser.Rectangle.clone=function(b,c){if(typeof c==="undefined"){c=new Phaser.Rectangle()}return c.setTo(b.x,b.y,b.width,b.height)};Phaser.Rectangle.contains=function(c,b,d){return(b>=c.x&&b<=c.right&&d>=c.y&&d<=c.bottom)};Phaser.Rectangle.containsPoint=function(c,b){return Phaser.Phaser.Rectangle.contains(c,b.x,b.y)};Phaser.Rectangle.containsRect=function(d,c){if(d.volume>c.volume){return false}return(d.x>=c.x&&d.y>=c.y&&d.right<=c.right&&d.bottom<=c.bottom)};Phaser.Rectangle.equals=function(d,c){return(d.x==c.x&&d.y==c.y&&d.width==c.width&&d.height==c.height)};Phaser.Rectangle.intersection=function(d,c,e){e=e||new Phaser.Rectangle;if(Phaser.Rectangle.intersects(d,c)){e.x=Math.max(d.x,c.x);e.y=Math.max(d.y,c.y);e.width=Math.min(d.right,c.right)-e.x;e.height=Math.min(d.bottom,c.bottom)-e.y}return e};Phaser.Rectangle.intersects=function(d,c,e){e=e||0;return !(d.left>c.right+e||d.rightc.bottom+e||d.bottomb.right+c||eb.bottom+c||d1){if(f&&f==this.decodeURI(d[0])){return this.decodeURI(d[1])}else{c[this.decodeURI(d[0])]=this.decodeURI(d[1])}}}return c},decodeURI:function(b){return decodeURIComponent(b.replace(/\+/g," "))}};Phaser.TweenManager=function(b){this.game=b;this._tweens=[];this.game.onPause.add(this.pauseAll,this);this.game.onResume.add(this.resumeAll,this)};Phaser.TweenManager.prototype={REVISION:"11dev",getAll:function(){return this._tweens},removeAll:function(){this._tweens=[]},add:function(b){this._tweens.push(b)},create:function(b){return new Phaser.Tween(b,this.game)},remove:function(c){var b=this._tweens.indexOf(c);if(b!==-1){this._tweens.splice(b,1)}},update:function(){if(this._tweens.length===0){return false}var b=0,c=this._tweens.length;while(b=0;b--){this._tweens[b].pause()}},resumeAll:function(){for(var b=this._tweens.length-1;b>=0;b--){this._tweens[b].resume()}}};Phaser.Tween=function(c,b){this._object=c;this.game=b;this._manager=this.game.tweens;this._valuesStart={};this._valuesEnd={};this._valuesStartRepeat={};this._duration=1000;this._repeat=0;this._yoyo=false;this._reversed=false;this._delayTime=0;this._startTime=null;this._easingFunction=Phaser.Easing.Linear.None;this._interpolationFunction=Phaser.Math.linearInterpolation;this._chainedTweens=[];this._onStartCallback=null;this._onStartCallbackFired=false;this._onUpdateCallback=null;this._onCompleteCallback=null;this._pausedTime=0;for(var d in c){this._valuesStart[d]=parseFloat(c[d],10)}this.onStart=new Phaser.Signal();this.onComplete=new Phaser.Signal();this.isRunning=false};Phaser.Tween.prototype={to:function(d,g,h,c,b,f,e){g=g||1000;h=h||null;c=c||false;b=b||0;f=f||0;e=e||false;this._repeat=f;this._duration=g;this._valuesEnd=d;if(h!==null){this._easingFunction=h}if(b>0){this._delayTime=b}this._yoyo=e;if(c){return this.start()}else{return this}},start:function(c){if(this.game===null||this._object===null){return}this._manager.add(this);this.onStart.dispatch(this._object);this.isRunning=true;this._onStartCallbackFired=false;this._startTime=this.game.time.now+this._delayTime;for(var b in this._valuesEnd){if(this._valuesEnd[b] instanceof Array){if(this._valuesEnd[b].length===0){continue}this._valuesEnd[b]=[this._object[b]].concat(this._valuesEnd[b])}this._valuesStart[b]=this._object[b];if((this._valuesStart[b] instanceof Array)===false){this._valuesStart[b]*=1}this._valuesStartRepeat[b]=this._valuesStart[b]||0}return this},stop:function(){this._manager.remove(this);this.isRunning=false;return this},delay:function(b){this._delayTime=b;return this},repeat:function(b){this._repeat=b;return this},yoyo:function(b){this._yoyo=b;return this},easing:function(b){this._easingFunction=b;return this},interpolation:function(b){this._interpolationFunction=b;return this},chain:function(){this._chainedTweens=arguments;return this},onStart:function(b){this._onStartCallback=b;return this},onUpdate:function(b){this._onUpdateCallback=b;return this},onComplete:function(b){this._onCompleteCallback=b;return this},pause:function(){this._paused=true},resume:function(){this._paused=false;this._startTime+=this.game.time.pauseDuration},update:function(c){if(this._paused||c1?1:k;var h=this._easingFunction(k);for(j in this._valuesEnd){var b=this._valuesStart[j]||0;var d=this._valuesEnd[j];if(d instanceof Array){this._object[j]=this._interpolationFunction(d,h)}else{if(typeof(d)==="string"){d=b+parseFloat(d,10)}if(typeof(d)==="number"){this._object[j]=b+(d-b)*h}}}if(this._onUpdateCallback!==null){this._onUpdateCallback.call(this._object,h)}if(k==1){if(this._repeat>0){if(isFinite(this._repeat)){this._repeat--}for(j in this._valuesStartRepeat){if(typeof(this._valuesEnd[j])==="string"){this._valuesStartRepeat[j]=this._valuesStartRepeat[j]+parseFloat(this._valuesEnd[j],10)}if(this._yoyo){var e=this._valuesStartRepeat[j];this._valuesStartRepeat[j]=this._valuesEnd[j];this._valuesEnd[j]=e;this._reversed=!this._reversed}this._valuesStart[j]=this._valuesStartRepeat[j]}this._startTime=c+this._delayTime;this.onComplete.dispatch(this._object);if(this._onCompleteCallback!==null){this._onCompleteCallback.call(this._object)}return true}else{this.onComplete.dispatch(this._object);if(this._onCompleteCallback!==null){this._onCompleteCallback.call(this._object)}for(var f=0,g=this._chainedTweens.length;fthis._timeLastSecond+1000){this.fps=Math.round((this.frames*1000)/(this.now-this._timeLastSecond));this.fpsMin=this.game.math.min(this.fpsMin,this.fps);this.fpsMax=this.game.math.max(this.fpsMax,this.fps);this._timeLastSecond=this.now;this.frames=0}this.time=this.now;this.lastTime=b+this.timeToCall;this.physicsElapsed=1*(this.elapsed/1000);if(this.game.paused){this.pausedTime=this.now-this._pauseStarted}},gamePaused:function(){this._pauseStarted=this.now},gameResumed:function(){this.time=Date.now();this.pauseDuration=this.pausedTime;this._justResumed=true},elapsedSince:function(b){return this.now-b},elapsedSecondsSince:function(b){return(this.now-b)*0.001},reset:function(){this._started=this.now}};Phaser.AnimationManager=function(b){this._frameData=null;this.currentFrame=null;this.sprite=b;this.game=b.game;this._anims={};this.updateIfVisible=true};Phaser.AnimationManager.prototype={loadFrameData:function(b){this._frameData=b;this.frame=0},add:function(e,f,d,c,b){f=f||null;d=d||60;c=c||false;b=b||true;if(this._frameData==null){console.warn("No frameData available for Phaser.Animation "+e);return}if(this.sprite.events.onAnimationStart==null){this.sprite.events.onAnimationStart=new Phaser.Signal();this.sprite.events.onAnimationComplete=new Phaser.Signal();this.sprite.events.onAnimationLoop=new Phaser.Signal()}if(f==null){f=this._frameData.getFrameIndexes()}else{if(this.validateFrames(f,b)==false){console.warn("Invalid frames given to Phaser.Animation "+e);return}}if(b==false){f=this._frameData.getFrameIndexesByName(f)}this._anims[e]=new Phaser.Animation(this.game,this.sprite,this._frameData,e,f,d,c);this.currentAnim=this._anims[e];this.currentFrame=this.currentAnim.currentFrame;this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);return this._anims[e]},validateFrames:function(d,b){for(var c=0;cthis._frameData.total){return false}}else{if(this._frameData.checkFrameName(d[c])==false){return false}}}return true},play:function(d,c,b){c=c||null;b=b||null;if(this._anims[d]){if(this.currentAnim==this._anims[d]){if(this.currentAnim.isPlaying==false){return this.currentAnim.play(c,b)}}else{this.currentAnim=this._anims[d];return this.currentAnim.play(c,b)}}},stop:function(b){if(this._anims[b]){this.currentAnim=this._anims[b];this.currentAnim.stop()}},update:function(){if(this.updateIfVisible&&this.sprite.visible==false){return false}if(this.currentAnim&&this.currentAnim.update()==true){this.currentFrame=this.currentAnim.currentFrame;this.sprite.currentFrame=this.currentFrame;return true}return false},destroy:function(){this._anims={};this._frameData=null;this._frameIndex=0;this.currentAnim=null;this.currentFrame=null}};Object.defineProperty(Phaser.AnimationManager.prototype,"frameData",{get:function(){return this._frameData}});Object.defineProperty(Phaser.AnimationManager.prototype,"frameTotal",{get:function(){if(this._frameData){return this._frameData.total}else{return -1}}});Object.defineProperty(Phaser.AnimationManager.prototype,"frame",{get:function(){if(this.currentFrame){return this._frameIndex}},set:function(b){if(this._frameData&&this._frameData.getFrame(b)!==null){this.currentFrame=this._frameData.getFrame(b);this._frameIndex=b;this.sprite.currentFrame=this.currentFrame;this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid])}}});Object.defineProperty(Phaser.AnimationManager.prototype,"frameName",{get:function(){if(this.currentFrame){return this.currentFrame.name}},set:function(b){if(this._frameData&&this._frameData.getFrameByName(b)){this.currentFrame=this._frameData.getFrameByName(b);this._frameIndex=this.currentFrame.index;this.sprite.currentFrame=this.currentFrame;this.sprite.setTexture(PIXI.TextureCache[this.currentFrame.uuid])}else{console.warn("Cannot set frameName: "+b)}}});Phaser.Animation=function(c,g,f,e,h,d,b){this.game=c;this._parent=g;this._frames=h;this._frameData=f;this.name=e;this.delay=1000/d;this.looped=b;this.isFinished=false;this.isPlaying=false;this._frameIndex=0;this.currentFrame=this._frameData.getFrame(this._frames[this._frameIndex])};Phaser.Animation.prototype={play:function(c,b){c=c||null;b=b||null;if(c!==null){this.delay=1000/c}if(b!==null){this.looped=b}this.isPlaying=true;this.isFinished=false;this._timeLastFrame=this.game.time.now;this._timeNextFrame=this.game.time.now+this.delay;this._frameIndex=0;this.currentFrame=this._frameData.getFrame(this._frames[this._frameIndex]);this._parent.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);this._parent.events.onAnimationStart.dispatch(this._parent,this);return this},restart:function(){this.isPlaying=true;this.isFinished=false;this._timeLastFrame=this.game.time.now;this._timeNextFrame=this.game.time.now+this.delay;this._frameIndex=0;this.currentFrame=this._frameData.getFrame(this._frames[this._frameIndex])},stop:function(){this.isPlaying=false;this.isFinished=true},update:function(){if(this.isPlaying==true&&this.game.time.now>=this._timeNextFrame){this._frameIndex++;if(this._frameIndex==this._frames.length){if(this.looped){this._frameIndex=0;this.currentFrame=this._frameData.getFrame(this._frames[this._frameIndex]);this._parent.setTexture(PIXI.TextureCache[this.currentFrame.uuid]);this._parent.events.onAnimationLoop.dispatch(this._parent,this)}else{this.onComplete()}}else{this.currentFrame=this._frameData.getFrame(this._frames[this._frameIndex]);this._parent.setTexture(PIXI.TextureCache[this.currentFrame.uuid])}this._timeLastFrame=this.game.time.now;this._timeNextFrame=this.game.time.now+this.delay;return true}return false},destroy:function(){this.game=null;this._parent=null;this._frames=null;this._frameData=null;this.currentFrame=null;this.isPlaying=false},onComplete:function(){this.isPlaying=false;this.isFinished=true;this._parent.events.onAnimationComplete.dispatch(this._parent,this)}};Object.defineProperty(Phaser.Animation.prototype,"frameTotal",{get:function(){return this._frames.length}});Object.defineProperty(Phaser.Animation.prototype,"frame",{get:function(){if(this.currentFrame!==null){return this.currentFrame.index}else{return this._frameIndex}},set:function(b){this.currentFrame=this._frameData.getFrame(b);if(this.currentFrame!==null){this._frameIndex=b;this._parent.setTexture(PIXI.TextureCache[this.currentFrame.uuid])}}});Phaser.Animation.Frame=function(c,g,f,b,d,e){this.x=c;this.y=g;this.width=f;this.height=b;this.centerX=Math.floor(f/2);this.centerY=Math.floor(b/2);this.index=0;this.name=d;this.uuid=e;this.distance=Phaser.Math.distance(0,0,f,b);this.rotated=false;this.rotationDirection="cw";this.trimmed=false;this.sourceSizeW=f;this.sourceSizeH=b;this.spriteSourceSizeX=0;this.spriteSourceSizeY=0;this.spriteSourceSizeW=0;this.spriteSourceSizeH=0};Phaser.Animation.Frame.prototype={setTrim:function(f,e,h,c,b,d,g){this.trimmed=f;if(f){this.width=e;this.height=h;this.sourceSizeW=e;this.sourceSizeH=h;this.centerX=Math.floor(e/2);this.centerY=Math.floor(h/2);this.spriteSourceSizeX=c;this.spriteSourceSizeY=b;this.spriteSourceSizeW=d;this.spriteSourceSizeH=g}}};Phaser.Animation.FrameData=function(){this._frames=[];this._frameNames=[]};Phaser.Animation.FrameData.prototype={addFrame:function(b){b.index=this._frames.length;this._frames.push(b);if(b.name!==""){this._frameNames[b.name]=b.index}return b},getFrame:function(b){if(this._frames[b]){return this._frames[b]}return null},getFrameByName:function(b){if(this._frameNames[b]!==""){return this._frames[this._frameNames[b]]}return null},checkFrameName:function(b){if(this._frameNames[b]==null){return false}return true},getFrameRange:function(e,b,c){if(typeof c==="undefined"){c=[]}for(var d=e;d<=b;d++){c.push(this._frames[d])}return c},getFrameIndexes:function(b){if(typeof b==="undefined"){b=[]}for(var c=0;c tag");return}var d=new Phaser.Animation.FrameData();var j=g.getElementsByTagName("SubTexture");var f;for(var e=0;e0){this._progressChunk=100/this._keys.length;this.loadFile()}else{this.progress=100;this.hasLoaded=true;this.onLoadComplete.dispatch()}},loadFile:function(){var b=this._fileList[this._keys.shift()];var c=this;switch(b.type){case"image":case"spritesheet":case"textureatlas":case"bitmapfont":case"tilemap":b.data=new Image();b.data.name=b.key;b.data.onload=function(){return c.fileComplete(b.key)};b.data.onerror=function(){return c.fileError(b.key)};b.data.crossOrigin=this.crossOrigin;b.data.src=this.baseURL+b.url;break;case"audio":b.url=this.getAudioURL(b.url);if(b.url!==null){if(this.game.sound.usingWebAudio){this._xhr.open("GET",this.baseURL+b.url,true);this._xhr.responseType="arraybuffer";this._xhr.onload=function(){return c.fileComplete(b.key)};this._xhr.onerror=function(){return c.fileError(b.key)};this._xhr.send()}else{if(this.game.sound.usingAudioTag){if(this.game.sound.touchLocked){b.data=new Audio();b.data.name=b.key;b.data.preload="auto";b.data.src=this.baseURL+b.url;this.fileComplete(b.key)}else{b.data=new Audio();b.data.name=b.key;b.data.onerror=function(){return c.fileError(b.key)};b.data.preload="auto";b.data.src=this.baseURL+b.url;b.data.addEventListener("canplaythrough",Phaser.GAMES[this.game.id].load.fileComplete(b.key),false);b.data.load()}}}}else{this.fileError(b.key)}break;case"text":this._xhr.open("GET",this.baseURL+b.url,true);this._xhr.responseType="text";this._xhr.onload=function(){return c.fileComplete(b.key)};this._xhr.onerror=function(){return c.fileError(b.key)};this._xhr.send();break}},getAudioURL:function(c){var d;for(var b=0;b100){this.progress=100}this.onFileComplete.dispatch(this.progress,b,c,this.queueSize-this._keys.length,this.queueSize);if(this._keys.length>0){this.loadFile()}else{this.hasLoaded=true;this.isLoading=false;this.removeAll();this.onLoadComplete.dispatch()}}};Phaser.Loader.Parser={bitmapFont:function(q,h,l){if(!h.getElementsByTagName("font")){console.warn("Phaser.Loader.Parser.bitmapFont: Invalid XML given, missing tag");return}var m=PIXI.TextureCache[l];var e={};var c=h.getElementsByTagName("info")[0];var j=h.getElementsByTagName("common")[0];e.font=c.attributes.getNamedItem("face").nodeValue;e.size=parseInt(c.attributes.getNamedItem("size").nodeValue,10);e.lineHeight=parseInt(j.attributes.getNamedItem("lineHeight").nodeValue,10);e.chars={};var k=h.getElementsByTagName("char");for(var d=0;d=this.duration){if(this.usingWebAudio){if(this.loop){this.onLoop.dispatch(this);if(this.currentMarker==""){this.currentTime=0;this.startTime=this.game.time.now}else{this.play(this.currentMarker,0,this.volume,true,true)}}else{this.stop()}}else{if(this.loop){this.onLoop.dispatch(this);this.play(this.currentMarker,0,this.volume,true,true)}else{this.stop()}}}}},play:function(d,b,f,c,e){d=d||"";b=b||0;f=f||1;c=c||false;e=e||false;if(this.isPlaying==true&&e==false&&this.override==false){return}if(this.isPlaying&&this.override){if(this.usingWebAudio){if(typeof this._sound.stop==="undefined"){this._sound.noteOff(0)}else{this._sound.stop(0)}}else{if(this.usingAudioTag){this._sound.pause();this._sound.currentTime=0}}}this.currentMarker=d;if(d!==""&&this.markers[d]){this.position=this.markers[d].start;this.volume=this.markers[d].volume;this.loop=this.markers[d].loop;this.duration=this.markers[d].duration*1000;this._tempMarker=d;this._tempPosition=this.position;this._tempVolume=this.volume;this._tempLoop=this.loop}else{this.position=b;this.volume=f;this.loop=c;this.duration=0;this._tempMarker=d;this._tempPosition=b;this._tempVolume=f;this._tempLoop=c}if(this.usingWebAudio){if(this.game.cache.isSoundDecoded(this.key)){if(this._buffer==null){this._buffer=this.game.cache.getSoundData(this.key)}this._sound=this.context.createBufferSource();this._sound.buffer=this._buffer;this._sound.connect(this.gainNode);this.totalDuration=this._sound.buffer.duration;if(this.duration==0){this.duration=this.totalDuration*1000}if(this.loop&&d==""){this._sound.loop=true}if(typeof this._sound.start==="undefined"){this._sound.noteGrainOn(0,this.position,this.duration/1000)}else{this._sound.start(0,this.position,this.duration/1000)}this.isPlaying=true;this.startTime=this.game.time.now;this.currentTime=0;this.stopTime=this.startTime+this.duration;this.onPlay.dispatch(this)}else{this.pendingPlayback=true;if(this.game.cache.getSound(this.key)&&this.game.cache.getSound(this.key).isDecoding==false){this.game.sound.decode(this.key,this)}}}else{if(this.game.cache.getSound(this.key)&&this.game.cache.getSound(this.key).locked){this.game.cache.reloadSound(this.key);this.pendingPlayback=true}else{if(this._sound&&this._sound.readyState==4){this._sound.play();this.totalDuration=this._sound.duration;if(this.duration==0){this.duration=this.totalDuration*1000}this._sound.currentTime=this.position;this._sound.muted=this._muted;if(this._muted){this._sound.volume=0}else{this._sound.volume=this._volume}this.isPlaying=true;this.startTime=this.game.time.now;this.currentTime=0;this.stopTime=this.startTime+this.duration;this.onPlay.dispatch(this)}else{this.pendingPlayback=true}}}},restart:function(d,b,e,c){d=d||"";b=b||0;e=e||1;c=c||false;this.play(d,b,e,c,true)},pause:function(){if(this.isPlaying&&this._sound){this.stop();this.isPlaying=false;this.paused=true;this.onPause.dispatch(this)}},resume:function(){if(this.paused&&this._sound){if(this.usingWebAudio){if(typeof this._sound.start==="undefined"){this._sound.noteGrainOn(0,this.position,this.duration)}else{this._sound.start(0,this.position,this.duration)}}else{this._sound.play()}this.isPlaying=true;this.paused=false;this.onResume.dispatch(this)}},stop:function(){if(this.isPlaying&&this._sound){if(this.usingWebAudio){if(typeof this._sound.stop==="undefined"){this._sound.noteOff(0)}else{this._sound.stop(0)}}else{if(this.usingAudioTag){this._sound.pause();this._sound.currentTime=0}}}this.isPlaying=false;var b=this.currentMarker;this.currentMarker="";this.onStop.dispatch(this,b)}};Object.defineProperty(Phaser.Sound.prototype,"isDecoding",{get:function(){return this.game.cache.getSound(this.key).isDecoding}});Object.defineProperty(Phaser.Sound.prototype,"isDecoded",{get:function(){return this.game.cache.isSoundDecoded(this.key)}});Object.defineProperty(Phaser.Sound.prototype,"mute",{get:function(){return this._muted},set:function(b){b=b||null;if(b){this._muted=true;if(this.usingWebAudio){this._muteVolume=this.gainNode.gain.value;this.gainNode.gain.value=0}else{if(this.usingAudioTag&&this._sound){this._muteVolume=this._sound.volume;this._sound.volume=0}}}else{this._muted=false;if(this.usingWebAudio){this.gainNode.gain.value=this._muteVolume}else{if(this.usingAudioTag&&this._sound){this._sound.volume=this._muteVolume}}}this.onMute.dispatch(this)}});Object.defineProperty(Phaser.Sound.prototype,"volume",{get:function(){return this._volume},set:function(b){if(this.usingWebAudio){this._volume=b;this.gainNode.gain.value=b}else{if(this.usingAudioTag&&this._sound){if(b>=0&&b<=1){this._volume=b;this._sound.volume=b}}}}});Phaser.SoundManager=function(b){this.game=b;this.onSoundDecode=new Phaser.Signal;this._muted=false;this._unlockSource=null;this._volume=1;this._muted=false;this._sounds=[];this.context=null;this.usingWebAudio=true;this.usingAudioTag=false;this.noAudio=false;this.touchLocked=false;this.channels=32};Phaser.SoundManager.prototype={boot:function(){if(this.game.device.iOS&&this.game.device.webAudio==false){this.channels=1}if(this.game.device.iOS||(window.PhaserGlobal&&window.PhaserGlobal.fakeiOSTouchLock)){this.game.input.touch.callbackContext=this;this.game.input.touch.touchStartCallback=this.unlock;this.game.input.mouse.callbackContext=this;this.game.input.mouse.mouseDownCallback=this.unlock;this.touchLocked=true}else{this.touchLocked=false}if(window.PhaserGlobal){if(window.PhaserGlobal.disableAudio==true){this.usingWebAudio=false;this.noAudio=true;return}if(window.PhaserGlobal.disableWebAudio==true){this.usingWebAudio=false;this.usingAudioTag=true;this.noAudio=false;return}}if(!!window.AudioContext){this.context=new window.AudioContext()}else{if(!!window.webkitAudioContext){this.context=new window.webkitAudioContext()}else{if(!!window.Audio){this.usingWebAudio=false;this.usingAudioTag=true}else{this.usingWebAudio=false;this.noAudio=true}}}if(this.context!==null){if(typeof this.context.createGain==="undefined"){this.masterGain=this.context.createGainNode()}else{this.masterGain=this.context.createGain()}this.masterGain.gain.value=1;this.masterGain.connect(this.context.destination)}},unlock:function(){if(this.touchLocked==false){return}if(this.game.device.webAudio==false||(window.PhaserGlobal&&window.PhaserGlobal.disableWebAudio==true)){this.touchLocked=false;this._unlockSource=null;this.game.input.touch.callbackContext=null;this.game.input.touch.touchStartCallback=null;this.game.input.mouse.callbackContext=null;this.game.input.mouse.mouseDownCallback=null}else{var b=this.context.createBuffer(1,1,22050);this._unlockSource=this.context.createBufferSource();this._unlockSource.buffer=b;this._unlockSource.connect(this.context.destination);this._unlockSource.noteOn(0)}},stopAll:function(){for(var b=0;b255){return Phaser.Color.getColor(255,255,255)}if(d>c){return Phaser.Color.getColor(255,255,255)}var f=d+Math.round(Math.random()*(c-d));var e=d+Math.round(Math.random()*(c-d));var b=d+Math.round(Math.random()*(c-d));return Phaser.Color.getColor32(g,f,e,b)},getRGB:function(b){return{alpha:b>>>24,red:b>>16&255,green:b>>8&255,blue:b&255}},getWebRGB:function(c){var f=(c>>>24)/255;var e=c>>16&255;var d=c>>8&255;var b=c&255;return"rgba("+e.toString()+","+d.toString()+","+b.toString()+","+f.toString()+")"},getAlpha:function(b){return b>>>24},getAlphaFloat:function(b){return(b>>>24)/255},getRed:function(b){return b>>16&255},getGreen:function(b){return b>>8&255},getBlue:function(b){return b&255}};Phaser.Physics={};Phaser.Physics.Arcade=function(b){this.game=b;this.gravity=new Phaser.Point;this.bounds=new Phaser.Rectangle(0,0,b.world.width,b.world.height);this.maxObjects=10;this.maxLevels=4;this.OVERLAP_BIAS=4;this.TILE_OVERLAP=false;this.quadTree=new Phaser.QuadTree(this,this.game.world.bounds.x,this.game.world.bounds.y,this.game.world.bounds.width,this.game.world.bounds.height,this.maxObjects,this.maxLevels);this.quadTreeID=0;this._bounds1=new Phaser.Rectangle;this._bounds2=new Phaser.Rectangle;this._overlap=0;this._maxOverlap=0;this._velocity1=0;this._velocity2=0;this._newVelocity1=0;this._newVelocity2=0;this._average=0;this._mapData=[];this._result=false;this._total=0};Phaser.Physics.Arcade.prototype={updateMotion:function(b){this._velocityDelta=(this.computeVelocity(0,false,b.angularVelocity,b.angularAcceleration,b.angularDrag,b.maxAngular)-b.angularVelocity)/2;b.angularVelocity+=this._velocityDelta;b.rotation+=b.angularVelocity*this.game.time.physicsElapsed;this._velocityDelta=(this.computeVelocity(1,b,b.velocity.x,b.acceleration.x,b.drag.x)-b.velocity.x)/2;b.velocity.x+=this._velocityDelta;this._delta=b.velocity.x*this.game.time.physicsElapsed;b.x+=this._delta;this._velocityDelta=(this.computeVelocity(2,b,b.velocity.y,b.acceleration.y,b.drag.y)-b.velocity.y)/2;b.velocity.y+=this._velocityDelta;this._delta=b.velocity.y*this.game.time.physicsElapsed;b.y+=this._delta},computeVelocity:function(e,c,g,f,d,b){b=b||10000;if(e==1&&c.allowGravity){g+=this.gravity.x+c.gravity.x}else{if(e==2&&c.allowGravity){g+=this.gravity.y+c.gravity.y}}if(f!==0){g+=f*this.game.time.physicsElapsed}else{if(d!==0){this._drag=d*this.game.time.physicsElapsed;if(g-this._drag>0){g=g-this._drag}else{if(g+this._drag<0){g+=this._drag}else{g=0}}}}if(g!=0){if(g>b){g=b}else{if(g<-b){g=-b}}}return g},preUpdate:function(){this.quadTree.clear();this.quadTreeID=0;this.quadTree=new Phaser.QuadTree(this,this.game.world.bounds.x,this.game.world.bounds.y,this.game.world.bounds.width,this.game.world.bounds.height,this.maxObjects,this.maxLevels)},postUpdate:function(){this.quadTree.clear()},collide:function(f,e,d,c,b){d=d||null;c=c||null;b=b||d;this._result=false;this._total=0;if(f&&e&&f.exists&&e.exists){if(f.type==Phaser.SPRITE&&e.type==Phaser.SPRITE){this.collideSpriteVsSprite(f,e,d,c,b)}else{if(f.type==Phaser.SPRITE&&e.type==Phaser.GROUP){this.collideSpriteVsGroup(f,e,d,c,b)}else{if(f.type==Phaser.GROUP&&e.type==Phaser.SPRITE){this.collideSpriteVsGroup(e,f,d,c,b)}else{if(f.type==Phaser.GROUP&&e.type==Phaser.GROUP){this.collideGroupVsGroup(f,e,d,c,b)}else{if(f.type==Phaser.SPRITE&&e.type==Phaser.TILEMAP){this.collideSpriteVsTilemap(f,e,d,c,b)}else{if(f.type==Phaser.TILEMAP&&e.type==Phaser.SPRITE){this.collideSpriteVsTilemap(e,f,d,c,b)}else{if(f.type==Phaser.GROUP&&e.type==Phaser.TILEMAP){this.collideGroupVsTilemap(f,e,d,c,b)}else{if(f.type==Phaser.TILEMAP&&e.type==Phaser.GROUP){this.collideGroupVsTilemap(e,f,d,c,b)}else{if(f.type==Phaser.EMITTER&&e.type==Phaser.TILEMAP){this.collideGroupVsTilemap(f,e,d,c,b)}else{if(f.type==Phaser.TILEMAP&&e.type==Phaser.EMITTER){this.collideGroupVsTilemap(e,f,d,c,b)}}}}}}}}}}}return(this._total>0)},collideSpriteVsSprite:function(f,e,d,c,b){this.separate(f.body,e.body);if(this._result){if(c){if(c.call(b,f,e)){this._total++;if(d){d.call(b,f,e)}}}else{this._total++;if(d){d.call(b,f,e)}}}},collideGroupVsTilemap:function(g,f,e,d,b){if(g._container.first._iNext){var c=g._container.first._iNext;do{if(c.exists){this.collideSpriteVsTilemap(c,f,e,d,b)}c=c._iNext}while(c!=g._container.last._iNext)}},collideSpriteVsTilemap:function(d,g,f,e,b){this._mapData=g.collisionLayer.getTileOverlaps(d);var c=this._mapData.length;while(c--){if(e){if(e.call(b,d,this._mapData[c].tile)){this._total++;if(f){f.call(b,d,this._mapData[c].tile)}}}else{this._total++;if(f){f.call(b,d,this._mapData[c].tile)}}}},collideSpriteVsGroup:function(e,h,g,f,c){this._potentials=this.quadTree.retrieve(e);for(var d=0,b=this._potentials.length;d0)?c.deltaX():0),c.lastY,c.width+((c.deltaX()>0)?c.deltaX():-c.deltaX()),c.height);this._bounds2.setTo(b.x-((b.deltaX()>0)?b.deltaX():0),b.lastY,b.width+((b.deltaX()>0)?b.deltaX():-b.deltaX()),b.height);if((this._bounds1.right>this._bounds2.x)&&(this._bounds1.xthis._bounds2.y)&&(this._bounds1.yb.deltaX()){this._overlap=c.x+c.width-b.x;if((this._overlap>this._maxOverlap)||c.allowCollision.right==false||b.allowCollision.left==false){this._overlap=0}else{c.touching.right=true;b.touching.left=true}}else{if(c.deltaX()this._maxOverlap)||c.allowCollision.left==false||b.allowCollision.right==false){this._overlap=0}else{c.touching.left=true;b.touching.right=true}}}}}if(this._overlap!=0){c.overlapX=this._overlap;b.overlapX=this._overlap;if(c.customSeparateX||b.customSeparateX){return true}this._velocity1=c.velocity.x;this._velocity2=b.velocity.x;if(!c.immovable&&!b.immovable){this._overlap*=0.5;c.x=c.x-this._overlap;b.x+=this._overlap;this._newVelocity1=Math.sqrt((this._velocity2*this._velocity2*b.mass)/c.mass)*((this._velocity2>0)?1:-1);this._newVelocity2=Math.sqrt((this._velocity1*this._velocity1*c.mass)/b.mass)*((this._velocity1>0)?1:-1);this._average=(this._newVelocity1+this._newVelocity2)*0.5;this._newVelocity1-=this._average;this._newVelocity2-=this._average;c.velocity.x=this._average+this._newVelocity1*c.bounce.x;b.velocity.x=this._average+this._newVelocity2*b.bounce.x}else{if(!c.immovable){c.x=c.x-this._overlap;c.velocity.x=this._velocity2-this._velocity1*c.bounce.x}else{if(!b.immovable){b.x+=this._overlap;b.velocity.x=this._velocity1-this._velocity2*b.bounce.x}}}return true}else{return false}},separateY:function(c,b){if(c.immovable&&b.immovable){return false}this._overlap=0;if(c.deltaY()!=b.deltaY()){this._bounds1.setTo(c.x,c.y-((c.deltaY()>0)?c.deltaY():0),c.width,c.height+c.deltaAbsY());this._bounds2.setTo(b.x,b.y-((b.deltaY()>0)?b.deltaY():0),b.width,b.height+b.deltaAbsY());if((this._bounds1.right>this._bounds2.x)&&(this._bounds1.xthis._bounds2.y)&&(this._bounds1.yb.deltaY()){this._overlap=c.y+c.height-b.y;if((this._overlap>this._maxOverlap)||c.allowCollision.down==false||b.allowCollision.up==false){this._overlap=0}else{c.touching.down=true;b.touching.up=true}}else{if(c.deltaY()this._maxOverlap)||c.allowCollision.up==false||b.allowCollision.down==false){this._overlap=0}else{c.touching.up=true;b.touching.down=true}}}}}if(this._overlap!=0){c.overlapY=this._overlap;b.overlapY=this._overlap;if(c.customSeparateY||b.customSeparateY){return true}this._velocity1=c.velocity.y;this._velocity2=b.velocity.y;if(!c.immovable&&!b.immovable){this._overlap*=0.5;c.y=c.y-this._overlap;b.y+=this._overlap;this._newVelocity1=Math.sqrt((this._velocity2*this._velocity2*b.mass)/c.mass)*((this._velocity2>0)?1:-1);this._newVelocity2=Math.sqrt((this._velocity1*this._velocity1*c.mass)/b.mass)*((this._velocity1>0)?1:-1);this._average=(this._newVelocity1+this._newVelocity2)*0.5;this._newVelocity1-=this._average;this._newVelocity2-=this._average;c.velocity.y=this._average+this._newVelocity1*c.bounce.y;b.velocity.y=this._average+this._newVelocity2*b.bounce.y}else{if(!c.immovable){c.y=c.y-this._overlap;c.velocity.y=this._velocity2-this._velocity1*c.bounce.y;if(b.active&&b.moves&&(c.deltaY()>b.deltaY())){c.x+=b.x-b.lastX}}else{if(!b.immovable){b.y+=this._overlap;b.velocity.y=this._velocity1-this._velocity2*b.bounce.y;if(c.sprite.active&&c.moves&&(c.deltaY()h)&&(this._bounds1.xg)&&(this._bounds1.yh)&&(this._bounds1.xg)&&(this._bounds1.y0){this._overlap=d.bottom-g;if(d.allowCollision.down&&b&&this._overlap0){var h=this.distanceBetween(g,e);f=h/(c/1000)}g.body.velocity.x=Math.cos(b)*f;g.body.velocity.y=Math.sin(b)*f},accelerateTowardsObject:function(f,d,e,b,g){b=b||1000;g=g||1000;var c=this.angleBetween(f,d);f.body.velocity.x=0;f.body.velocity.y=0;f.body.acceleration.x=Math.cos(c)*e;f.body.acceleration.y=Math.sin(c)*e;f.body.maxVelocity.x=b;f.body.maxVelocity.y=g},moveTowardsMouse:function(f,e,c){e=e||60;c=c||0;var b=this.angleBetweenMouse(f);if(c>0){var g=this.distanceToMouse(f);e=g/(c/1000)}f.body.velocity.x=Math.cos(b)*e;f.body.velocity.y=Math.sin(b)*e},accelerateTowardsMouse:function(e,d,b,f){b=b||1000;f=f||1000;var c=this.angleBetweenMouse(e);e.body.velocity.x=0;e.body.velocity.y=0;e.body.acceleration.x=Math.cos(c)*d;e.body.acceleration.y=Math.sin(c)*d;e.body.maxVelocity.x=b;e.body.maxVelocity.y=f},moveTowardsPoint:function(f,g,e,c){e=e||60;c=c||0;var b=this.angleBetweenPoint(f,g);if(c>0){var h=this.distanceToPoint(f,g);e=h/(c/1000)}f.body.velocity.x=Math.cos(b)*e;f.body.velocity.y=Math.sin(b)*e},accelerateTowardsPoint:function(e,f,d,b,g){b=b||1000;g=g||1000;var c=this.angleBetweenPoint(e,f);e.body.velocity.x=0;e.body.velocity.y=0;e.body.acceleration.x=Math.cos(c)*d;e.body.acceleration.y=Math.sin(c)*d;e.body.maxVelocity.x=b;e.body.maxVelocity.y=g},distanceBetween:function(e,c){var f=e.center.x-c.center.x;var d=e.center.y-c.center.y;return Math.sqrt(f*f+d*d)},distanceToPoint:function(c,e){var d=c.center.x-e.x;var b=c.center.y-e.y;return Math.sqrt(d*d+b*b)},distanceToMouse:function(c){var d=c.center.x-this.game.input.x;var b=c.center.y-this.game.input.y;return Math.sqrt(d*d+b*b)},angleBetweenPoint:function(c,f,e){e=e||false;var d=f.x-c.center.x;var b=f.y-c.center.y;if(e){return this.game.math.radToDeg(Math.atan2(b,d))}else{return Math.atan2(b,d)}},angleBetween:function(e,c,g){g=g||false;var f=c.center.x-e.center.x;var d=c.center.y-e.center.y;if(g){return this.game.math.radToDeg(Math.atan2(d,f))}else{return Math.atan2(d,f)}},velocityFromFacing:function(b,c){},angleBetweenMouse:function(c,e){e=e||false;var d=this.game.input.x-c.bounds.x;var b=this.game.input.y-c.bounds.y;if(e){return this.game.math.radToDeg(Math.atan2(b,d))}else{return Math.atan2(b,d)}}};Phaser.Physics.Arcade.Body=function(b){this.sprite=b;this.game=b.game;this.offset=new Phaser.Point;this.x=b.x;this.y=b.y;this.sourceWidth=b.currentFrame.sourceSizeW;this.sourceHeight=b.currentFrame.sourceSizeH;this.width=b.currentFrame.sourceSizeW;this.height=b.currentFrame.sourceSizeH;this.halfWidth=Math.floor(b.currentFrame.sourceSizeW/2);this.halfHeight=Math.floor(b.currentFrame.sourceSizeH/2);this._sx=b.scale.x;this._sy=b.scale.y;this.velocity=new Phaser.Point;this.acceleration=new Phaser.Point;this.drag=new Phaser.Point;this.gravity=new Phaser.Point;this.bounce=new Phaser.Point;this.maxVelocity=new Phaser.Point(10000,10000);this.angularVelocity=0;this.angularAcceleration=0;this.angularDrag=0;this.maxAngular=1000;this.mass=1;this.quadTreeIDs=[];this.quadTreeIndex=-1;this.allowCollision={none:false,any:true,up:true,down:true,left:true,right:true};this.touching={none:true,up:false,down:false,left:false,right:false};this.wasTouching={none:true,up:false,down:false,left:false,right:false};this.immovable=false;this.moves=true;this.rotation=0;this.allowRotation=true;this.allowGravity=true;this.customSeparateX=false;this.customSeparateY=false;this.overlapX=0;this.overlapY=0;this.collideWorldBounds=false;this.lastX=b.x;this.lastY=b.y};Phaser.Physics.Arcade.Body.prototype={updateBounds:function(e,d,c,b){if(c!=this._sx||b!=this._sy){this.width=this.sourceWidth*c;this.height=this.sourceHeight*b;this.halfWidth=Math.floor(this.width/2);this.halfHeight=Math.floor(this.height/2);this._sx=c;this._sy=b}},update:function(){this.wasTouching.none=this.touching.none;this.wasTouching.up=this.touching.up;this.wasTouching.down=this.touching.down;this.wasTouching.left=this.touching.left;this.wasTouching.right=this.touching.right;this.touching.none=true;this.touching.up=false;this.touching.down=false;this.touching.left=false;this.touching.right=false;this.lastX=this.x;this.lastY=this.y;this.rotation=this.sprite.angle;this.x=(this.sprite.x-(this.sprite.anchor.x*this.width))+this.offset.x;this.y=(this.sprite.y-(this.sprite.anchor.y*this.height))+this.offset.y;if(this.moves){this.game.physics.updateMotion(this)}if(this.collideWorldBounds){this.checkWorldBounds()}if(this.allowCollision.none==false&&this.sprite.visible&&this.sprite.alive){this.quadTreeIDs=[];this.quadTreeIndex=-1;this.game.physics.quadTree.insert(this)}this.sprite.x=this.x-this.offset.x+(this.sprite.anchor.x*this.width);this.sprite.y=this.y-this.offset.y+(this.sprite.anchor.y*this.height);if(this.allowRotation){this.sprite.angle=this.rotation}},postUpdate:function(){this.sprite.x=this.x-this.offset.x+(this.sprite.anchor.x*this.width);this.sprite.y=this.y-this.offset.y+(this.sprite.anchor.y*this.height);if(this.allowRotation){this.sprite.angle=this.rotation}},checkWorldBounds:function(){if(this.xthis.game.world.bounds.right){this.x=this.game.world.bounds.right-this.width;this.velocity.x*=-this.bounce.x}}if(this.ythis.game.world.bounds.bottom){this.y=this.game.world.bounds.bottom-this.height;this.velocity.y*=-this.bounce.y}}},setSize:function(d,c,b,e){b=b||this.offset.x;e=e||this.offset.y;this.sourceWidth=d;this.sourceHeight=c;this.width=this.sourceWidth*this._sx;this.height=this.sourceHeight*this._sy;this.halfWidth=Math.floor(this.width/2);this.halfHeight=Math.floor(this.height/2);this.offset.setTo(b,e)},reset:function(){this.velocity.setTo(0,0);this.acceleration.setTo(0,0);this.angularVelocity=0;this.angularAcceleration=0;this.x=(this.sprite.x-(this.sprite.anchor.x*this.width))+this.offset.x;this.y=(this.sprite.y-(this.sprite.anchor.y*this.height))+this.offset.y;this.lastX=this.x;this.lastY=this.y},deltaAbsX:function(){return(this.deltaX()>0?this.deltaX():-this.deltaX())},deltaAbsY:function(){return(this.deltaY()>0?this.deltaY():-this.deltaY())},deltaX:function(){return this.x-this.lastX},deltaY:function(){return this.y-this.lastY}};Object.defineProperty(Phaser.Physics.Arcade.Body.prototype,"bottom",{get:function(){return this.y+this.height},set:function(b){if(b<=this.y){this.height=0}else{this.height=(this.y-b)}}});Object.defineProperty(Phaser.Physics.Arcade.Body.prototype,"right",{get:function(){return this.x+this.width},set:function(b){if(b<=this.x){this.width=0}else{this.width=this.x+b}}});Phaser.Particles=function(b){this.emitters={};this.ID=0};Phaser.Particles.prototype={emitters:null,add:function(b){this.emitters[b.name]=b;return b},remove:function(b){delete this.emitters[b.name]},update:function(){for(var b in this.emitters){if(this.emitters[b].exists){this.emitters[b].update()}}}};Phaser.Particles.Arcade={};Phaser.Particles.Arcade.Emitter=function(c,b,e,d){d=d||50;Phaser.Group.call(this,c);this.name="emitter"+this.game.particles.ID++;this.type=Phaser.EMITTER;this.x=0;this.y=0;this.width=1;this.height=1;this.minParticleSpeed=new Phaser.Point(-100,-100);this.maxParticleSpeed=new Phaser.Point(100,100);this.minParticleScale=1;this.maxParticleScale=1;this.minRotation=-360;this.maxRotation=360;this.gravity=2;this.particleClass=null;this.particleDrag=new Phaser.Point();this.frequency=100;this.maxParticles=d;this.lifespan=2000;this.bounce=0;this._quantity=0;this._timer=0;this._counter=0;this._explode=true;this.on=false;this.exists=true;this.emitX=b;this.emitY=e};Phaser.Particles.Arcade.Emitter.prototype=Object.create(Phaser.Group.prototype);Phaser.Particles.Arcade.Emitter.prototype.constructor=Phaser.Particles.Arcade.Emitter;Phaser.Particles.Arcade.Emitter.prototype.update=function(){if(this.on){if(this._explode){this._counter=0;do{this.emitParticle();this._counter++}while(this._counter=this._timer){this.emitParticle();this._counter++;if(this._quantity>0){if(this._counter>=this._quantity){this.on=false}}this._timer=this.game.time.now+this.frequency}}}};Phaser.Particles.Arcade.Emitter.prototype.makeParticles=function(d,h,f,e){if(typeof h=="undefined"){h=0}f=f||this.maxParticles;e=e||0;var j;var b=0;var c=d;var g=0;while(b0){j.body.allowCollision.any=true;j.body.allowCollision.none=false}else{j.body.allowCollision.none=true}j.exists=false;j.visible=false;j.anchor.setTo(0.5,0.5);this.add(j);b++}return this};Phaser.Particles.Arcade.Emitter.prototype.kill=function(){this.on=false;this.alive=false;this.exists=false};Phaser.Particles.Arcade.Emitter.prototype.revive=function(){this.alive=true;this.exists=true};Phaser.Particles.Arcade.Emitter.prototype.start=function(b,e,d,c){if(typeof b!=="boolean"){b=true}e=e||0;d=d||250;c=c||0;this.revive();this.visible=true;this.on=true;this._explode=b;this.lifespan=e;this.frequency=d;this._quantity+=c;this._counter=0;this._timer=this.game.time.now+d};Phaser.Particles.Arcade.Emitter.prototype.emitParticle=function(){var c=this.getFirstExists(false);if(c==null){return}if(this.width>1||this.height>1){c.reset(this.emiteX-this.game.rnd.integerInRange(this.left,this.right),this.emiteY-this.game.rnd.integerInRange(this.top,this.bottom))}else{c.reset(this.emitX,this.emitY)}c.lifespan=this.lifespan;c.body.bounce.setTo(this.bounce,this.bounce);if(this.minParticleSpeed.x!=this.maxParticleSpeed.x){c.body.velocity.x=this.game.rnd.integerInRange(this.minParticleSpeed.x,this.maxParticleSpeed.x)}else{c.body.velocity.x=this.minParticleSpeed.x}if(this.minParticleSpeed.y!=this.maxParticleSpeed.y){c.body.velocity.y=this.game.rnd.integerInRange(this.minParticleSpeed.y,this.maxParticleSpeed.y)}else{c.body.velocity.y=this.minParticleSpeed.y}c.body.gravity.y=this.gravity;if(this.minRotation!=this.maxRotation){c.body.angularVelocity=this.game.rnd.integerInRange(this.minRotation,this.maxRotation)}else{c.body.angularVelocity=this.minRotation}if(this.minParticleScale!==1||this.maxParticleScale!==1){var b=this.game.rnd.realInRange(this.minParticleScale,this.maxParticleScale);c.scale.setTo(b,b)}c.body.drag.x=this.particleDrag.x;c.body.drag.y=this.particleDrag.y};Phaser.Particles.Arcade.Emitter.prototype.setSize=function(c,b){this.width=c;this.height=b};Phaser.Particles.Arcade.Emitter.prototype.setXSpeed=function(c,b){c=c||0;b=b||0;this.minParticleSpeed.x=c;this.maxParticleSpeed.x=b};Phaser.Particles.Arcade.Emitter.prototype.setYSpeed=function(c,b){c=c||0;b=b||0;this.minParticleSpeed.y=c;this.maxParticleSpeed.y=b};Phaser.Particles.Arcade.Emitter.prototype.setRotation=function(c,b){c=c||0;b=b||0;this.minRotation=c;this.maxRotation=b};Phaser.Particles.Arcade.Emitter.prototype.at=function(b){this.emitX=b.center.x;this.emitY=b.center.y};Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"alpha",{get:function(){return this._container.alpha},set:function(b){this._container.alpha=b}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"visible",{get:function(){return this._container.visible},set:function(b){this._container.visible=b}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"x",{get:function(){return this.emitX},set:function(b){this.emitX=b}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"y",{get:function(){return this.emitY},set:function(b){this.emitY=b}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"left",{get:function(){return Math.floor(this.x-(this.width/2))}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"right",{get:function(){return Math.floor(this.x+(this.width/2))}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"top",{get:function(){return Math.floor(this.y-(this.height/2))}});Object.defineProperty(Phaser.Particles.Arcade.Emitter.prototype,"bottom",{get:function(){return Math.floor(this.y+(this.height/2))}});Phaser.Tilemap=function(d,e,b,i,g,h,c){if(typeof g==="undefined"){g=true}if(typeof h==="undefined"){h=0}if(typeof c==="undefined"){c=0}this.game=d;this.group=null;this.name="";this.key=e;this.renderOrderID=0;this.collisionCallback=null;this.exists=true;this.visible=true;this.tiles=[];this.layers=[];var f=this.game.cache.getTilemap(e);PIXI.DisplayObjectContainer.call(this);this.position.x=b;this.position.y=i;this.type=Phaser.TILEMAP;this.renderer=new Phaser.TilemapRenderer(this.game);this.mapFormat=f.format;switch(this.mapFormat){case Phaser.Tilemap.CSV:this.parseCSV(f.mapData,e,h,c);break;case Phaser.Tilemap.JSON:this.parseTiledJSON(f.mapData,e);break}if(this.currentLayer&&g){this.game.world.setSize(this.currentLayer.widthInPixels,this.currentLayer.heightInPixels,true)}};Phaser.Tilemap.prototype=Object.create(PIXI.DisplayObjectContainer.prototype);Phaser.Tilemap.prototype.constructor=Phaser.Tilemap;Phaser.Tilemap.CSV=0;Phaser.Tilemap.JSON=1;Phaser.Tilemap.prototype.parseCSV=function(d,j,h,g){var f=new Phaser.TilemapLayer(this,0,j,Phaser.Tilemap.CSV,"TileLayerCSV"+this.layers.length.toString(),h,g);d=d.trim();var k=d.split("\n");for(var e=0;e0){f.addColumn(c)}}f.updateBounds();f.createCanvas();var b=f.parseTileOffsets();this.currentLayer=f;this.collisionLayer=f;this.layers.push(f);this.generateTiles(b)};Phaser.Tilemap.prototype.parseTiledJSON=function(g,f){for(var e=0;e0){this.collisionCallback.call(this.collisionCallbackContext,b,this._tempCollisionData)}return true}else{return false}};Phaser.Tilemap.prototype.putTile=function(b,e,c,d){if(typeof d==="undefined"){d=this.currentLayer.ID}this.layers[d].putTile(b,e,c)};Phaser.Tilemap.prototype.update=function(){this.renderer.render(this)};Phaser.Tilemap.prototype.destroy=function(){this.tiles.length=0;this.layers.length=0};Object.defineProperty(Phaser.Tilemap.prototype,"widthInPixels",{get:function(){return this.currentLayer.widthInPixels}});Object.defineProperty(Phaser.Tilemap.prototype,"heightInPixels",{get:function(){return this.currentLayer.heightInPixels}});Phaser.TilemapLayer=function(f,i,e,d,c,h,b){this.exists=true;this.visible=true;this.widthInTiles=0;this.heightInTiles=0;this.widthInPixels=0;this.heightInPixels=0;this.tileMargin=0;this.tileSpacing=0;this.parent=f;this.game=f.game;this.ID=i;this.name=c;this.key=e;this.type=Phaser.TILEMAPLAYER;this.mapFormat=d;this.tileWidth=h;this.tileHeight=b;this.boundsInTiles=new Phaser.Rectangle();var g=this.game.cache.getTilemap(e);this.tileset=g.data;this._alpha=1;this.canvas=null;this.context=null;this.baseTexture=null;this.texture=null;this.sprite=null;this.mapData=[];this._tempTileBlock=[];this._tempBlockResults=[]};Phaser.TilemapLayer.prototype={putTileWorldXY:function(b,d,c){b=this.game.math.snapToFloor(b,this.tileWidth)/this.tileWidth;d=this.game.math.snapToFloor(d,this.tileHeight)/this.tileHeight;if(d>=0&&d=0&&b=0&&d=0&&bthis.widthInPixels||b.body.y<0||b.body.bottom>this.heightInPixels){return this._tempBlockResults}this._tempTileX=this.game.math.snapToFloor(b.body.x,this.tileWidth)/this.tileWidth;this._tempTileY=this.game.math.snapToFloor(b.body.y,this.tileHeight)/this.tileHeight;this._tempTileW=(this.game.math.snapToCeil(b.body.width,this.tileWidth)+this.tileWidth)/this.tileWidth;this._tempTileH=(this.game.math.snapToCeil(b.body.height,this.tileHeight)+this.tileHeight)/this.tileHeight;this.getTempBlock(this._tempTileX,this._tempTileY,this._tempTileW,this._tempTileH,true);for(var c=0;cthis.widthInTiles){g=this.widthInTiles}if(c>this.heightInTiles){c=this.heightInTiles}this._tempTileBlock=[];for(var b=h;b=0&&c=0&&bb.widthInTiles){this._maxX=b.widthInTiles}if(this._maxY>b.heightInTiles){this._maxY=b.heightInTiles}if(this._startX+this._maxX>b.widthInTiles){this._startX=b.widthInTiles-this._maxX}if(this._startY+this._maxY>b.heightInTiles){this._startY=b.heightInTiles-this._maxY}this._dx=-(this.game.camera.x-(this._startX*b.tileWidth));this._dy=-(this.game.camera.y-(this._startY*b.tileHeight));this._tx=this._dx;this._ty=this._dy;if(b.alpha!==1){this._ga=b.context.globalAlpha;b.context.globalAlpha=b.alpha}b.context.clearRect(0,0,b.canvas.width,b.canvas.height);for(var f=this._startY;f-1){b.context.globalAlpha=this._ga}if(this.game.renderType==Phaser.WEBGL){PIXI.texturesToUpdate.push(b.baseTexture)}}return true}}; \ No newline at end of file diff --git a/docs2/jsdoc_work.txt b/docs2/jsdoc_work.txt deleted file mode 100644 index 03fb7337..00000000 --- a/docs2/jsdoc_work.txt +++ /dev/null @@ -1,74 +0,0 @@ -JSDOC3 Work: - -1) This should go at the top of every file (with the module name corrected) - -/** -* @author Richard Davey -* @copyright 2013 Photon Storm Ltd. -* @license https://github.com/photonstorm/phaser/blob/master/license.txt MIT License -* @module Phaser.Animation -*/ - -2) This is the format a constructor should be: - -/** -* The constructor description goes here. If there isn't one for you to paste in, just put TODO. -* -* @class Phaser.Animation -* @constructor -* @param {Phaser.Game} game - A reference to the currently running game. -* @param {Phaser.Sprite} parent - A reference to the owner of this Animation. -* @param {string} name - The unique name for this animation, used in playback commands. -* @param {Phaser.Animation.FrameData} frameData - The FrameData object that contains all frames used by this Animation. -* @param {(Array.|Array.)} frames - An array of numbers or strings indicating which frames to play in which order. -* @param {number} delay - The time between each frame of the animation, given in ms. -* @param {boolean} looped - Should this animation loop or play through once. -*/ - -You must ensure the class is correct and it has the @constructor tag. -It is important you include the data-type. I don't expect you to know what the data type is, so just include: {todo} -It is important you include the hypen after the parameter name. You will always know what the parameter name is, so it should always be included. -You often won't know what the parameter description is, so just put "todo", like this: - -* @param {todo} name - todo. - -3) Functions are nearly exactly the same as the constructor: - -/** -* The function description goes here. If there isn't one for you to paste in, just put TODO. -* -* @method play -* @param {Number} [frameRate=null] The framerate to play the animation at. -* @return {Phaser.Animation} A reference to this Animation instance. -*/ - -You must ensure the @method tag is correct and present. -It is important you include the data-type. I don't expect you to know what the data type is, so just include: {todo} -It is important you include the hypen after the parameter name. You will always know what the parameter name is, so it should always be included. -You often won't know what the parameter description is, so just put "todo", like this: - -* @param {todo} name - todo. - -4) All properties must be marked-up: - -/** -* @property {boolean} isFinished - The finished state of the Animation. Set to true once playback completes, false during playback. -* @default -*/ -this.isFinished = false; - -It is important you include the data-type. I don't expect you to know what the data type is, so just include: {todo} -It is important you include the hypen after the parameter name. You will always know what the parameter name is, so it should always be included. -You often won't know what the parameter description is, so just put "todo", like this: - -* @property {todo} isFinished - todo. - -If the property has a base value assigned to it (i.e. a number or a string) then put @default. -If the property starts with an underscore it must include @private. Here is an example combining the two: - -/** -* @property {number} _frameIndex - The index of the current frame. -* @private -* @default -*/ -this._frameIndex = 0; diff --git a/docs2/out/AnimationManager-Phaser.AnimationManager.html b/docs2/out/AnimationManager-Phaser.AnimationManager.html deleted file mode 100644 index 5a25abcb..00000000 --- a/docs2/out/AnimationManager-Phaser.AnimationManager.html +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - Phaser Class: AnimationManager - - - - - - - - - - -

- - -
- - -
- -
- - - -

Class: AnimationManager

-
- -
-

- AnimationManager -

- -

Phaser.AnimationManager

- -
- -
-
- - - - -
-

new AnimationManager(sprite)

- - -
-
- - -
-

The Animation Manager is used to add, play and update Phaser Animations. -Any Game Object such as Phaser.Sprite that supports animation contains a single AnimationManager instance.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sprite - - -Phaser.Sprite - - - -

A reference to the Game Object that owns this AnimationManager.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

currentFrame

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
currentFrame - - -Phaser.Animation.Frame - - - -

The currently displayed Frame of animation, if any.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

game

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running Game.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

sprite

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sprite - - -Phaser.Sprite - - - -

A reference to the parent Sprite that owns this AnimationManager.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

updateIfVisible

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
updateIfVisible - - -boolean - - - -

Should the animation data continue to update even if the Sprite.visible is set to false.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Tue Oct 01 2013 23:59:05 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/AnimationManager.html b/docs2/out/AnimationManager.html deleted file mode 100644 index 06c6b6a4..00000000 --- a/docs2/out/AnimationManager.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - Phaser Module: AnimationManager - - - - - - - - - - -
- - -
- - -
- -
- - - -

Module: AnimationManager

-
- -
-

- AnimationManager -

- -
- - - -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Tue Oct 01 2013 23:59:05 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Back.html b/docs2/out/Back.html deleted file mode 100644 index b21a0a88..00000000 --- a/docs2/out/Back.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Back - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Back

-
- -
-

- Back -

- -
- -
-
- - - - -

Back easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Back ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Back ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Back ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Bounce.html b/docs2/out/Bounce.html deleted file mode 100644 index 8767df5c..00000000 --- a/docs2/out/Bounce.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Bounce - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Bounce

-
- -
-

- Bounce -

- -
- -
-
- - - - -

Bounce easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Bounce ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Bounce ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Bounce ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Circular.html b/docs2/out/Circular.html deleted file mode 100644 index bc4edeae..00000000 --- a/docs2/out/Circular.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Circular - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Circular

-
- -
-

- Circular -

- -
- -
-
- - - - -

Circular easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Circular ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Circular ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Circular ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Cubic.html b/docs2/out/Cubic.html deleted file mode 100644 index d5580a6f..00000000 --- a/docs2/out/Cubic.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Cubic - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Cubic

-
- -
-

- Cubic -

- -
- -
-
- - - - -

Cubic easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Cubic ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Cubic ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Cubic ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Elastic.html b/docs2/out/Elastic.html deleted file mode 100644 index c5338776..00000000 --- a/docs2/out/Elastic.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Elastic - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Elastic

-
- -
-

- Elastic -

- -
- -
-
- - - - -

Elastic easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Elastic ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Elastic ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Elastic ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Exponential.html b/docs2/out/Exponential.html deleted file mode 100644 index 080e8300..00000000 --- a/docs2/out/Exponential.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Exponential - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Exponential

-
- -
-

- Exponential -

- -
- -
-
- - - - -

Exponential easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Exponential ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Exponential ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Exponential ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Linear.html b/docs2/out/Linear.html deleted file mode 100644 index 53d2fdde..00000000 --- a/docs2/out/Linear.html +++ /dev/null @@ -1,592 +0,0 @@ - - - - - - Phaser Namespace: Linear - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Linear

-
- -
-

- Linear -

- -
- -
-
- - - - -

Linear easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

k^2.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Parser.js.html b/docs2/out/Parser.js.html deleted file mode 100644 index 4ee8747a..00000000 --- a/docs2/out/Parser.js.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - - Phaser Source: animation/Parser.js - - - - - - - - - - -
- - -
- - -
- -
- - - -

Source: animation/Parser.js

- -
-
-
/**
-* @author       Richard Davey <rich@photonstorm.com>
-* @copyright    2013 Photon Storm Ltd.
-* @license      {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
-*/
-
-/**
-* Responsible for parsing sprite sheet and JSON data into the internal FrameData format that Phaser uses for animations.
-*
-* @class Phaser.Animation.Parser
-*/
-Phaser.Animation.Parser = {
-
-    /**
-    * Parse a Sprite Sheet and extract the animation frame data from it.
-    *
-    * @method Phaser.Animation.Parser.spriteSheet
-    * @param {Phaser.Game} game - A reference to the currently running game.
-    * @param {string} key - The Game.Cache asset key of the Sprite Sheet image.
-    * @param {number} frameWidth - The fixed width of each frame of the animation.
-    * @param {number} frameHeight - The fixed height of each frame of the animation.
-    * @param {number} [frameMax=-1] - The total number of animation frames to extact from the Sprite Sheet. The default value of -1 means "extract all frames".
-    * @return {Phaser.Animation.FrameData} A FrameData object containing the parsed frames.
-    */
-    spriteSheet: function (game, key, frameWidth, frameHeight, frameMax) {
-
-        //  How big is our image?
-        var img = game.cache.getImage(key);
-
-        if (img == null)
-        {
-            return null;
-        }
-
-        var width = img.width;
-        var height = img.height;
-
-        if (frameWidth <= 0)
-        {
-            frameWidth = Math.floor(-width / Math.min(-1, frameWidth));
-        }
-
-        if (frameHeight <= 0)
-        {
-            frameHeight = Math.floor(-height / Math.min(-1, frameHeight));
-        }
-
-        var row = Math.round(width / frameWidth);
-        var column = Math.round(height / frameHeight);
-        var total = row * column;
-        
-        if (frameMax !== -1)
-        {
-            total = frameMax;
-        }
-
-        //  Zero or smaller than frame sizes?
-        if (width == 0 || height == 0 || width < frameWidth || height < frameHeight || total === 0)
-        {
-            console.warn("Phaser.Animation.Parser.spriteSheet: width/height zero or width/height < given frameWidth/frameHeight");
-            return null;
-        }
-
-        //  Let's create some frames then
-        var data = new Phaser.Animation.FrameData();
-        var x = 0;
-        var y = 0;
-
-        for (var i = 0; i < total; i++)
-        {
-            var uuid = game.rnd.uuid();
-
-            data.addFrame(new Phaser.Animation.Frame(i, x, y, frameWidth, frameHeight, '', uuid));
-
-            PIXI.TextureCache[uuid] = new PIXI.Texture(PIXI.BaseTextureCache[key], {
-                x: x,
-                y: y,
-                width: frameWidth,
-                height: frameHeight
-            });
-
-            x += frameWidth;
-
-            if (x === width)
-            {
-                x = 0;
-                y += frameHeight;
-            }
-        }
-
-        return data;
-
-    },
-
-    /**
-    * Parse the JSON data and extract the animation frame data from it.
-    *
-    * @method Phaser.Animation.Parser.JSONData
-    * @param {Phaser.Game} game - A reference to the currently running game.
-    * @param {Object} json - The JSON data from the Texture Atlas. Must be in Array format.
-    * @param {string} cacheKey - The Game.Cache asset key of the texture image.
-    * @return {Phaser.Animation.FrameData} A FrameData object containing the parsed frames.
-    */
-    JSONData: function (game, json, cacheKey) {
-
-        //  Malformed?
-        if (!json['frames'])
-        {
-            console.warn("Phaser.Animation.Parser.JSONData: Invalid Texture Atlas JSON given, missing 'frames' array");
-            console.log(json);
-            return;
-        }
-
-        //  Let's create some frames then
-        var data = new Phaser.Animation.FrameData();
-        
-        //  By this stage frames is a fully parsed array
-        var frames = json['frames'];
-        var newFrame;
-        
-        for (var i = 0; i < frames.length; i++)
-        {
-            var uuid = game.rnd.uuid();
-
-            newFrame = data.addFrame(new Phaser.Animation.Frame(
-                i,
-            	frames[i].frame.x, 
-            	frames[i].frame.y, 
-            	frames[i].frame.w, 
-            	frames[i].frame.h, 
-            	frames[i].filename,
-                uuid
-			));
-
-            PIXI.TextureCache[uuid] = new PIXI.Texture(PIXI.BaseTextureCache[cacheKey], {
-                x: frames[i].frame.x,
-                y: frames[i].frame.y,
-                width: frames[i].frame.w,
-                height: frames[i].frame.h
-            });
-
-            if (frames[i].trimmed)
-            {
-                newFrame.setTrim(
-                    frames[i].trimmed, 
-                    frames[i].sourceSize.w, 
-                    frames[i].sourceSize.h, 
-                    frames[i].spriteSourceSize.x, 
-                    frames[i].spriteSourceSize.y, 
-                    frames[i].spriteSourceSize.w, 
-                    frames[i].spriteSourceSize.h
-                );
-
-                //  We had to hack Pixi to get this to work :(
-                PIXI.TextureCache[uuid].trimmed = true;
-                PIXI.TextureCache[uuid].trim.x = frames[i].spriteSourceSize.x;
-                PIXI.TextureCache[uuid].trim.y = frames[i].spriteSourceSize.y;
-
-            }
-        }
-
-        return data;
-
-    },
-
-    /**
-    * Parse the JSON data and extract the animation frame data from it.
-    *
-    * @method Phaser.Animation.Parser.JSONDataHash
-    * @param {Phaser.Game} game - A reference to the currently running game.
-    * @param {Object} json - The JSON data from the Texture Atlas. Must be in JSON Hash format.
-    * @param {string} cacheKey - The Game.Cache asset key of the texture image.
-    * @return {Phaser.Animation.FrameData} A FrameData object containing the parsed frames.
-    */
-    JSONDataHash: function (game, json, cacheKey) {
-
-        //  Malformed?
-        if (!json['frames'])
-        {
-            console.warn("Phaser.Animation.Parser.JSONDataHash: Invalid Texture Atlas JSON given, missing 'frames' object");
-            console.log(json);
-            return;
-        }
-            
-        //  Let's create some frames then
-        var data = new Phaser.Animation.FrameData();
-
-        //  By this stage frames is a fully parsed array
-        var frames = json['frames'];
-        var newFrame;
-        var i = 0;
-        
-        for (var key in frames)
-        {
-            var uuid = game.rnd.uuid();
-
-            newFrame = data.addFrame(new Phaser.Animation.Frame(
-                i,
-                frames[key].frame.x, 
-                frames[key].frame.y, 
-                frames[key].frame.w, 
-                frames[key].frame.h, 
-                key,
-                uuid
-            ));
-
-            PIXI.TextureCache[uuid] = new PIXI.Texture(PIXI.BaseTextureCache[cacheKey], {
-                x: frames[key].frame.x,
-                y: frames[key].frame.y,
-                width: frames[key].frame.w,
-                height: frames[key].frame.h
-            });
-
-            if (frames[key].trimmed)
-            {
-                newFrame.setTrim(
-                    frames[key].trimmed, 
-                    frames[key].sourceSize.w, 
-                    frames[key].sourceSize.h, 
-                    frames[key].spriteSourceSize.x, 
-                    frames[key].spriteSourceSize.y, 
-                    frames[key].spriteSourceSize.w, 
-                    frames[key].spriteSourceSize.h
-                );
-
-                //  We had to hack Pixi to get this to work :(
-                PIXI.TextureCache[uuid].trimmed = true;
-                PIXI.TextureCache[uuid].trim.x = frames[key].spriteSourceSize.x;
-                PIXI.TextureCache[uuid].trim.y = frames[key].spriteSourceSize.y;
-
-            }
-
-            i++;
-        }
-
-        return data;
-
-    },
-
-    /**
-    * Parse the XML data and extract the animation frame data from it.
-    *
-    * @method Phaser.Animation.Parser.XMLData
-    * @param {Phaser.Game} game - A reference to the currently running game.
-    * @param {Object} xml - The XML data from the Texture Atlas. Must be in Starling XML format.
-    * @param {string} cacheKey - The Game.Cache asset key of the texture image.
-    * @return {Phaser.Animation.FrameData} A FrameData object containing the parsed frames.
-    */
-    XMLData: function (game, xml, cacheKey) {
-
-        //  Malformed?
-        if (!xml.getElementsByTagName('TextureAtlas'))
-        {
-            console.warn("Phaser.Animation.Parser.XMLData: Invalid Texture Atlas XML given, missing <TextureAtlas> tag");
-            return;
-        }
-
-        //  Let's create some frames then
-        var data = new Phaser.Animation.FrameData();
-        var frames = xml.getElementsByTagName('SubTexture');
-        var newFrame;
-        
-        for (var i = 0; i < frames.length; i++)
-        {
-            var uuid = game.rnd.uuid();
-
-            var frame = frames[i].attributes;
-
-            newFrame = data.addFrame(new Phaser.Animation.Frame(
-                i,
-            	frame.x.nodeValue, 
-            	frame.y.nodeValue, 
-            	frame.width.nodeValue, 
-            	frame.height.nodeValue, 
-            	frame.name.nodeValue,
-                uuid
-            ));
-
-            PIXI.TextureCache[uuid] = new PIXI.Texture(PIXI.BaseTextureCache[cacheKey], {
-                x: frame.x.nodeValue,
-                y: frame.y.nodeValue,
-                width: frame.width.nodeValue,
-                height: frame.height.nodeValue
-            });
-
-            //  Trimmed?
-            if (frame.frameX.nodeValue != '-0' || frame.frameY.nodeValue != '-0')
-            {
-                newFrame.setTrim(
-                	true, 
-                	frame.width.nodeValue, 
-                	frame.height.nodeValue, 
-                	Math.abs(frame.frameX.nodeValue), 
-                	Math.abs(frame.frameY.nodeValue), 
-                	frame.frameWidth.nodeValue, 
-                	frame.frameHeight.nodeValue
-                );
-
-                PIXI.TextureCache[uuid].realSize = {
-                    x: Math.abs(frame.frameX.nodeValue),
-                    y: Math.abs(frame.frameY.nodeValue),
-                    w: frame.frameWidth.nodeValue,
-                    h: frame.frameHeight.nodeValue
-                };
-
-                //  We had to hack Pixi to get this to work :(
-                PIXI.TextureCache[uuid].trimmed = true;
-                PIXI.TextureCache[uuid].trim.x = Math.abs(frame.frameX.nodeValue);
-                PIXI.TextureCache[uuid].trim.y = Math.abs(frame.frameY.nodeValue);
-
-            }
-        }
-
-        return data;
-
-    }
-
-};
-
-
-
- - - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:41 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - diff --git a/docs2/out/Parser.js_.html b/docs2/out/Parser.js_.html deleted file mode 100644 index 3711692e..00000000 --- a/docs2/out/Parser.js_.html +++ /dev/null @@ -1,381 +0,0 @@ - - - - - - Phaser Source: loader/Parser.js - - - - - - - - - - -
- - -
- - -
- -
- - - -

Source: loader/Parser.js

- -
-
-
/**
-* @author       Richard Davey <rich@photonstorm.com>
-* @copyright    2013 Photon Storm Ltd.
-* @license      {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
-*/
-
-/**
-* Phaser.Loader.Parser parses data objects from Phaser.Loader that need more preparation before they can be inserted into the Cache.
-*
-* @class Phaser.Loader.Parser
-*/
-Phaser.Loader.Parser = {
-	
-    /**
-    * Parse frame data from an XML file.
-    * @method Phaser.Loader.Parser.bitmapFont
-    * @param {object} xml - XML data you want to parse.
-    * @return {FrameData} Generated FrameData object.
-    */
-	bitmapFont: function (game, xml, cacheKey) {
-
-        //  Malformed?
-        if (!xml.getElementsByTagName('font'))
-        {
-            console.warn("Phaser.Loader.Parser.bitmapFont: Invalid XML given, missing <font> tag");
-            return;
-        }
-
-        var texture = PIXI.TextureCache[cacheKey];
-
-        var data = {};
-        var info = xml.getElementsByTagName("info")[0];
-        var common = xml.getElementsByTagName("common")[0];
-        data.font = info.attributes.getNamedItem("face").nodeValue;
-        data.size = parseInt(info.attributes.getNamedItem("size").nodeValue, 10);
-        data.lineHeight = parseInt(common.attributes.getNamedItem("lineHeight").nodeValue, 10);
-        data.chars = {};
-
-        //parse letters
-        var letters = xml.getElementsByTagName("char");
-
-        for (var i = 0; i < letters.length; i++)
-        {
-            var charCode = parseInt(letters[i].attributes.getNamedItem("id").nodeValue, 10);
-
-            var textureRect = {
-                x: parseInt(letters[i].attributes.getNamedItem("x").nodeValue, 10),
-                y: parseInt(letters[i].attributes.getNamedItem("y").nodeValue, 10),
-                width: parseInt(letters[i].attributes.getNamedItem("width").nodeValue, 10),
-                height: parseInt(letters[i].attributes.getNamedItem("height").nodeValue, 10)
-            };
-
-            //	Note: This means you can only have 1 BitmapFont loaded at once!
-            //	Need to replace this with our own handler soon.
-            PIXI.TextureCache[charCode] = new PIXI.Texture(texture, textureRect);
-
-            data.chars[charCode] = {
-                xOffset: parseInt(letters[i].attributes.getNamedItem("xoffset").nodeValue, 10),
-                yOffset: parseInt(letters[i].attributes.getNamedItem("yoffset").nodeValue, 10),
-                xAdvance: parseInt(letters[i].attributes.getNamedItem("xadvance").nodeValue, 10),
-                kerning: {},
-                texture:new PIXI.Texture(texture, textureRect)
-
-            };
-        }
-
-        //parse kernings
-        var kernings = xml.getElementsByTagName("kerning");
-
-        for (i = 0; i < kernings.length; i++)
-        {
-           var first = parseInt(kernings[i].attributes.getNamedItem("first").nodeValue, 10);
-           var second = parseInt(kernings[i].attributes.getNamedItem("second").nodeValue, 10);
-           var amount = parseInt(kernings[i].attributes.getNamedItem("amount").nodeValue, 10);
-
-            data.chars[second].kerning[first] = amount;
-        }
-
-        PIXI.BitmapText.fonts[data.font] = data;
-
-    }
-
-};
-
-
- - - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:41 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - diff --git a/docs2/out/Phaser.Animation.Frame.html b/docs2/out/Phaser.Animation.Frame.html deleted file mode 100644 index 45f24b81..00000000 --- a/docs2/out/Phaser.Animation.Frame.html +++ /dev/null @@ -1,2815 +0,0 @@ - - - - - - Phaser Class: Frame - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: Frame

-
- -
-

- .Animation. - - Frame -

- -

Phaser.Animation.Frame

- -
- -
-
- - - - -
-

new Frame(index, x, y, width, height, name, uuid)

- - -
-
- - -
-

A Frame is a single frame of an animation and is part of a FrameData collection.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
index - - -number - - - -

The index of this Frame within the FrameData set it is being added to.

x - - -number - - - -

X position of the frame within the texture image.

y - - -number - - - -

Y position of the frame within the texture image.

width - - -number - - - -

Width of the frame within the texture image.

height - - -number - - - -

Height of the frame within the texture image.

name - - -string - - - -

The name of the frame. In Texture Atlas data this is usually set to the filename.

uuid - - -string - - - -

Internal UUID key.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

centerX

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
centerX - - -number - - - -

Center X position within the image to cut from.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

centerY

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
centerY - - -number - - - -

Center Y position within the image to cut from.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

distance

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
distance - - -number - - - -

The distance from the top left to the bottom-right of this Frame.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

height

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
height - - -number - - - -

Height of the frame.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

index

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
index - - -number - - - -

The index of this Frame within the FrameData set it is being added to.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

name

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - -

Useful for Texture Atlas files (is set to the filename value).

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

rotated

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
rotated - - -boolean - - - -

Rotated? (not yet implemented)

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

rotationDirection

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
rotationDirection - - -string - - - -

Either 'cw' or 'ccw', rotation is always 90 degrees.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • 'cw'
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

sourceSizeH

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sourceSizeH - - -number - - - -

Height of the original sprite.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

sourceSizeW

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sourceSizeW - - -number - - - -

Width of the original sprite.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

spriteSourceSizeH

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
spriteSourceSizeH - - -number - - - -

Height of the trimmed sprite.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • 0
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

spriteSourceSizeW

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
spriteSourceSizeW - - -number - - - -

Width of the trimmed sprite.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • 0
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

spriteSourceSizeX

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
spriteSourceSizeX - - -number - - - -

X position of the trimmed sprite inside original sprite.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • 0
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

spriteSourceSizeY

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
spriteSourceSizeY - - -number - - - -

Y position of the trimmed sprite inside original sprite.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • 0
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

trimmed

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
trimmed - - -boolean - - - -

Was it trimmed when packed?

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

uuid

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
uuid - - -string - - - -

A link to the PIXI.TextureCache entry.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

width

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
width - - -number - - - -

Width of the frame.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

x

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
x - - -number - - - -

X position within the image to cut from.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

y

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
y - - -number - - - -

Y position within the image to cut from.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-

setTrim(trimmed, actualWidth, actualHeight, destX, destY, destWidth, destHeight)

- - -
-
- - -
-

If the frame was trimmed when added to the Texture Atlas this records the trim and source data.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
trimmed - - -boolean - - - -

If this frame was trimmed or not.

actualWidth - - -number - - - -

The width of the frame before being trimmed.

actualHeight - - -number - - - -

The height of the frame before being trimmed.

destX - - -number - - - -

The destination X position of the trimmed frame for display.

destY - - -number - - - -

The destination Y position of the trimmed frame for display.

destWidth - - -number - - - -

The destination width of the trimmed frame for display.

destHeight - - -number - - - -

The destination height of the trimmed frame for display.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:41 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Phaser.Animation.FrameData.html b/docs2/out/Phaser.Animation.FrameData.html deleted file mode 100644 index 6e9e4cf0..00000000 --- a/docs2/out/Phaser.Animation.FrameData.html +++ /dev/null @@ -1,1762 +0,0 @@ - - - - - - Phaser Class: FrameData - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: FrameData

-
- -
-

- .Animation. - - FrameData -

- -

Phaser.Animation.FrameData

- -
- -
-
- - - - -
-

new FrameData()

- - -
-
- - -
-

FrameData is a container for Frame objects, which are the internal representation of animation data in Phaser.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

<readonly> total

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
total - - -number - - - -

The total number of frames in this FrameData set.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-

addFrame(frame) → {Phaser.Animation.Frame}

- - -
-
- - -
-

Adds a new Frame to this FrameData collection. Typically called by the Animation.Parser and not directly.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
frame - - -Phaser.Animation.Frame - - - -

The frame to add to this FrameData set.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

The frame that was just added.

-
- - - -
-
- Type -
-
- -Phaser.Animation.Frame - - -
-
- - - - - -
- - - -
-

checkFrameName(name) → {boolean}

- - -
-
- - -
-

Check if there is a Frame with the given name.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - -

The name of the frame you want to check.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

True if the frame is found, otherwise false.

-
- - - -
-
- Type -
-
- -boolean - - -
-
- - - - - -
- - - -
-

getFrame(index) → {Phaser.Animation.Frame}

- - -
-
- - -
-

Get a Frame by its numerical index.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
index - - -number - - - -

The index of the frame you want to get.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

The frame, if found.

-
- - - -
-
- Type -
-
- -Phaser.Animation.Frame - - -
-
- - - - - -
- - - -
-

getFrameByName(name) → {Phaser.Animation.Frame}

- - -
-
- - -
-

Get a Frame by its frame name.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - -

The name of the frame you want to get.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

The frame, if found.

-
- - - -
-
- Type -
-
- -Phaser.Animation.Frame - - -
-
- - - - - -
- - - -
-

getFrameIndexes(frames, useNumericIndex, output) → {Array}

- - -
-
- - -
-

Returns all of the Frame indexes in this FrameData set. -The frames indexes are returned in the output array, or if none is provided in a new Array object.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
frames - - -Array - - - - - - - - - - - -

An Array containing the indexes of the frames to retrieve. If the array is empty then all frames in the FrameData are returned.

useNumericIndex - - -boolean - - - - - - <optional>
- - - - - -
- - true - -

Are the given frames using numeric indexes (default) or strings? (false)

output - - -Array - - - - - - <optional>
- - - - - -
- -

If given the results will be appended to the end of this array otherwise a new array will be created.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

An array of all Frame indexes matching the given names or IDs.

-
- - - -
-
- Type -
-
- -Array - - -
-
- - - - - -
- - - -
-

getFrameRange(start, end, output) → {Array}

- - -
-
- - -
-

Returns a range of frames based on the given start and end frame indexes and returns them in an Array.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
start - - -number - - - - - - - - - -

The starting frame index.

end - - -number - - - - - - - - - -

The ending frame index.

output - - -Array - - - - - - <optional>
- - - - - -

If given the results will be appended to the end of this array otherwise a new array will be created.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

An array of Frames between the start and end index values, or an empty array if none were found.

-
- - - -
-
- Type -
-
- -Array - - -
-
- - - - - -
- - - -
-

getFrames(frames, useNumericIndex, output) → {Array}

- - -
-
- - -
-

Returns all of the Frames in this FrameData set where the frame index is found in the input array. -The frames are returned in the output array, or if none is provided in a new Array object.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
frames - - -Array - - - - - - - - - - - -

An Array containing the indexes of the frames to retrieve. If the array is empty then all frames in the FrameData are returned.

useNumericIndex - - -boolean - - - - - - <optional>
- - - - - -
- - true - -

Are the given frames using numeric indexes (default) or strings? (false)

output - - -Array - - - - - - <optional>
- - - - - -
- -

If given the results will be appended to the end of this array otherwise a new array will be created.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

An array of all Frames in this FrameData set matching the given names or IDs.

-
- - - -
-
- Type -
-
- -Array - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:42 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Phaser.Animation.Parser.html b/docs2/out/Phaser.Animation.Parser.html deleted file mode 100644 index 3bccd7c2..00000000 --- a/docs2/out/Phaser.Animation.Parser.html +++ /dev/null @@ -1,1269 +0,0 @@ - - - - - - Phaser Class: Parser - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: Parser

-
- -
-

- .Animation. - - Parser -

- -
- -
-
- - - - -
-

new Parser()

- - -
-
- - -
-

Responsible for parsing sprite sheet and JSON data into the internal FrameData format that Phaser uses for animations.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> JSONData(game, json, cacheKey) → {Phaser.Animation.FrameData}

- - -
-
- - -
-

Parse the JSON data and extract the animation frame data from it.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

json - - -Object - - - -

The JSON data from the Texture Atlas. Must be in Array format.

cacheKey - - -string - - - -

The Game.Cache asset key of the texture image.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

A FrameData object containing the parsed frames.

-
- - - -
-
- Type -
-
- -Phaser.Animation.FrameData - - -
-
- - - - - -
- - - -
-

<static> JSONDataHash(game, json, cacheKey) → {Phaser.Animation.FrameData}

- - -
-
- - -
-

Parse the JSON data and extract the animation frame data from it.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

json - - -Object - - - -

The JSON data from the Texture Atlas. Must be in JSON Hash format.

cacheKey - - -string - - - -

The Game.Cache asset key of the texture image.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

A FrameData object containing the parsed frames.

-
- - - -
-
- Type -
-
- -Phaser.Animation.FrameData - - -
-
- - - - - -
- - - -
-

<static> spriteSheet(game, key, frameWidth, frameHeight, frameMax) → {Phaser.Animation.FrameData}

- - -
-
- - -
-

Parse a Sprite Sheet and extract the animation frame data from it.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
game - - -Phaser.Game - - - - - - - - - - - -

A reference to the currently running game.

key - - -string - - - - - - - - - - - -

The Game.Cache asset key of the Sprite Sheet image.

frameWidth - - -number - - - - - - - - - - - -

The fixed width of each frame of the animation.

frameHeight - - -number - - - - - - - - - - - -

The fixed height of each frame of the animation.

frameMax - - -number - - - - - - <optional>
- - - - - -
- - -1 - -

The total number of animation frames to extact from the Sprite Sheet. The default value of -1 means "extract all frames".

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

A FrameData object containing the parsed frames.

-
- - - -
-
- Type -
-
- -Phaser.Animation.FrameData - - -
-
- - - - - -
- - - -
-

<static> XMLData(game, xml, cacheKey) → {Phaser.Animation.FrameData}

- - -
-
- - -
-

Parse the XML data and extract the animation frame data from it.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

xml - - -Object - - - -

The XML data from the Texture Atlas. Must be in Starling XML format.

cacheKey - - -string - - - -

The Game.Cache asset key of the texture image.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

A FrameData object containing the parsed frames.

-
- - - -
-
- Type -
-
- -Phaser.Animation.FrameData - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:42 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Phaser.Loader.Parser.html b/docs2/out/Phaser.Loader.Parser.html deleted file mode 100644 index a68e0d06..00000000 --- a/docs2/out/Phaser.Loader.Parser.html +++ /dev/null @@ -1,548 +0,0 @@ - - - - - - Phaser Class: Parser - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: Parser

-
- -
-

- .Loader. - - Parser -

- -
- -
-
- - - - -
-

new Parser()

- - -
-
- - -
-

Phaser.Loader.Parser parses data objects from Phaser.Loader that need more preparation before they can be inserted into the Cache.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> bitmapFont(xml) → {FrameData}

- - -
-
- - -
-

Parse frame data from an XML file.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
xml - - -object - - - -

XML data you want to parse.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Generated FrameData object.

-
- - - -
-
- Type -
-
- -FrameData - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:18:43 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/PluginManager-Phaser.PluginManager.html b/docs2/out/PluginManager-Phaser.PluginManager.html deleted file mode 100644 index d899654c..00000000 --- a/docs2/out/PluginManager-Phaser.PluginManager.html +++ /dev/null @@ -1,599 +0,0 @@ - - - - - - Phaser Class: PluginManager - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: PluginManager

-
- -
-

- PluginManager -

- -

PPhaser - PluginManager

- -
- -
-
- - - - -
-

new PluginManager(game, parent)

- - -
-
- - -
-

Description.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

parent - - -Description - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

game

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

plugins

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
plugins - - -array - - - -

Description.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Wed Oct 02 2013 13:35:30 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/PluginManager.html b/docs2/out/PluginManager.html deleted file mode 100644 index 62067e01..00000000 --- a/docs2/out/PluginManager.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - - Phaser Module: PluginManager - - - - - - - - - - -
- - -
- - -
- -
- - - -

Module: PluginManager

-
- -
-

- PluginManager -

- -
- -
-
- - - - - - -
- - - - - - - - - - - -
Author:
-
- -
- - - - - - - - -
License:
-
- - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Wed Oct 02 2013 13:35:30 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Quadratic.html b/docs2/out/Quadratic.html deleted file mode 100644 index 300ea209..00000000 --- a/docs2/out/Quadratic.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Quadratic - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Quadratic

-
- -
-

- Quadratic -

- -
- -
-
- - - - -

Quadratic easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

k^2.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

k* (2-k).

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:57:03 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Quartic.html b/docs2/out/Quartic.html deleted file mode 100644 index c9913fe0..00000000 --- a/docs2/out/Quartic.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Quartic - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Quartic

-
- -
-

- Quartic -

- -
- -
-
- - - - -

Quartic easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Quartic ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Quartic ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Quartic ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:57:03 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Quintic.html b/docs2/out/Quintic.html deleted file mode 100644 index 9e505166..00000000 --- a/docs2/out/Quintic.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Quintic - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Quintic

-
- -
-

- Quintic -

- -
- -
-
- - - - -

Quintic easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Quintic ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Quintic ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Quintic ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:57:03 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Sinusoidal.html b/docs2/out/Sinusoidal.html deleted file mode 100644 index e335ad15..00000000 --- a/docs2/out/Sinusoidal.html +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - Phaser Namespace: Sinusoidal - - - - - - - - - - -
- - -
- - -
- -
- - - -

Namespace: Sinusoidal

-
- -
-

- Sinusoidal -

- -
- -
-
- - - - -

Sinusoidal easing.

- - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-

<static> In(k) → {number}

- - -
-
- - -
-

Sinusoidal ease-in.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> InOut(k) → {number}

- - -
-
- - -
-

Sinusoidal ease-in/out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- - - -
-

<static> Out(k) → {number}

- - -
-
- - -
-

Sinusoidal ease-out.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
k - - -number - - - -

Description.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - -
Returns:
- - -
-

Description.

-
- - - -
-
- Type -
-
- -number - - -
-
- - - - - -
- -
- - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:57:03 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Utils.html b/docs2/out/Utils.html deleted file mode 100644 index d664e73f..00000000 --- a/docs2/out/Utils.html +++ /dev/null @@ -1,502 +0,0 @@ - - - - - - Phaser Module: Utils - - - - - - - - - - -
- - -
- - -
- -
- - - -

Module: Utils

-
- -
-

- Phaser. - - Utils -

- -
- -
-
- - - - - - -
- - - - - - - - - - - -
Author:
-
- -
- - - - - - - - -
License:
-
- - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:27:21 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/Utils_.html b/docs2/out/Utils_.html deleted file mode 100644 index fa393369..00000000 --- a/docs2/out/Utils_.html +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - Phaser Class: Utils - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: Utils

-
- -
-

- Utils -

- -
- -
-
- - - - -
-

new Utils()

- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:27:23 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/module-Phaser.html b/docs2/out/module-Phaser.html deleted file mode 100644 index 5017475c..00000000 --- a/docs2/out/module-Phaser.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - - Phaser Module: Phaser - - - - - - - - - - -
- - -
- - -
- -
- - - -

Module: Phaser

-
- -
-

- Phaser -

- -
- -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:47:48 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/module-Tween-Phaser.Tween.html b/docs2/out/module-Tween-Phaser.Tween.html deleted file mode 100644 index f5a017d4..00000000 --- a/docs2/out/module-Tween-Phaser.Tween.html +++ /dev/null @@ -1,1070 +0,0 @@ - - - - - - Phaser Class: Tween - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: Tween

-
- -
-

- Tween -

- -

Tween

- -
- -
-
- - - - -
-

new Tween(object, game)

- - -
-
- - -
-

Tween constructor -Create a new <code>Tween</code>.

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
object - - -object - - - -

Target object will be affected by this tween.

game - - -Phaser.Game - - - -

Current game instance.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

game

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running Game.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

isRunning

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
isRunning - - -boolean - - - -

Description.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

onComplete

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
onComplete - - -Phaser.Signal - - - -

Description.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

onStart

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
onStart - - -Phaser.Signal - - - -

Description.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

pendingDelete

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
pendingDelete - - -boolean - - - -

If this tween is ready to be deleted by the TweenManager.

-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:53:32 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/module-Tween-Phaser.TweenManager.html b/docs2/out/module-Tween-Phaser.TweenManager.html deleted file mode 100644 index 8d742af3..00000000 --- a/docs2/out/module-Tween-Phaser.TweenManager.html +++ /dev/null @@ -1,746 +0,0 @@ - - - - - - Phaser Class: TweenManager - - - - - - - - - - -
- - -
- - -
- -
- - - -

Class: TweenManager

-
- -
-

- TweenManager -

- -

Phaser.Game has a single instance of the TweenManager through which all Tween objects are created and updated. -Tweens are hooked into the game clock and pause system, adjusting based on the game state.

-

TweenManager is based heavily on tween.js by http://soledadpenades.com. -The difference being that tweens belong to a games instance of TweenManager, rather than to a global TWEEN object. -It also has callbacks swapped for Signals and a few issues patched with regard to properties and completion errors. -Please see https://github.com/sole/tween.js for a full list of contributors.

- -
- -
-
- - - - -
-

new TweenManager(game)

- - -
-
- - -
-

Phaser - TweenManager

-
- - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

A reference to the currently running game.

- - - - -
- - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-

game

- - -
-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
game - - -Phaser.Game - - - -

Local reference to game.

-
- - - - - - - - - - - - - - - - - - - - -
Source:
-
- - - - - - - -
- - - -
- - - -
-

REVISION

- - -
-
- -
-

Version number of this library.

-
- - - - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
REVISION - - -string - - - -
-
- - - - - - - - - - - - - - - - - - -
Default Value:
-
  • "11dev"
- - - -
Source:
-
- - - - - - - -
- - - -
- -
- - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/module-Tween.html b/docs2/out/module-Tween.html deleted file mode 100644 index 7c241474..00000000 --- a/docs2/out/module-Tween.html +++ /dev/null @@ -1,458 +0,0 @@ - - - - - - Phaser Module: Tween - - - - - - - - - - -
- - -
- - -
- -
- - - -

Module: Tween

-
- -
-

- Tween -

- -
- -
-
- - - - - - -
- - - - - - - - - - - -
Author:
-
- -
- - - - - - - - -
License:
-
- - - - - -
Source:
-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 01:56:58 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/modules.list.html b/docs2/out/modules.list.html deleted file mode 100644 index 9a1416c1..00000000 --- a/docs2/out/modules.list.html +++ /dev/null @@ -1,676 +0,0 @@ - - - - - - Phaser Modules - - - - - - - - - - -
- - -
- - -
- -
- - - -

Modules

-
- -
-

- -

- -
- -
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - -

Classes

- -
-
Animation
-
- -
AnimationManager
-
- -
AnimationParser
-
- -
Cache
-
- -
Camera
-
- -
Canvas
-
- -
Circle
-
- -
Color
-
- -
Device
-
- -
Easing
-
- -
Back
-
- -
Bounce
-
- -
Circular
-
- -
Cubic
-
- -
Elastic
-
- -
Exponential
-
- -
Linear
-
- -
Quadratic
-
- -
Quartic
-
- -
Quintic
-
- -
Sinusoidal
-
- -
Frame
-
- -
FrameData
-
- -
Game
-
- -
Group
-
- -
Input
-
- -
InputHandler
-
- -
Key
-
- -
Keyboard
-
- -
LinkedList
-
- -
Loader
-
- -
LoaderParser
-
- -
Math
-
- -
Mouse
-
- -
MSPointer
-
- -
Net
-
- -
Particles
-
- -
Emitter
-
- -
Plugin
-
- -
PluginManager
-
- -
Point
-
- -
Pointer
-
- -
QuadTree
-
- -
RandomDataGenerator
-
- -
Rectangle
-
- -
RequestAnimationFrame
-
- -
Signal
-
- -
Sound
-
- -
SoundManager
-
- -
Stage
-
- -
StageScaleMode
-
- -
State
-
- -
StateManager
-
- -
Time
-
- -
Touch
-
- -
Tween
-
- -
TweenManager
-
- -
Debug
-
- -
World
-
- -
SignalBinding
-
- -
Utils
-
-
- - - -

Namespaces

- -
-
Phaser
-
-
- - - - - - - - - -
- -
- - - - -
- -
-
- - - - Phaser Copyright © 2012-2013 Photon Storm Ltd. - -
- - - Documentation generated by JSDoc 3.2.0-dev - on Thu Oct 03 2013 02:27:17 GMT+0100 (BST) using the DocStrap template. - -
-
- - -
-
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs2/out/scripts/linenumber.js b/docs2/out/scripts/linenumber.js deleted file mode 100644 index a0c570d5..00000000 --- a/docs2/out/scripts/linenumber.js +++ /dev/null @@ -1,17 +0,0 @@ -(function() { - var counter = 0; - var numbered; - var source = document.getElementsByClassName('prettyprint source'); - - if (source && source[0]) { - source = source[0].getElementsByTagName('code')[0]; - - numbered = source.innerHTML.split('\n'); - numbered = numbered.map(function(item) { - counter++; - return '' + item; - }); - - source.innerHTML = numbered.join('\n'); - } -})(); diff --git a/docs2/out/styles/jsdoc-default.css b/docs2/out/styles/jsdoc-default.css deleted file mode 100644 index ea49f607..00000000 --- a/docs2/out/styles/jsdoc-default.css +++ /dev/null @@ -1,283 +0,0 @@ -html -{ - overflow: auto; - background-color: #fff; -} - -body -{ - font: 14px "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans serif; - line-height: 130%; - color: #000; - background-color: #fff; -} - -a { - color: #444; -} - -a:visited { - color: #444; -} - -a:active { - color: #444; -} - -header -{ - display: block; - padding: 6px 4px; -} - -.class-description { - font-style: italic; - font-family: Palatino, 'Palatino Linotype', serif; - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -#main { - float: left; - width: 100%; -} - -section -{ - display: block; - - background-color: #fff; - padding: 12px 24px; - border-bottom: 1px solid #ccc; - margin-right: 240px; -} - -.variation { - display: none; -} - -.optional:after { - content: "opt"; - font-size: 60%; - color: #aaa; - font-style: italic; - font-weight: lighter; -} - -nav -{ - display: block; - float: left; - margin-left: -230px; - margin-top: 28px; - width: 220px; - border-left: 1px solid #ccc; - padding-left: 9px; -} - -nav ul { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; - font-size: 100%; - line-height: 17px; - padding:0; - margin:0; - list-style-type:none; -} - -nav h2 a, nav h2 a:visited { - color: #A35A00; - text-decoration: none; -} - -nav h3 { - margin-top: 12px; -} - -nav li { - margin-top: 6px; -} - -nav a { - color: #5C5954; -} - -nav a:visited { - color: #5C5954; -} - -nav a:active { - color: #5C5954; -} - -footer { - display: block; - padding: 6px; - margin-top: 12px; - font-style: italic; - font-size: 90%; -} - -h1 -{ - font-size: 200%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 6px 0 9px 0; -} - -h2 -{ - font-size: 170%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; -} - -h3 -{ - font-size: 150%; - font-weight: bold; - letter-spacing: -0.01em; - margin-top: 16px; - margin: 6px 0 3px 0; -} - -h4 -{ - font-size: 130%; - font-weight: bold; - letter-spacing: -0.01em; - margin-top: 16px; - margin: 18px 0 3px 0; - color: #A35A00; -} - -h5, .container-overview .subsection-title -{ - font-size: 120%; - font-weight: bold; - letter-spacing: -0.01em; - margin: 8px 0 3px -16px; -} - -h6 -{ - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -.ancestors { color: #999; } -.ancestors a -{ - color: #999 !important; - text-decoration: none; -} - -.important -{ - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: Consolas, "Lucida Console", Monaco, monospace; -} - -.details { margin-top: 14px; } -.details dt { width:100px; float:left; border-left: 2px solid #DDD; padding-left: 10px; padding-top: 6px; } -.details dd { margin-left: 50px; } -.details ul { margin: 0; } -.details ul { list-style-type: none; } -.details li { margin-left: 30px; padding-top: 6px; } - -.description { - margin-bottom: 1em; - margin-left: -16px; - margin-top: 1em; -} - -.code-caption -{ - font-style: italic; - font-family: Palatino, 'Palatino Linotype', serif; - font-size: 107%; - margin: 0; -} - -.prettyprint -{ - border: 1px solid #ddd; - width: 80%; - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.prettyprint code -{ - font-family: Consolas, 'Lucida Console', Monaco, monospace; - font-size: 100%; - line-height: 18px; - display: block; - padding: 4px 12px; - margin: 0; - background-color: #fff; - color: #000; - border-left: 3px #ddd solid; -} - -.params, .props -{ - border-spacing: 0; - border: 0; - border-collapse: collapse; -} - -.params .name, .props .name, .name code { - color: #A35A00; - font-family: Consolas, 'Lucida Console', Monaco, monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th -{ - border: 1px solid #ddd; - margin: 0px; - text-align: left; - vertical-align: top; - padding: 4px 6px; - display: table-cell; -} - -.params thead tr, .props thead tr -{ - background-color: #ddd; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr -{ - background-color: #fff; - font-weight: bold; -} - -.params th, .props th { border-right: 1px solid #aaa; } -.params thead .last, .props thead .last { border-right: 1px solid #ddd; } - -.disabled { - color: #454545; -} diff --git a/docs2/out/styles/prettify-jsdoc.css b/docs2/out/styles/prettify-jsdoc.css deleted file mode 100644 index 5a2526e3..00000000 --- a/docs2/out/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs2/tags.txt b/docs2/tags.txt deleted file mode 100644 index 3a300098..00000000 --- a/docs2/tags.txt +++ /dev/null @@ -1,47 +0,0 @@ -/** -* @author Richard Davey -* @copyright 2013 Photon Storm Ltd. -* @license https://github.com/photonstorm/phaser/blob/master/license.txt MIT License -* @module Phaser -*/ - -/** -* The class constructor -* -* @class Name -* @constructor -* @param {Phaser.Game} game A reference to the currently running game. -*/ - -/** -* A reference to the currently running Game. -* @property game -* @type {Phaser.Game} -*/ -public game: Phaser.Game; - -/** -* My method description. Like other pieces of your comment blocks, -* this can span multiple lines. -* -* @method methodName -* @param {String} foo Argument 1 -* @param {Object} config A config object -* @param {String} config.name The name on the config object -* @param {Function} config.callback A callback function on the config object -* @param {Boolean} [extra=false] Do extra, optional work -* @return {Boolean} Returns true on success -*/ - -/** -* Property description. -* -* @property propertyName -* @public @private -* @type {Object} -* @default "foo" -*/ - -@param {Type} Name Description -Object, Array, String, Boolean, Number, Mixed, MyType - diff --git a/plugins2/CSS3Filters.js b/plugins/CSS3Filters.js similarity index 100% rename from plugins2/CSS3Filters.js rename to plugins/CSS3Filters.js diff --git a/plugins2/ColorHarmony.js b/plugins/ColorHarmony.js similarity index 100% rename from plugins2/ColorHarmony.js rename to plugins/ColorHarmony.js diff --git a/plugins2/SamplePlugin.js b/plugins/SamplePlugin.js similarity index 100% rename from plugins2/SamplePlugin.js rename to plugins/SamplePlugin.js diff --git a/docs2/Phaser Logo/2D Text/Phaser Logo 2D Vector Outline.fla b/resources/Phaser Logo/2D Text/Phaser Logo 2D Vector Outline.fla similarity index 100% rename from docs2/Phaser Logo/2D Text/Phaser Logo 2D Vector Outline.fla rename to resources/Phaser Logo/2D Text/Phaser Logo 2D Vector Outline.fla diff --git a/docs2/Phaser Logo/PNG/Phaser Logo Print Quality.png b/resources/Phaser Logo/PNG/Phaser Logo Print Quality.png similarity index 100% rename from docs2/Phaser Logo/PNG/Phaser Logo Print Quality.png rename to resources/Phaser Logo/PNG/Phaser Logo Print Quality.png diff --git a/docs2/Phaser Logo/PNG/Phaser Logo Web Quality.png b/resources/Phaser Logo/PNG/Phaser Logo Web Quality.png similarity index 100% rename from docs2/Phaser Logo/PNG/Phaser Logo Web Quality.png rename to resources/Phaser Logo/PNG/Phaser Logo Web Quality.png diff --git a/docs2/Phaser Logo/PNG/Phaser Logo iPad Resolution.png b/resources/Phaser Logo/PNG/Phaser Logo iPad Resolution.png similarity index 100% rename from docs2/Phaser Logo/PNG/Phaser Logo iPad Resolution.png rename to resources/Phaser Logo/PNG/Phaser Logo iPad Resolution.png diff --git a/docs2/Phaser Logo/PNG/Phaser-Logo-Small.png b/resources/Phaser Logo/PNG/Phaser-Logo-Small.png similarity index 100% rename from docs2/Phaser Logo/PNG/Phaser-Logo-Small.png rename to resources/Phaser Logo/PNG/Phaser-Logo-Small.png diff --git a/docs2/Phaser Logo/Pixel Art/Phaser-Logo-Sizes.png b/resources/Phaser Logo/Pixel Art/Phaser-Logo-Sizes.png similarity index 100% rename from docs2/Phaser Logo/Pixel Art/Phaser-Logo-Sizes.png rename to resources/Phaser Logo/Pixel Art/Phaser-Logo-Sizes.png diff --git a/docs2/Phaser Logo/Pixel Art/phaser_pixel_large_shaded.png b/resources/Phaser Logo/Pixel Art/phaser_pixel_large_shaded.png similarity index 100% rename from docs2/Phaser Logo/Pixel Art/phaser_pixel_large_shaded.png rename to resources/Phaser Logo/Pixel Art/phaser_pixel_large_shaded.png diff --git a/docs2/Phaser Logo/Pixel Art/phaser_pixel_medium_flat.png b/resources/Phaser Logo/Pixel Art/phaser_pixel_medium_flat.png similarity index 100% rename from docs2/Phaser Logo/Pixel Art/phaser_pixel_medium_flat.png rename to resources/Phaser Logo/Pixel Art/phaser_pixel_medium_flat.png diff --git a/docs2/Phaser Logo/Pixel Art/phaser_pixel_medium_shaded.png b/resources/Phaser Logo/Pixel Art/phaser_pixel_medium_shaded.png similarity index 100% rename from docs2/Phaser Logo/Pixel Art/phaser_pixel_medium_shaded.png rename to resources/Phaser Logo/Pixel Art/phaser_pixel_medium_shaded.png diff --git a/docs2/Phaser Logo/Pixel Art/phaser_pixel_small_flat.png b/resources/Phaser Logo/Pixel Art/phaser_pixel_small_flat.png similarity index 100% rename from docs2/Phaser Logo/Pixel Art/phaser_pixel_small_flat.png rename to resources/Phaser Logo/Pixel Art/phaser_pixel_small_flat.png diff --git a/docs2/Phaser Logo/Vector/Phaser Logo.eps b/resources/Phaser Logo/Vector/Phaser Logo.eps similarity index 100% rename from docs2/Phaser Logo/Vector/Phaser Logo.eps rename to resources/Phaser Logo/Vector/Phaser Logo.eps diff --git a/docs2/Phaser Logo/Vector/Phaser Logo.fla b/resources/Phaser Logo/Vector/Phaser Logo.fla similarity index 100% rename from docs2/Phaser Logo/Vector/Phaser Logo.fla rename to resources/Phaser Logo/Vector/Phaser Logo.fla diff --git a/docs2/Screen Shots/phaser-cybernoid.png b/resources/Screen Shots/phaser-cybernoid.png similarity index 100% rename from docs2/Screen Shots/phaser-cybernoid.png rename to resources/Screen Shots/phaser-cybernoid.png diff --git a/docs2/Screen Shots/phaser_balls.png b/resources/Screen Shots/phaser_balls.png similarity index 100% rename from docs2/Screen Shots/phaser_balls.png rename to resources/Screen Shots/phaser_balls.png diff --git a/docs2/Screen Shots/phaser_blaster.png b/resources/Screen Shots/phaser_blaster.png similarity index 100% rename from docs2/Screen Shots/phaser_blaster.png rename to resources/Screen Shots/phaser_blaster.png diff --git a/docs2/Screen Shots/phaser_cams.png b/resources/Screen Shots/phaser_cams.png similarity index 100% rename from docs2/Screen Shots/phaser_cams.png rename to resources/Screen Shots/phaser_cams.png diff --git a/docs2/Screen Shots/phaser_desert.png b/resources/Screen Shots/phaser_desert.png similarity index 100% rename from docs2/Screen Shots/phaser_desert.png rename to resources/Screen Shots/phaser_desert.png diff --git a/docs2/Screen Shots/phaser_fixed_camera.png b/resources/Screen Shots/phaser_fixed_camera.png similarity index 100% rename from docs2/Screen Shots/phaser_fixed_camera.png rename to resources/Screen Shots/phaser_fixed_camera.png diff --git a/docs2/Screen Shots/phaser_fruit.png b/resources/Screen Shots/phaser_fruit.png similarity index 100% rename from docs2/Screen Shots/phaser_fruit.png rename to resources/Screen Shots/phaser_fruit.png diff --git a/docs2/Screen Shots/phaser_fruit_particles.png b/resources/Screen Shots/phaser_fruit_particles.png similarity index 100% rename from docs2/Screen Shots/phaser_fruit_particles.png rename to resources/Screen Shots/phaser_fruit_particles.png diff --git a/docs2/Screen Shots/phaser_mapdraw.png b/resources/Screen Shots/phaser_mapdraw.png similarity index 100% rename from docs2/Screen Shots/phaser_mapdraw.png rename to resources/Screen Shots/phaser_mapdraw.png diff --git a/docs2/Screen Shots/phaser_mario_combo.png b/resources/Screen Shots/phaser_mario_combo.png similarity index 100% rename from docs2/Screen Shots/phaser_mario_combo.png rename to resources/Screen Shots/phaser_mario_combo.png diff --git a/docs2/Screen Shots/phaser_particles.png b/resources/Screen Shots/phaser_particles.png similarity index 100% rename from docs2/Screen Shots/phaser_particles.png rename to resources/Screen Shots/phaser_particles.png diff --git a/docs2/Screen Shots/phaser_platformer.png b/resources/Screen Shots/phaser_platformer.png similarity index 100% rename from docs2/Screen Shots/phaser_platformer.png rename to resources/Screen Shots/phaser_platformer.png diff --git a/docs2/Screen Shots/phaser_quadtree.png b/resources/Screen Shots/phaser_quadtree.png similarity index 100% rename from docs2/Screen Shots/phaser_quadtree.png rename to resources/Screen Shots/phaser_quadtree.png diff --git a/docs2/Screen Shots/phaser_rotate4.png b/resources/Screen Shots/phaser_rotate4.png similarity index 100% rename from docs2/Screen Shots/phaser_rotate4.png rename to resources/Screen Shots/phaser_rotate4.png diff --git a/docs2/Screen Shots/phaser_scrollfactor.png b/resources/Screen Shots/phaser_scrollfactor.png similarity index 100% rename from docs2/Screen Shots/phaser_scrollfactor.png rename to resources/Screen Shots/phaser_scrollfactor.png diff --git a/docs2/Screen Shots/phaser_sprite_bounds.png b/resources/Screen Shots/phaser_sprite_bounds.png similarity index 100% rename from docs2/Screen Shots/phaser_sprite_bounds.png rename to resources/Screen Shots/phaser_sprite_bounds.png diff --git a/docs2/Screen Shots/phaser_tanks.png b/resources/Screen Shots/phaser_tanks.png similarity index 100% rename from docs2/Screen Shots/phaser_tanks.png rename to resources/Screen Shots/phaser_tanks.png diff --git a/docs2/Screen Shots/phaser_tilemap.png b/resources/Screen Shots/phaser_tilemap.png similarity index 100% rename from docs2/Screen Shots/phaser_tilemap.png rename to resources/Screen Shots/phaser_tilemap.png diff --git a/docs2/Screen Shots/phaser_tilemap_collision.png b/resources/Screen Shots/phaser_tilemap_collision.png similarity index 100% rename from docs2/Screen Shots/phaser_tilemap_collision.png rename to resources/Screen Shots/phaser_tilemap_collision.png diff --git a/docs2/Screen Shots/phaser_tilemap_debug.png b/resources/Screen Shots/phaser_tilemap_debug.png similarity index 100% rename from docs2/Screen Shots/phaser_tilemap_debug.png rename to resources/Screen Shots/phaser_tilemap_debug.png diff --git a/docs2/WIP/01_phaser-arcade.jpg b/resources/wip/01_phaser-arcade.jpg similarity index 100% rename from docs2/WIP/01_phaser-arcade.jpg rename to resources/wip/01_phaser-arcade.jpg diff --git a/docs2/WIP/02_phaser-newsletter.jpg b/resources/wip/02_phaser-newsletter.jpg similarity index 100% rename from docs2/WIP/02_phaser-newsletter.jpg rename to resources/wip/02_phaser-newsletter.jpg diff --git a/docs2/WIP/Physics Comparison.xlsx b/resources/wip/Physics Comparison.xlsx similarity index 100% rename from docs2/WIP/Physics Comparison.xlsx rename to resources/wip/Physics Comparison.xlsx diff --git a/docs2/WIP/phaser-manual_2013-08-27.pdf b/resources/wip/phaser-manual_2013-08-27.pdf similarity index 100% rename from docs2/WIP/phaser-manual_2013-08-27.pdf rename to resources/wip/phaser-manual_2013-08-27.pdf diff --git a/docs2/WIP/phaser_copy.doc b/resources/wip/phaser_copy.doc similarity index 100% rename from docs2/WIP/phaser_copy.doc rename to resources/wip/phaser_copy.doc diff --git a/docs2/WIP/phaser_onscreen-controls_1-arcade.png b/resources/wip/phaser_onscreen-controls_1-arcade.png similarity index 100% rename from docs2/WIP/phaser_onscreen-controls_1-arcade.png rename to resources/wip/phaser_onscreen-controls_1-arcade.png diff --git a/docs2/WIP/phaser_onscreen-controls_2-dpad.png b/resources/wip/phaser_onscreen-controls_2-dpad.png similarity index 100% rename from docs2/WIP/phaser_onscreen-controls_2-dpad.png rename to resources/wip/phaser_onscreen-controls_2-dpad.png diff --git a/docs2/WIP/phaser_onscreen-controls_3-generic.png b/resources/wip/phaser_onscreen-controls_3-generic.png similarity index 100% rename from docs2/WIP/phaser_onscreen-controls_3-generic.png rename to resources/wip/phaser_onscreen-controls_3-generic.png diff --git a/docs2/Resources/avoid-digits.png b/resources/wip/sprites/avoid-digits.png similarity index 100% rename from docs2/Resources/avoid-digits.png rename to resources/wip/sprites/avoid-digits.png diff --git a/docs2/Resources/avoid-panel.png b/resources/wip/sprites/avoid-panel.png similarity index 100% rename from docs2/Resources/avoid-panel.png rename to resources/wip/sprites/avoid-panel.png diff --git a/docs2/Resources/avoid-sheet.png b/resources/wip/sprites/avoid-sheet.png similarity index 100% rename from docs2/Resources/avoid-sheet.png rename to resources/wip/sprites/avoid-sheet.png diff --git a/docs2/Resources/avoidmock4x2.png b/resources/wip/sprites/avoidmock4x2.png similarity index 100% rename from docs2/Resources/avoidmock4x2.png rename to resources/wip/sprites/avoidmock4x2.png diff --git a/docs2/Resources/box-01.png b/resources/wip/sprites/box-01.png similarity index 100% rename from docs2/Resources/box-01.png rename to resources/wip/sprites/box-01.png diff --git a/docs2/Resources/box-02.png b/resources/wip/sprites/box-02.png similarity index 100% rename from docs2/Resources/box-02.png rename to resources/wip/sprites/box-02.png diff --git a/docs2/Resources/breakout2c.png b/resources/wip/sprites/breakout2c.png similarity index 100% rename from docs2/Resources/breakout2c.png rename to resources/wip/sprites/breakout2c.png diff --git a/docs2/Resources/phaser checkboxes.gif b/resources/wip/sprites/phaser checkboxes.gif similarity index 100% rename from docs2/Resources/phaser checkboxes.gif rename to resources/wip/sprites/phaser checkboxes.gif diff --git a/docs2/Resources/phaser power tools.gif b/resources/wip/sprites/phaser power tools.gif similarity index 100% rename from docs2/Resources/phaser power tools.gif rename to resources/wip/sprites/phaser power tools.gif diff --git a/docs2/Resources/phaser sprites10.gif b/resources/wip/sprites/phaser sprites10.gif similarity index 100% rename from docs2/Resources/phaser sprites10.gif rename to resources/wip/sprites/phaser sprites10.gif diff --git a/docs2/zwoptex-phaser.template b/resources/zwoptex-phaser.template similarity index 100% rename from docs2/zwoptex-phaser.template rename to resources/zwoptex-phaser.template diff --git a/wip/physics/AdvancedPhysics.js b/wip/physics/AdvancedPhysics.js deleted file mode 100644 index b65b373d..00000000 --- a/wip/physics/AdvancedPhysics.js +++ /dev/null @@ -1,269 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /** - * Phaser - Physics Manager - * - * The Physics Manager is responsible for looking after, creating and colliding - * all of the physics bodies and joints in the world. - */ - (function (Physics) { - var AdvancedPhysics = (function () { - function AdvancedPhysics(game) { - this.lastTime = Date.now(); - this.frameRateHz = 60; - this.timeDelta = 0; - this.paused = false; - this.step = false; - // step through the simulation (i.e. per click) - //public paused: bool = true; - //public step: bool = false; // step through the simulation (i.e. per click) - this.velocityIterations = 8; - this.positionIterations = 4; - this.allowSleep = true; - this.warmStarting = true; - this.game = game; - this.gravity = new Phaser.Vec2(); - this.space = new Physics.Space(this); - this.collision = new Physics.Collision(); - } - AdvancedPhysics.clear = function clear() { - //Manager.debug.textContent = ""; - Physics.Manager.log = []; - }; - AdvancedPhysics.write = function write(s) { - //Manager.debug.textContent += s + "\n"; - }; - AdvancedPhysics.writeAll = function writeAll() { - for(var i = 0; i < Physics.Manager.log.length; i++) { - //Manager.debug.textContent += Manager.log[i]; - } - }; - AdvancedPhysics.log = []; - AdvancedPhysics.dump = function dump(phase, body) { - /* - var s = "\n\nPhase: " + phase + "\n"; - s += "Position: " + body.position.toString() + "\n"; - s += "Velocity: " + body.velocity.toString() + "\n"; - s += "Angle: " + body.angle + "\n"; - s += "Force: " + body.force.toString() + "\n"; - s += "Torque: " + body.torque + "\n"; - s += "Bounds: " + body.bounds.toString() + "\n"; - s += "Shape ***\n"; - s += "Vert 0: " + body.shapes[0].verts[0].toString() + "\n"; - s += "Vert 1: " + body.shapes[0].verts[1].toString() + "\n"; - s += "Vert 2: " + body.shapes[0].verts[2].toString() + "\n"; - s += "Vert 3: " + body.shapes[0].verts[3].toString() + "\n"; - s += "TVert 0: " + body.shapes[0].tverts[0].toString() + "\n"; - s += "TVert 1: " + body.shapes[0].tverts[1].toString() + "\n"; - s += "TVert 2: " + body.shapes[0].tverts[2].toString() + "\n"; - s += "TVert 3: " + body.shapes[0].tverts[3].toString() + "\n"; - s += "Plane 0: " + body.shapes[0].planes[0].normal.toString() + "\n"; - s += "Plane 1: " + body.shapes[0].planes[1].normal.toString() + "\n"; - s += "Plane 2: " + body.shapes[0].planes[2].normal.toString() + "\n"; - s += "Plane 3: " + body.shapes[0].planes[3].normal.toString() + "\n"; - s += "TPlane 0: " + body.shapes[0].tplanes[0].normal.toString() + "\n"; - s += "TPlane 1: " + body.shapes[0].tplanes[1].normal.toString() + "\n"; - s += "TPlane 2: " + body.shapes[0].tplanes[2].normal.toString() + "\n"; - s += "TPlane 3: " + body.shapes[0].tplanes[3].normal.toString() + "\n"; - - Manager.log.push(s); - */ - }; - AdvancedPhysics.SHAPE_TYPE_CIRCLE = 0; - AdvancedPhysics.SHAPE_TYPE_SEGMENT = 1; - AdvancedPhysics.SHAPE_TYPE_POLY = 2; - AdvancedPhysics.SHAPE_NUM_TYPES = 3; - AdvancedPhysics.JOINT_TYPE_ANGLE = 0; - AdvancedPhysics.JOINT_TYPE_REVOLUTE = 1; - AdvancedPhysics.JOINT_TYPE_WELD = 2; - AdvancedPhysics.JOINT_TYPE_WHEEL = 3; - AdvancedPhysics.JOINT_TYPE_PRISMATIC = 4; - AdvancedPhysics.JOINT_TYPE_DISTANCE = 5; - AdvancedPhysics.JOINT_TYPE_ROPE = 6; - AdvancedPhysics.JOINT_TYPE_MOUSE = 7; - AdvancedPhysics.JOINT_LINEAR_SLOP = 0.0008; - AdvancedPhysics.JOINT_ANGULAR_SLOP = 2 * 0.017453292519943294444444444444444; - AdvancedPhysics.JOINT_MAX_LINEAR_CORRECTION = 0.5; - AdvancedPhysics.JOINT_MAX_ANGULAR_CORRECTION = 8 * 0.017453292519943294444444444444444; - AdvancedPhysics.JOINT_LIMIT_STATE_INACTIVE = 0; - AdvancedPhysics.JOINT_LIMIT_STATE_AT_LOWER = 1; - AdvancedPhysics.JOINT_LIMIT_STATE_AT_UPPER = 2; - AdvancedPhysics.JOINT_LIMIT_STATE_EQUAL_LIMITS = 3; - AdvancedPhysics.CONTACT_SOLVER_COLLISION_SLOP = 0.0008; - AdvancedPhysics.CONTACT_SOLVER_BAUMGARTE = 0.28; - AdvancedPhysics.CONTACT_SOLVER_MAX_LINEAR_CORRECTION = 1; - AdvancedPhysics.bodyCounter = 0; - AdvancedPhysics.jointCounter = 0; - AdvancedPhysics.shapeCounter = 0; - AdvancedPhysics.prototype.update = function () { - // Get these from Phaser.Time instead - var time = Date.now(); - var frameTime = (time - this.lastTime) / 1000; - this.lastTime = time; - // if rAf - why? - frameTime = Math.floor(frameTime * 60 + 0.5) / 60; - //if (!mouseDown) - //{ - // var p = canvasToWorld(mousePosition); - // var body = space.findBodyByPoint(p); - // //domCanvas.style.cursor = body ? "pointer" : "default"; - //} - if(!this.paused || this.step) { - Physics.Manager.clear(); - var h = 1 / this.frameRateHz; - this.timeDelta += frameTime; - if(this.step) { - this.step = false; - this.timeDelta = h; - } - for(var maxSteps = 4; maxSteps > 0 && this.timeDelta >= h; maxSteps--) { - this.space.step(h, this.velocityIterations, this.positionIterations, this.warmStarting, this.allowSleep); - this.timeDelta -= h; - } - if(this.timeDelta > h) { - this.timeDelta = 0; - } - } - //frameCount++; - }; - AdvancedPhysics.prototype.addBody = function (body) { - this.space.addBody(body); - }; - AdvancedPhysics.prototype.removeBody = function (body) { - this.space.removeBody(body); - }; - AdvancedPhysics.prototype.addJoint = function (joint) { - this.space.addJoint(joint); - }; - AdvancedPhysics.prototype.removeJoint = function (joint) { - this.space.removeJoint(joint); - }; - AdvancedPhysics.prototype.pixelsToMeters = function (value) { - return value * 0.02; - }; - AdvancedPhysics.prototype.metersToPixels = function (value) { - return value * 50; - }; - AdvancedPhysics.pixelsToMeters = function pixelsToMeters(value) { - return value * 0.02; - }; - AdvancedPhysics.metersToPixels = function metersToPixels(value) { - return value * 50; - }; - AdvancedPhysics.p2m = function p2m(value) { - return value * 0.02; - }; - AdvancedPhysics.m2p = function m2p(value) { - return value * 50; - }; - AdvancedPhysics.areaForCircle = function areaForCircle(radius_outer, radius_inner) { - return Math.PI * (radius_outer * radius_outer - radius_inner * radius_inner); - }; - AdvancedPhysics.inertiaForCircle = function inertiaForCircle(mass, center, radius_outer, radius_inner) { - return mass * ((radius_outer * radius_outer + radius_inner * radius_inner) * 0.5 + center.lengthSq()); - }; - AdvancedPhysics.areaForSegment = function areaForSegment(a, b, radius) { - return radius * (Math.PI * radius + 2 * Phaser.Vec2Utils.distance(a, b)); - }; - AdvancedPhysics.centroidForSegment = function centroidForSegment(a, b) { - return Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(a, b), 0.5); - }; - AdvancedPhysics.inertiaForSegment = function inertiaForSegment(mass, a, b) { - var distsq = Phaser.Vec2Utils.distanceSq(b, a); - var offset = Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(a, b), 0.5); - return mass * (distsq / 12 + offset.lengthSq()); - }; - AdvancedPhysics.areaForPoly = function areaForPoly(verts) { - var area = 0; - for(var i = 0; i < verts.length; i++) { - area += Phaser.Vec2Utils.cross(verts[i], verts[(i + 1) % verts.length]); - } - return area / 2; - }; - AdvancedPhysics.centroidForPoly = function centroidForPoly(verts) { - var area = 0; - var vsum = new Phaser.Vec2(); - for(var i = 0; i < verts.length; i++) { - var v1 = verts[i]; - var v2 = verts[(i + 1) % verts.length]; - var cross = Phaser.Vec2Utils.cross(v1, v2); - area += cross; - // SO many vecs created here - unroll these bad boys - vsum.add(Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(v1, v2), cross)); - } - return Phaser.Vec2Utils.scale(vsum, 1 / (3 * area)); - }; - AdvancedPhysics.inertiaForPoly = function inertiaForPoly(mass, verts, offset) { - var sum1 = 0; - var sum2 = 0; - for(var i = 0; i < verts.length; i++) { - var v1 = Phaser.Vec2Utils.add(verts[i], offset); - var v2 = Phaser.Vec2Utils.add(verts[(i + 1) % verts.length], offset); - var a = Phaser.Vec2Utils.cross(v2, v1); - var b = Phaser.Vec2Utils.dot(v1, v1) + Phaser.Vec2Utils.dot(v1, v2) + Phaser.Vec2Utils.dot(v2, v2); - sum1 += a * b; - sum2 += a; - } - return (mass * sum1) / (6 * sum2); - }; - AdvancedPhysics.inertiaForBox = function inertiaForBox(mass, w, h) { - return mass * (w * w + h * h) / 12; - }; - AdvancedPhysics.createConvexHull = // Create the convex hull using the Gift wrapping algorithm (http://en.wikipedia.org/wiki/Gift_wrapping_algorithm) - function createConvexHull(points) { - // Find the right most point on the hull - var i0 = 0; - var x0 = points[0].x; - for(var i = 1; i < points.length; i++) { - var x = points[i].x; - if(x > x0 || (x == x0 && points[i].y < points[i0].y)) { - i0 = i; - x0 = x; - } - } - var n = points.length; - var hull = []; - var m = 0; - var ih = i0; - while(1) { - hull[m] = ih; - var ie = 0; - for(var j = 1; j < n; j++) { - if(ie == ih) { - ie = j; - continue; - } - var r = Phaser.Vec2Utils.subtract(points[ie], points[hull[m]]); - var v = Phaser.Vec2Utils.subtract(points[j], points[hull[m]]); - var c = Phaser.Vec2Utils.cross(r, v); - if(c < 0) { - ie = j; - } - // Collinearity check - if(c == 0 && v.lengthSq() > r.lengthSq()) { - ie = j; - } - } - m++; - ih = ie; - if(ie == i0) { - break; - } - } - // Copy vertices - var newPoints = []; - for(var i = 0; i < m; ++i) { - newPoints.push(points[hull[i]]); - } - return newPoints; - }; - return AdvancedPhysics; - })(); - Physics.AdvancedPhysics = AdvancedPhysics; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/AdvancedPhysics.ts b/wip/physics/AdvancedPhysics.ts deleted file mode 100644 index c4010e83..00000000 --- a/wip/physics/AdvancedPhysics.ts +++ /dev/null @@ -1,386 +0,0 @@ -/// -/// -/// -/// - -/** -* Phaser - Physics Manager -* -* The Physics Manager is responsible for looking after, creating and colliding -* all of the physics bodies and joints in the world. -*/ - -module Phaser.Physics { - - export class AdvancedPhysics { - - constructor(game: Game) { - - this.game = game; - - this.gravity = new Phaser.Vec2; - - this.space = new Space(this); - - this.collision = new Collision(); - - } - - public collision; - - /** - * Local reference to Game. - */ - public game: Game; - - public static debug: HTMLTextAreaElement; - - public static clear() { - //Manager.debug.textContent = ""; - Manager.log = []; - } - - public static write(s: string) { - //Manager.debug.textContent += s + "\n"; - } - - public static writeAll() { - - for (var i = 0; i < Manager.log.length; i++) - { - //Manager.debug.textContent += Manager.log[i]; - } - - } - - public static log = []; - - public static dump(phase: string, body: Body) { - - /* - var s = "\n\nPhase: " + phase + "\n"; - s += "Position: " + body.position.toString() + "\n"; - s += "Velocity: " + body.velocity.toString() + "\n"; - s += "Angle: " + body.angle + "\n"; - s += "Force: " + body.force.toString() + "\n"; - s += "Torque: " + body.torque + "\n"; - s += "Bounds: " + body.bounds.toString() + "\n"; - s += "Shape ***\n"; - s += "Vert 0: " + body.shapes[0].verts[0].toString() + "\n"; - s += "Vert 1: " + body.shapes[0].verts[1].toString() + "\n"; - s += "Vert 2: " + body.shapes[0].verts[2].toString() + "\n"; - s += "Vert 3: " + body.shapes[0].verts[3].toString() + "\n"; - s += "TVert 0: " + body.shapes[0].tverts[0].toString() + "\n"; - s += "TVert 1: " + body.shapes[0].tverts[1].toString() + "\n"; - s += "TVert 2: " + body.shapes[0].tverts[2].toString() + "\n"; - s += "TVert 3: " + body.shapes[0].tverts[3].toString() + "\n"; - s += "Plane 0: " + body.shapes[0].planes[0].normal.toString() + "\n"; - s += "Plane 1: " + body.shapes[0].planes[1].normal.toString() + "\n"; - s += "Plane 2: " + body.shapes[0].planes[2].normal.toString() + "\n"; - s += "Plane 3: " + body.shapes[0].planes[3].normal.toString() + "\n"; - s += "TPlane 0: " + body.shapes[0].tplanes[0].normal.toString() + "\n"; - s += "TPlane 1: " + body.shapes[0].tplanes[1].normal.toString() + "\n"; - s += "TPlane 2: " + body.shapes[0].tplanes[2].normal.toString() + "\n"; - s += "TPlane 3: " + body.shapes[0].tplanes[3].normal.toString() + "\n"; - - Manager.log.push(s); - */ - - } - - public static collision: Collision; - - public static SHAPE_TYPE_CIRCLE: number = 0; - public static SHAPE_TYPE_SEGMENT: number = 1; - public static SHAPE_TYPE_POLY: number = 2; - public static SHAPE_NUM_TYPES: number = 3; - - public static JOINT_TYPE_ANGLE: number = 0; - public static JOINT_TYPE_REVOLUTE: number = 1; - public static JOINT_TYPE_WELD: number = 2; - public static JOINT_TYPE_WHEEL: number = 3; - public static JOINT_TYPE_PRISMATIC: number = 4; - public static JOINT_TYPE_DISTANCE: number = 5; - public static JOINT_TYPE_ROPE: number = 6; - public static JOINT_TYPE_MOUSE: number = 7; - - public static JOINT_LINEAR_SLOP: number = 0.0008; - public static JOINT_ANGULAR_SLOP: number = 2 * 0.017453292519943294444444444444444; - public static JOINT_MAX_LINEAR_CORRECTION: number = 0.5; - public static JOINT_MAX_ANGULAR_CORRECTION: number = 8 * 0.017453292519943294444444444444444; - - public static JOINT_LIMIT_STATE_INACTIVE: number = 0; - public static JOINT_LIMIT_STATE_AT_LOWER: number = 1; - public static JOINT_LIMIT_STATE_AT_UPPER: number = 2; - public static JOINT_LIMIT_STATE_EQUAL_LIMITS: number = 3; - - public static CONTACT_SOLVER_COLLISION_SLOP: number = 0.0008; - public static CONTACT_SOLVER_BAUMGARTE: number = 0.28; - public static CONTACT_SOLVER_MAX_LINEAR_CORRECTION: number = 1;//Infinity; - - public static bodyCounter: number = 0; - public static jointCounter: number = 0; - public static shapeCounter: number = 0; - - public space: Space; - public lastTime: number = Date.now(); - public frameRateHz: number = 60; - public timeDelta: number = 0; - public paused: bool = false; - public step: bool = false; // step through the simulation (i.e. per click) - //public paused: bool = true; - //public step: bool = false; // step through the simulation (i.e. per click) - public velocityIterations: number = 8; - public positionIterations: number = 4; - public allowSleep: bool = true; - public warmStarting: bool = true; - - public gravity: Phaser.Vec2; - - - public update() { - - // Get these from Phaser.Time instead - var time = Date.now(); - var frameTime = (time - this.lastTime) / 1000; - this.lastTime = time; - - // if rAf - why? - frameTime = Math.floor(frameTime * 60 + 0.5) / 60; - - //if (!mouseDown) - //{ - // var p = canvasToWorld(mousePosition); - // var body = space.findBodyByPoint(p); - // //domCanvas.style.cursor = body ? "pointer" : "default"; - //} - - if (!this.paused || this.step) - { - Manager.clear(); - - var h = 1 / this.frameRateHz; - - this.timeDelta += frameTime; - - if (this.step) - { - this.step = false; - this.timeDelta = h; - } - - for (var maxSteps = 4; maxSteps > 0 && this.timeDelta >= h; maxSteps--) - { - this.space.step(h, this.velocityIterations, this.positionIterations, this.warmStarting, this.allowSleep); - this.timeDelta -= h; - } - - if (this.timeDelta > h) - { - this.timeDelta = 0; - } - } - - //frameCount++; - - } - - public addBody(body: Body) { - this.space.addBody(body); - } - - public removeBody(body: Body) { - this.space.removeBody(body); - } - - public addJoint(joint: IJoint) { - this.space.addJoint(joint); - } - - public removeJoint(joint: IJoint) { - this.space.removeJoint(joint); - } - - public pixelsToMeters(value: number): number { - return value * 0.02; - } - - public metersToPixels(value: number): number { - return value * 50; - } - - public static pixelsToMeters(value: number): number { - return value * 0.02; - } - - public static metersToPixels(value: number): number { - return value * 50; - } - - public static p2m(value: number): number { - return value * 0.02; - } - - public static m2p(value: number): number { - return value * 50; - } - - public static areaForCircle(radius_outer: number, radius_inner: number): number { - return Math.PI * (radius_outer * radius_outer - radius_inner * radius_inner); - } - - public static inertiaForCircle(mass: number, center: Phaser.Vec2, radius_outer: number, radius_inner: number): number { - return mass * ((radius_outer * radius_outer + radius_inner * radius_inner) * 0.5 + center.lengthSq()); - } - - public static areaForSegment(a: Phaser.Vec2, b: Phaser.Vec2, radius: number): number { - return radius * (Math.PI * radius + 2 * Phaser.Vec2Utils.distance(a, b)); - } - - public static centroidForSegment(a: Phaser.Vec2, b: Phaser.Vec2): Phaser.Vec2 { - return Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(a, b), 0.5); - } - - public static inertiaForSegment(mass: number, a: Phaser.Vec2, b: Phaser.Vec2): number { - - var distsq = Phaser.Vec2Utils.distanceSq(b, a); - var offset: Phaser.Vec2 = Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(a, b), 0.5); - - return mass * (distsq / 12 + offset.lengthSq()); - - } - - public static areaForPoly(verts: Phaser.Vec2[]): number { - - var area = 0; - - for (var i = 0; i < verts.length; i++) - { - area += Phaser.Vec2Utils.cross(verts[i], verts[(i + 1) % verts.length]); - } - - return area / 2; - } - - public static centroidForPoly(verts: Phaser.Vec2[]): Phaser.Vec2 { - - var area = 0; - var vsum = new Phaser.Vec2; - - for (var i = 0; i < verts.length; i++) - { - var v1 = verts[i]; - var v2 = verts[(i + 1) % verts.length]; - var cross = Phaser.Vec2Utils.cross(v1, v2); - - area += cross; - - // SO many vecs created here - unroll these bad boys - vsum.add(Phaser.Vec2Utils.scale(Phaser.Vec2Utils.add(v1, v2), cross)); - } - - return Phaser.Vec2Utils.scale(vsum, 1 / (3 * area)); - - } - - public static inertiaForPoly(mass: number, verts: Phaser.Vec2[], offset: Phaser.Vec2): number { - - var sum1 = 0; - var sum2 = 0; - - for (var i = 0; i < verts.length; i++) - { - var v1 = Phaser.Vec2Utils.add(verts[i], offset); - var v2 = Phaser.Vec2Utils.add(verts[(i + 1) % verts.length], offset); - - var a = Phaser.Vec2Utils.cross(v2, v1); - var b = Phaser.Vec2Utils.dot(v1, v1) + Phaser.Vec2Utils.dot(v1, v2) + Phaser.Vec2Utils.dot(v2, v2); - - sum1 += a * b; - sum2 += a; - } - - return (mass * sum1) / (6 * sum2); - - } - - public static inertiaForBox(mass: number, w: number, h: number) { - return mass * (w * w + h * h) / 12; - } - - // Create the convex hull using the Gift wrapping algorithm (http://en.wikipedia.org/wiki/Gift_wrapping_algorithm) - public static createConvexHull(points) { - - // Find the right most point on the hull - var i0 = 0; - var x0 = points[0].x; - - for (var i = 1; i < points.length; i++) - { - var x = points[i].x; - - if (x > x0 || (x == x0 && points[i].y < points[i0].y)) - { - i0 = i; - x0 = x; - } - } - - var n = points.length; - var hull = []; - var m = 0; - var ih = i0; - - while (1) - { - hull[m] = ih; - - var ie = 0; - - for (var j = 1; j < n; j++) - { - if (ie == ih) - { - ie = j; - continue; - } - - var r = Phaser.Vec2Utils.subtract(points[ie], points[hull[m]]); - var v = Phaser.Vec2Utils.subtract(points[j], points[hull[m]]); - var c = Phaser.Vec2Utils.cross(r, v); - - if (c < 0) - { - ie = j; - } - - // Collinearity check - if (c == 0 && v.lengthSq() > r.lengthSq()) - { - ie = j; - } - } - - m++; - ih = ie; - - if (ie == i0) - { - break; - } - } - - // Copy vertices - var newPoints = []; - - for (var i = 0; i < m; ++i) - { - newPoints.push(points[hull[i]]); - } - - return newPoints; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/ArcadePhysics.js b/wip/physics/ArcadePhysics.js deleted file mode 100644 index 2f9b5688..00000000 --- a/wip/physics/ArcadePhysics.js +++ /dev/null @@ -1,19 +0,0 @@ -var Shapes; -(function (Shapes) { - - var Point = Shapes.Point = (function () { - function Point(x, y) { - this.x = x; - this.y = y; - } - Point.prototype.getDist = function () { - return Math.sqrt((this.x * this.x) + (this.y * this.y)); - }; - Point.origin = new Point(0, 0); - return Point; - })(); - -})(Shapes || (Shapes = {})); - -var p = new Shapes.Point(3, 4); -var dist = p.getDist(); diff --git a/wip/physics/ArcadePhysics.ts b/wip/physics/ArcadePhysics.ts deleted file mode 100644 index 00ae9b18..00000000 --- a/wip/physics/ArcadePhysics.ts +++ /dev/null @@ -1,1121 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - PhysicsManager -* -* Your game only has one PhysicsManager instance and it's responsible for looking after, creating and colliding -* all of the physics objects in the world. -*/ - - -module Phaser.Physics { - - export class ArcadePhysics { - - constructor(game: Game, width: number, height: number) { - - this.game = game; - - this.gravity = new Vec2; - this.drag = new Vec2; - this.bounce = new Vec2; - this.angularDrag = 0; - - this.bounds = new Rectangle(0, 0, width, height); - - this._distance = new Vec2; - this._tangent = new Vec2; - - this.members = new Group(game); - - } - - /** - * Local private reference to Game. - */ - public game: Game; - - /** - * Physics object pool - */ - public members: Group; - - // Temp calculation vars - private _drag: number; - private _delta: number; - private _velocityDelta: number; - private _length: number = 0; - private _distance: Vec2; - private _tangent: Vec2; - private _separatedX: bool; - private _separatedY: bool; - private _overlap: number; - private _maxOverlap: number; - private _obj1Velocity: number; - private _obj2Velocity: number; - private _obj1NewVelocity: number; - private _obj2NewVelocity: number; - private _average: number; - private _quadTree: QuadTree; - private _quadTreeResult: bool; - - public bounds: Rectangle; - - public gravity: Vec2; - public drag: Vec2; - public bounce: Vec2; - public angularDrag: number; - - /** - * The overlap bias is used when calculating hull overlap before separation - change it if you have especially small or large GameObjects - * @type {number} - */ - static OVERLAP_BIAS: number = 4; - - /** - * The overlap bias is used when calculating hull overlap before separation - change it if you have especially small or large GameObjects - * @type {number} - */ - static TILE_OVERLAP: bool = false; - - /** - * @type {number} - */ - public worldDivisions: number = 6; - - - /* - public update() { - - this._length = this._objects.length; - - for (var i = 0; i < this._length; i++) - { - if (this._objects[i]) - { - this._objects[i].preUpdate(); - this.updateMotion(this._objects[i]); - this.collideWorld(this._objects[i]); - - for (var x = 0; x < this._length; x++) - { - if (this._objects[x] && this._objects[x] !== this._objects[i]) - { - //this.collideShapes(this._objects[i], this._objects[x]); - var r = this.NEWseparate(this._objects[i], this._objects[x]); - //console.log('sep', r); - } - } - - } - } - - } - - public render() { - - // iterate through the objects here, updating and colliding - for (var i = 0; i < this._length; i++) - { - if (this._objects[i]) - { - this._objects[i].render(this.game.stage.context); - } - } - - } -*/ - - public updateMotion(body: Phaser.Physics.Body) { - - if (body.type == Types.BODY_DISABLED) - { - return; - } - - this._velocityDelta = (this.computeVelocity(body.angularVelocity, body.gravity.x, body.angularAcceleration, body.angularDrag, body.maxAngular) - body.angularVelocity) / 2; - body.angularVelocity += this._velocityDelta; - body.sprite.transform.rotation += body.angularVelocity * this.game.time.elapsed; - body.angularVelocity += this._velocityDelta; - - this._velocityDelta = (this.computeVelocity(body.velocity.x, body.gravity.x, body.acceleration.x, body.drag.x) - body.velocity.x) / 2; - body.velocity.x += this._velocityDelta; - this._delta = body.velocity.x * this.game.time.elapsed; - body.velocity.x += this._velocityDelta; - //body.position.x += this._delta; - body.sprite.x += this._delta; - - this._velocityDelta = (this.computeVelocity(body.velocity.y, body.gravity.y, body.acceleration.y, body.drag.y) - body.velocity.y) / 2; - body.velocity.y += this._velocityDelta; - this._delta = body.velocity.y * this.game.time.elapsed; - body.velocity.y += this._velocityDelta; - //body.position.y += this._delta; - body.sprite.y += this._delta; - - } - - /** - * A tween-like function that takes a starting velocity and some other factors and returns an altered velocity. - * - * @param {number} Velocity Any component of velocity (e.g. 20). - * @param {number} Acceleration Rate at which the velocity is changing. - * @param {number} Drag Really kind of a deceleration, this is how much the velocity changes if Acceleration is not set. - * @param {number} Max An absolute value cap for the velocity. - * - * @return {number} The altered Velocity value. - */ - public computeVelocity(velocity: number, gravity: number = 0, acceleration: number = 0, drag: number = 0, max: number = 10000): number { - - if (acceleration !== 0) - { - velocity += (acceleration + gravity) * this.game.time.elapsed; - } - else if (drag !== 0) - { - this._drag = drag * this.game.time.elapsed; - - if (velocity - this._drag > 0) - { - velocity = velocity - this._drag; - } - else if (velocity + this._drag < 0) - { - velocity += this._drag; - } - else - { - velocity = 0; - } - - velocity += gravity; - } - - if ((velocity != 0) && (max != 10000)) - { - if (velocity > max) - { - velocity = max; - } - else if (velocity < -max) - { - velocity = -max; - } - } - - return velocity; - - } - - /** - * The core Collision separation method. - * @param body1 The first Physics.Body to separate - * @param body2 The second Physics.Body to separate - * @returns {boolean} Returns true if the bodies were separated, otherwise false. - */ - public separate(body1: Body, body2: Body): bool { - - this._separatedX = this.separateBodyX(body1, body2); - this._separatedY = this.separateBodyY(body1, body2); - - return this._separatedX || this._separatedY; - - } - - public checkHullIntersection(body1: Body, body2:Body): bool { - return ((body1.hullX + body1.hullWidth > body2.hullX) && (body1.hullX < body2.hullX + body2.hullWidth) && (body1.hullY + body1.hullHeight > body2.hullY) && (body1.hullY < body2.hullY + body2.hullHeight)); - } - - /** - * Separates the two objects on their x axis - * @param object1 The first GameObject to separate - * @param object2 The second GameObject to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the X axis. - */ - public separateBodyX(body1: Body, body2: Body): bool { - - // Can't separate two disabled or static objects - if ((body1.type == Types.BODY_DISABLED || body1.type == Types.BODY_STATIC) && (body2.type == Types.BODY_DISABLED || body2.type == Types.BODY_STATIC)) - { - return false; - } - - // First, get the two object deltas - this._overlap = 0; - - if (body1.deltaX != body2.deltaX) - { - if (RectangleUtils.intersects(body1.bounds, body2.bounds)) - { - this._maxOverlap = body1.deltaXAbs + body2.deltaXAbs + PhysicsManager.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (body1.deltaX > body2.deltaX) - { - this._overlap = body1.bounds.right - body2.bounds.x; - - if ((this._overlap > this._maxOverlap) || !(body1.allowCollisions & Types.RIGHT) || !(body2.allowCollisions & Types.LEFT)) - { - this._overlap = 0; - } - else - { - body1.touching |= Types.RIGHT; - body2.touching |= Types.LEFT; - } - } - else if (body1.deltaX < body2.deltaX) - { - this._overlap = body1.bounds.x - body2.bounds.width - body2.bounds.x; - - if ((-this._overlap > this._maxOverlap) || !(body1.allowCollisions & Types.LEFT) || !(body2.allowCollisions & Types.RIGHT)) - { - this._overlap = 0; - } - else - { - body1.touching |= Types.LEFT; - body2.touching |= Types.RIGHT; - } - } - } - } - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (this._overlap != 0) - { - this._obj1Velocity = body1.velocity.x; - this._obj2Velocity = body2.velocity.x; - - /** - * Dynamic = gives and receives impacts - * Static = gives but doesn't receive impacts, cannot be moved by physics - * Kinematic = gives impacts, but never receives, can be moved by physics - */ - - // 2 dynamic bodies will exchange velocities - if (body1.type == Types.BODY_DYNAMIC && body2.type == Types.BODY_DYNAMIC) - { - this._overlap *= 0.5; - body1.position.x = body1.position.x - this._overlap; - body2.position.x += this._overlap; - - this._obj1NewVelocity = Math.sqrt((this._obj2Velocity * this._obj2Velocity * body2.mass) / body1.mass) * ((this._obj2Velocity > 0) ? 1 : -1); - this._obj2NewVelocity = Math.sqrt((this._obj1Velocity * this._obj1Velocity * body1.mass) / body2.mass) * ((this._obj1Velocity > 0) ? 1 : -1); - this._average = (this._obj1NewVelocity + this._obj2NewVelocity) * 0.5; - this._obj1NewVelocity -= this._average; - this._obj2NewVelocity -= this._average; - body1.velocity.x = this._average + this._obj1NewVelocity * body1.bounce.x; - body2.velocity.x = this._average + this._obj2NewVelocity * body2.bounce.x; - } - else if (body2.type != Types.BODY_DYNAMIC) - { - // Body 2 is Static or Kinematic - this._overlap *= 2; - body1.position.x -= this._overlap; - body1.velocity.x = this._obj2Velocity - this._obj1Velocity * body1.bounce.x; - } - else if (body1.type != Types.BODY_DYNAMIC) - { - // Body 1 is Static or Kinematic - this._overlap *= 2; - body2.position.x += this._overlap; - body2.velocity.x = this._obj1Velocity - this._obj2Velocity * body2.bounce.x; - } - - return true; - } - else - { - return false; - } - - } - - /** - * Separates the two objects on their y axis - * @param object1 The first GameObject to separate - * @param object2 The second GameObject to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the Y axis. - */ - public separateBodyY(body1: Body, body2: Body): bool { - - // Can't separate two immovable objects - if ((body1.type == Types.BODY_DISABLED || body1.type == Types.BODY_STATIC) && (body2.type == Types.BODY_DISABLED || body2.type == Types.BODY_STATIC)) - { - return false; - } - - // First, get the two object deltas - this._overlap = 0; - - if (body1.deltaY != body2.deltaY) - { - if (RectangleUtils.intersects(body1.bounds, body2.bounds)) - { - // This is the only place to use the DeltaAbs values - this._maxOverlap = body1.deltaYAbs + body2.deltaYAbs + PhysicsManager.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (body1.deltaY > body2.deltaY) - { - this._overlap = body1.bounds.bottom - body2.bounds.y; - - if ((this._overlap > this._maxOverlap) || !(body1.allowCollisions & Types.DOWN) || !(body2.allowCollisions & Types.UP)) - { - this._overlap = 0; - } - else - { - body1.touching |= Types.DOWN; - body2.touching |= Types.UP; - } - } - else if (body1.deltaY < body2.deltaY) - { - this._overlap = body1.bounds.y - body2.bounds.height - body2.bounds.y; - - if ((-this._overlap > this._maxOverlap) || !(body1.allowCollisions & Types.UP) || !(body2.allowCollisions & Types.DOWN)) - { - this._overlap = 0; - } - else - { - body1.touching |= Types.UP; - body2.touching |= Types.DOWN; - } - } - } - } - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (this._overlap != 0) - { - this._obj1Velocity = body1.velocity.y; - this._obj2Velocity = body2.velocity.y; - - /** - * Dynamic = gives and receives impacts - * Static = gives but doesn't receive impacts, cannot be moved by physics - * Kinematic = gives impacts, but never receives, can be moved by physics - */ - - if (body1.type == Types.BODY_DYNAMIC && body2.type == Types.BODY_DYNAMIC) - { - this._overlap *= 0.5; - body1.position.y = body1.position.y - this._overlap; - body2.position.y += this._overlap; - - this._obj1NewVelocity = Math.sqrt((this._obj2Velocity * this._obj2Velocity * body2.mass) / body1.mass) * ((this._obj2Velocity > 0) ? 1 : -1); - this._obj2NewVelocity = Math.sqrt((this._obj1Velocity * this._obj1Velocity * body1.mass) / body2.mass) * ((this._obj1Velocity > 0) ? 1 : -1); - var average: number = (this._obj1NewVelocity + this._obj2NewVelocity) * 0.5; - this._obj1NewVelocity -= average; - this._obj2NewVelocity -= average; - body1.velocity.y = average + this._obj1NewVelocity * body1.bounce.y; - body2.velocity.y = average + this._obj2NewVelocity * body2.bounce.y; - } - else if (body2.type != Types.BODY_DYNAMIC) - { - this._overlap *= 2; - body1.position.y -= this._overlap; - body1.velocity.y = this._obj2Velocity - this._obj1Velocity * body1.bounce.y; - // This is special case code that handles things like horizontal moving platforms you can ride - //if (body2.parent.active && body2.moves && (body1.deltaY > body2.deltaY)) - if (body2.sprite.active && (body1.deltaY > body2.deltaY)) - { - body1.position.x += body2.position.x - body2.oldPosition.x; - } - } - else if (body1.type != Types.BODY_DYNAMIC) - { - this._overlap *= 2; - body2.position.y += this._overlap; - body2.velocity.y = this._obj1Velocity - this._obj2Velocity * body2.bounce.y; - // This is special case code that handles things like horizontal moving platforms you can ride - //if (object1.active && body1.moves && (body1.deltaY < body2.deltaY)) - if (body1.sprite.active && (body1.deltaY < body2.deltaY)) - { - body2.position.x += body1.position.x - body1.oldPosition.x; - } - } - - return true; - } - else - { - return false; - } - } - - - - - - - - /* - private TILEseparate(shapeA: IPhysicsShape, shapeB: IPhysicsShape, distance: Vec2, tangent: Vec2) { - - if (tangent.x == 1) - { - console.log('1 The left side of ShapeA hit the right side of ShapeB', Math.floor(distance.x)); - shapeA.physics.touching |= Phaser.Types.LEFT; - shapeB.physics.touching |= Phaser.Types.RIGHT; - } - else if (tangent.x == -1) - { - console.log('2 The right side of ShapeA hit the left side of ShapeB', Math.floor(distance.x)); - shapeA.physics.touching |= Phaser.Types.RIGHT; - shapeB.physics.touching |= Phaser.Types.LEFT; - } - - if (tangent.y == 1) - { - console.log('3 The top of ShapeA hit the bottom of ShapeB', Math.floor(distance.y)); - shapeA.physics.touching |= Phaser.Types.UP; - shapeB.physics.touching |= Phaser.Types.DOWN; - } - else if (tangent.y == -1) - { - console.log('4 The bottom of ShapeA hit the top of ShapeB', Math.floor(distance.y)); - shapeA.physics.touching |= Phaser.Types.DOWN; - shapeB.physics.touching |= Phaser.Types.UP; - } - - - // only apply collision response forces if the object is travelling into, and not out of, the collision - var dot = Vec2Utils.dot(shapeA.physics.velocity, tangent); - - if (dot < 0) - { - console.log('in to', dot); - - // Apply horizontal bounce - if (shapeA.physics.bounce.x > 0) - { - shapeA.physics.velocity.x *= -(shapeA.physics.bounce.x); - } - else - { - shapeA.physics.velocity.x = 0; - } - // Apply horizontal bounce - if (shapeA.physics.bounce.y > 0) - { - shapeA.physics.velocity.y *= -(shapeA.physics.bounce.y); - } - else - { - shapeA.physics.velocity.y = 0; - } - } - else - { - console.log('out of', dot); - } - - shapeA.position.x += Math.floor(distance.x); - //shapeA.bounds.x += Math.floor(distance.x); - - shapeA.position.y += Math.floor(distance.y); - //shapeA.bounds.y += distance.y; - - console.log('------------------------------------------------'); - - } - - private collideWorld(shape:IPhysicsShape) { - - // Collide on the x-axis - this._distance.x = shape.world.bounds.x - (shape.position.x - shape.bounds.halfWidth); - - if (0 < this._distance.x) - { - // Hit Left - this._tangent.setTo(1, 0); - this.separateXWall(shape, this._distance, this._tangent); - } - else - { - this._distance.x = (shape.position.x + shape.bounds.halfWidth) - shape.world.bounds.right; - - if (0 < this._distance.x) - { - // Hit Right - this._tangent.setTo(-1, 0); - this._distance.reverse(); - this.separateXWall(shape, this._distance, this._tangent); - } - } - - // Collide on the y-axis - this._distance.y = shape.world.bounds.y - (shape.position.y - shape.bounds.halfHeight); - - if (0 < this._distance.y) - { - // Hit Top - this._tangent.setTo(0, 1); - this.separateYWall(shape, this._distance, this._tangent); - } - else - { - this._distance.y = (shape.position.y + shape.bounds.halfHeight) - shape.world.bounds.bottom; - - if (0 < this._distance.y) - { - // Hit Bottom - this._tangent.setTo(0, -1); - this._distance.reverse(); - this.separateYWall(shape, this._distance, this._tangent); - } - } - - } - - private separateX(shapeA: IPhysicsShape, shapeB: IPhysicsShape, distance: Vec2, tangent: Vec2) { - - if (tangent.x == 1) - { - console.log('The left side of ShapeA hit the right side of ShapeB', distance.x); - shapeA.physics.touching |= Phaser.Types.LEFT; - shapeB.physics.touching |= Phaser.Types.RIGHT; - } - else - { - console.log('The right side of ShapeA hit the left side of ShapeB', distance.x); - shapeA.physics.touching |= Phaser.Types.RIGHT; - shapeB.physics.touching |= Phaser.Types.LEFT; - } - - // collision edges - //shapeA.oH = tangent.x; - - // only apply collision response forces if the object is travelling into, and not out of, the collision - if (Vec2Utils.dot(shapeA.physics.velocity, tangent) < 0) - { - // Apply horizontal bounce - if (shapeA.physics.bounce.x > 0) - { - shapeA.physics.velocity.x *= -(shapeA.physics.bounce.x); - } - else - { - shapeA.physics.velocity.x = 0; - } - } - - shapeA.position.x += distance.x; - shapeA.bounds.x += distance.x; - - } - - private separateY(shapeA: IPhysicsShape, shapeB: IPhysicsShape, distance: Vec2, tangent: Vec2) { - - if (tangent.y == 1) - { - console.log('The top of ShapeA hit the bottom of ShapeB', distance.y); - shapeA.physics.touching |= Phaser.Types.UP; - shapeB.physics.touching |= Phaser.Types.DOWN; - } - else - { - console.log('The bottom of ShapeA hit the top of ShapeB', distance.y); - shapeA.physics.touching |= Phaser.Types.DOWN; - shapeB.physics.touching |= Phaser.Types.UP; - } - - // collision edges - //shapeA.oV = tangent.y; - - // only apply collision response forces if the object is travelling into, and not out of, the collision - if (Vec2Utils.dot(shapeA.physics.velocity, tangent) < 0) - { - // Apply horizontal bounce - if (shapeA.physics.bounce.y > 0) - { - shapeA.physics.velocity.y *= -(shapeA.physics.bounce.y); - } - else - { - shapeA.physics.velocity.y = 0; - } - } - - shapeA.position.y += distance.y; - shapeA.bounds.y += distance.y; - - } - - private separateXWall(shapeA: IPhysicsShape, distance: Vec2, tangent: Vec2) { - - if (tangent.x == 1) - { - console.log('The left side of ShapeA hit the right side of ShapeB', distance.x); - shapeA.physics.touching |= Phaser.Types.LEFT; - } - else - { - console.log('The right side of ShapeA hit the left side of ShapeB', distance.x); - shapeA.physics.touching |= Phaser.Types.RIGHT; - } - - // collision edges - //shapeA.oH = tangent.x; - - // only apply collision response forces if the object is travelling into, and not out of, the collision - if (Vec2Utils.dot(shapeA.physics.velocity, tangent) < 0) - { - // Apply horizontal bounce - if (shapeA.physics.bounce.x > 0) - { - shapeA.physics.velocity.x *= -(shapeA.physics.bounce.x); - } - else - { - shapeA.physics.velocity.x = 0; - } - } - - shapeA.position.x += distance.x; - - } - - private separateYWall(shapeA: IPhysicsShape, distance: Vec2, tangent: Vec2) { - - if (tangent.y == 1) - { - console.log('The top of ShapeA hit the bottom of ShapeB', distance.y); - shapeA.physics.touching |= Phaser.Types.UP; - } - else - { - console.log('The bottom of ShapeA hit the top of ShapeB', distance.y); - shapeA.physics.touching |= Phaser.Types.DOWN; - } - - // collision edges - //shapeA.oV = tangent.y; - - // only apply collision response forces if the object is travelling into, and not out of, the collision - if (Vec2Utils.dot(shapeA.physics.velocity, tangent) < 0) - { - // Apply horizontal bounce - if (shapeA.physics.bounce.y > 0) - { - shapeA.physics.velocity.y *= -(shapeA.physics.bounce.y); - } - else - { - shapeA.physics.velocity.y = 0; - } - } - - shapeA.position.y += distance.y; - - } - */ - - /** - * Checks for overlaps between two objects using the world QuadTree. Can be Sprite vs. Sprite, Sprite vs. Group or Group vs. Group. - * Note: Does not take the objects scrollFactor into account. All overlaps are check in world space. - * @param object1 The first Sprite or Group to check. If null the world.group is used. - * @param object2 The second Sprite or Group to check. - * @param notifyCallback A callback function that is called if the objects overlap. The two objects will be passed to this function in the same order in which you passed them to Collision.overlap. - * @param processCallback A callback function that lets you perform additional checks against the two objects if they overlap. If this is set then notifyCallback will only be called if processCallback returns true. - * @param context The context in which the callbacks will be called - * @returns {boolean} true if the objects overlap, otherwise false. - */ - public overlap(object1 = null, object2 = null, notifyCallback = null, processCallback = null, context = null): bool { - - /* - if (object1 == null) - { - object1 = this.game.world.group; - } - - if (object2 == object1) - { - object2 = null; - } - - QuadTree.divisions = this.worldDivisions; - - this._quadTree = new Phaser.QuadTree(this, this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); - - this._quadTree.load(object1, object2, notifyCallback, processCallback, context); - - this._quadTreeResult = this._quadTree.execute(); - - console.log('over', this._quadTreeResult); - - this._quadTree.destroy(); - - this._quadTree = null; - - return this._quadTreeResult; - */ - - return false; - - } - - - - - - - /** - * Collision resolution specifically for GameObjects vs. Tiles. - * @param object The GameObject to separate - * @param tile The Tile to separate - * @returns {boolean} Whether the objects in fact touched and were separated - */ - public separateTile(object:Sprite, x: number, y: number, width: number, height: number, mass: number, collideLeft: bool, collideRight: bool, collideUp: bool, collideDown: bool, separateX: bool, separateY: bool): bool { - - //var separatedX: bool = this.separateTileX(object, x, y, width, height, mass, collideLeft, collideRight, separateX); - //var separatedY: bool = this.separateTileY(object, x, y, width, height, mass, collideUp, collideDown, separateY); - - //return separatedX || separatedY; - - return false; - - } - - /** - * Separates the two objects on their x axis - * @param object The GameObject to separate - * @param tile The Tile to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the X axis. - */ - /* - public separateTileX(object:Sprite, x: number, y: number, width: number, height: number, mass: number, collideLeft: bool, collideRight: bool, separate: bool): bool { - - // Can't separate two immovable objects (tiles are always immovable) - if (object.immovable) - { - return false; - } - - // First, get the object delta - var overlap: number = 0; - var objDelta: number = object.x - object.last.x; - //var objDelta: number = object.collisionMask.deltaX; - - if (objDelta != 0) - { - // Check if the X hulls actually overlap - var objDeltaAbs: number = (objDelta > 0) ? objDelta : -objDelta; - //var objDeltaAbs: number = object.collisionMask.deltaXAbs; - var objBounds: Rectangle = new Rectangle(object.x - ((objDelta > 0) ? objDelta : 0), object.last.y, object.width + ((objDelta > 0) ? objDelta : -objDelta), object.height); - - if ((objBounds.x + objBounds.width > x) && (objBounds.x < x + width) && (objBounds.y + objBounds.height > y) && (objBounds.y < y + height)) - { - var maxOverlap: number = objDeltaAbs + Collision.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (objDelta > 0) - { - overlap = object.x + object.width - x; - - if ((overlap > maxOverlap) || !(object.allowCollisions & Collision.RIGHT) || collideLeft == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.RIGHT; - } - } - else if (objDelta < 0) - { - overlap = object.x - width - x; - - if ((-overlap > maxOverlap) || !(object.allowCollisions & Collision.LEFT) || collideRight == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.LEFT; - } - - } - - } - } - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (overlap != 0) - { - if (separate == true) - { - //console.log(' - object.x = object.x - overlap; - object.velocity.x = -(object.velocity.x * object.elasticity); - } - - Collision.TILE_OVERLAP = true; - return true; - } - else - { - return false; - } - - } - */ - - /** - * Separates the two objects on their y axis - * @param object The first GameObject to separate - * @param tile The second GameObject to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the Y axis. - */ - /* - public separateTileY(object: Sprite, x: number, y: number, width: number, height: number, mass: number, collideUp: bool, collideDown: bool, separate: bool): bool { - - // Can't separate two immovable objects (tiles are always immovable) - if (object.immovable) - { - return false; - } - - // First, get the two object deltas - var overlap: number = 0; - var objDelta: number = object.y - object.last.y; - - if (objDelta != 0) - { - // Check if the Y hulls actually overlap - var objDeltaAbs: number = (objDelta > 0) ? objDelta : -objDelta; - var objBounds: Rectangle = new Rectangle(object.x, object.y - ((objDelta > 0) ? objDelta : 0), object.width, object.height + objDeltaAbs); - - if ((objBounds.x + objBounds.width > x) && (objBounds.x < x + width) && (objBounds.y + objBounds.height > y) && (objBounds.y < y + height)) - { - var maxOverlap: number = objDeltaAbs + Collision.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (objDelta > 0) - { - overlap = object.y + object.height - y; - - if ((overlap > maxOverlap) || !(object.allowCollisions & Collision.DOWN) || collideUp == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.DOWN; - } - } - else if (objDelta < 0) - { - overlap = object.y - height - y; - - if ((-overlap > maxOverlap) || !(object.allowCollisions & Collision.UP) || collideDown == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.UP; - } - } - } - } - - // TODO - with super low velocities you get lots of stuttering, set some kind of base minimum here - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (overlap != 0) - { - if (separate == true) - { - object.y = object.y - overlap; - object.velocity.y = -(object.velocity.y * object.elasticity); - } - - Collision.TILE_OVERLAP = true; - return true; - } - else - { - return false; - } - } - */ - - - /** - * Separates the two objects on their x axis - * @param object The GameObject to separate - * @param tile The Tile to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the X axis. - */ - /* - public static NEWseparateTileX(object:Sprite, x: number, y: number, width: number, height: number, mass: number, collideLeft: bool, collideRight: bool, separate: bool): bool { - - // Can't separate two immovable objects (tiles are always immovable) - if (object.immovable) - { - return false; - } - - // First, get the object delta - var overlap: number = 0; - - if (object.collisionMask.deltaX != 0) - { - // Check if the X hulls actually overlap - //var objDeltaAbs: number = (objDelta > 0) ? objDelta : -objDelta; - //var objBounds: Rectangle = new Rectangle(object.x - ((objDelta > 0) ? objDelta : 0), object.last.y, object.width + ((objDelta > 0) ? objDelta : -objDelta), object.height); - - //if ((objBounds.x + objBounds.width > x) && (objBounds.x < x + width) && (objBounds.y + objBounds.height > y) && (objBounds.y < y + height)) - if (object.collisionMask.intersectsRaw(x, x + width, y, y + height)) - { - var maxOverlap: number = object.collisionMask.deltaXAbs + Collision.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (object.collisionMask.deltaX > 0) - { - //overlap = object.x + object.width - x; - overlap = object.collisionMask.right - x; - - if ((overlap > maxOverlap) || !(object.allowCollisions & Collision.RIGHT) || collideLeft == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.RIGHT; - } - } - else if (object.collisionMask.deltaX < 0) - { - //overlap = object.x - width - x; - overlap = object.collisionMask.x - width - x; - - if ((-overlap > maxOverlap) || !(object.allowCollisions & Collision.LEFT) || collideRight == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.LEFT; - } - - } - - } - } - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (overlap != 0) - { - if (separate == true) - { - object.x = object.x - overlap; - object.velocity.x = -(object.velocity.x * object.elasticity); - } - - Collision.TILE_OVERLAP = true; - return true; - } - else - { - return false; - } - - } - */ - - /** - * Separates the two objects on their y axis - * @param object The first GameObject to separate - * @param tile The second GameObject to separate - * @returns {boolean} Whether the objects in fact touched and were separated along the Y axis. - */ - /* - public NEWseparateTileY(object: Sprite, x: number, y: number, width: number, height: number, mass: number, collideUp: bool, collideDown: bool, separate: bool): bool { - - // Can't separate two immovable objects (tiles are always immovable) - if (object.immovable) - { - return false; - } - - // First, get the two object deltas - var overlap: number = 0; - //var objDelta: number = object.y - object.last.y; - - if (object.collisionMask.deltaY != 0) - { - // Check if the Y hulls actually overlap - //var objDeltaAbs: number = (objDelta > 0) ? objDelta : -objDelta; - //var objBounds: Rectangle = new Rectangle(object.x, object.y - ((objDelta > 0) ? objDelta : 0), object.width, object.height + objDeltaAbs); - - //if ((objBounds.x + objBounds.width > x) && (objBounds.x < x + width) && (objBounds.y + objBounds.height > y) && (objBounds.y < y + height)) - if (object.collisionMask.intersectsRaw(x, x + width, y, y + height)) - { - //var maxOverlap: number = objDeltaAbs + Collision.OVERLAP_BIAS; - var maxOverlap: number = object.collisionMask.deltaYAbs + Collision.OVERLAP_BIAS; - - // If they did overlap (and can), figure out by how much and flip the corresponding flags - if (object.collisionMask.deltaY > 0) - { - //overlap = object.y + object.height - y; - overlap = object.collisionMask.bottom - y; - - if ((overlap > maxOverlap) || !(object.allowCollisions & Collision.DOWN) || collideUp == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.DOWN; - } - } - else if (object.collisionMask.deltaY < 0) - { - //overlap = object.y - height - y; - overlap = object.collisionMask.y - height - y; - - if ((-overlap > maxOverlap) || !(object.allowCollisions & Collision.UP) || collideDown == false) - { - overlap = 0; - } - else - { - object.touching |= Collision.UP; - } - } - } - } - - // TODO - with super low velocities you get lots of stuttering, set some kind of base minimum here - - // Then adjust their positions and velocities accordingly (if there was any overlap) - if (overlap != 0) - { - if (separate == true) - { - object.y = object.y - overlap; - object.velocity.y = -(object.velocity.y * object.elasticity); - } - - Collision.TILE_OVERLAP = true; - return true; - } - else - { - return false; - } - } - */ - - } - -} \ No newline at end of file diff --git a/wip/physics/Body.js b/wip/physics/Body.js deleted file mode 100644 index 6f12a4b8..00000000 --- a/wip/physics/Body.js +++ /dev/null @@ -1,416 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Body - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Body = (function () { - function Body(sprite, type, x, y, shapeType) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - if (typeof shapeType === "undefined") { shapeType = 0; } - this._tempVec2 = new Phaser.Vec2(); - this._fixedRotation = false; - // Shapes - this.shapes = []; - // Joints - this.joints = []; - this.jointHash = { - }; - this.categoryBits = 0x0001; - this.maskBits = 0xFFFF; - this.stepCount = 0; - this._newPosition = new Phaser.Vec2(); - this.id = Phaser.Physics.AdvancedPhysics.bodyCounter++; - this.name = 'body' + this.id; - this.type = type; - if(sprite) { - this.sprite = sprite; - this.game = sprite.game; - this.position = new Phaser.Vec2(Phaser.Physics.AdvancedPhysics.pixelsToMeters(sprite.x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(sprite.y)); - this.angle = this.game.math.degreesToRadians(sprite.rotation); - } else { - this.position = new Phaser.Vec2(Phaser.Physics.AdvancedPhysics.pixelsToMeters(x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(y)); - this.angle = 0; - } - this.transform = new Phaser.Transform(this.position, this.angle); - this.centroid = new Phaser.Vec2(); - this.velocity = new Phaser.Vec2(); - this.force = new Phaser.Vec2(); - this.angularVelocity = 0; - this.torque = 0; - this.linearDamping = 0; - this.angularDamping = 0; - this.sleepTime = 0; - this.awaked = false; - this.shapes = []; - this.joints = []; - this.jointHash = { - }; - this.bounds = new Physics.Bounds(); - this.allowCollisions = Phaser.Types.ANY; - this.categoryBits = 0x0001; - this.maskBits = 0xFFFF; - this.stepCount = 0; - if(sprite) { - if(shapeType == 0) { - Phaser.BodyUtils.addBox(this, 0, 0, this.sprite.width, this.sprite.height, 1, 1, 1); - } else { - Phaser.BodyUtils.addCircle(this, Math.max(this.sprite.width, this.sprite.height) / 2, 0, 0, 1, 1, 1); - } - } - } - Object.defineProperty(Body.prototype, "rotation", { - get: /** - * The rotation of the body in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right. - */ - function () { - return this.game.math.radiansToDegrees(this.angle); - }, - set: /** - * Set the rotation of the body in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right. - * The value is automatically wrapped to be between 0 and 360. - */ - function (value) { - this.angle = this.game.math.degreesToRadians(this.game.math.wrap(value, 360, 0)); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Body.prototype, "isDisabled", { - get: function () { - return this.type == Phaser.Types.BODY_DISABLED ? true : false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Body.prototype, "isStatic", { - get: function () { - return this.type == Phaser.Types.BODY_STATIC ? true : false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Body.prototype, "isKinetic", { - get: function () { - return this.type == Phaser.Types.BODY_KINETIC ? true : false; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Body.prototype, "isDynamic", { - get: function () { - return this.type == Phaser.Types.BODY_DYNAMIC ? true : false; - }, - enumerable: true, - configurable: true - }); - Body.prototype.setType = function (type) { - if(type == this.type) { - return; - } - this.force.setTo(0, 0); - this.velocity.setTo(0, 0); - this.torque = 0; - this.angularVelocity = 0; - this.type = type; - this.awake(true); - }; - Body.prototype.addShape = function (shape) { - // Check not already part of this body - shape.body = this; - this.shapes.push(shape); - this.shapesLength = this.shapes.length; - return shape; - }; - Body.prototype.removeShape = function (shape) { - var index = this.shapes.indexOf(shape); - if(index != -1) { - this.shapes.splice(index, 1); - shape.body = undefined; - } - this.shapesLength = this.shapes.length; - }; - Body.prototype.setMass = function (mass) { - this.mass = mass; - this.massInverted = mass > 0 ? 1 / mass : 0; - }; - Body.prototype.setInertia = function (inertia) { - this.inertia = inertia; - this.inertiaInverted = inertia > 0 ? 1 / inertia : 0; - }; - Body.prototype.setPosition = function (x, y) { - this._newPosition.setTo(Phaser.Physics.AdvancedPhysics.pixelsToMeters(x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(y)); - this.setTransform(this._newPosition, this.angle); - }; - Body.prototype.setTransform = function (pos, angle) { - // inject the transform into this.position - this.transform.setTo(pos, angle); - //Manager.write('setTransform: ' + this.position.toString()); - //Manager.write('centroid: ' + this.centroid.toString()); - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - //Manager.write('post setTransform: ' + this.position.toString()); - //this.position.copyFrom(this.transform.transform(this.centroid)); - this.angle = angle; - }; - Body.prototype.syncTransform = function () { - //Manager.write('syncTransform:'); - //Manager.write('p: ' + this.position.toString()); - //Manager.write('centroid: ' + this.centroid.toString()); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('a: ' + this.angle); - this.transform.setRotation(this.angle); - // OPTIMISE: Creating new vector - Phaser.Vec2Utils.subtract(this.position, Phaser.TransformUtils.rotate(this.transform, this.centroid), this.transform.t); - //Manager.write('--------------------'); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('--------------------'); - }; - Body.prototype.getWorldPoint = function (p) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.transform(this.transform, p); - }; - Body.prototype.getWorldVector = function (v) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.rotate(this.transform, v); - }; - Body.prototype.getLocalPoint = function (p) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.untransform(this.transform, p); - }; - Body.prototype.getLocalVector = function (v) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.unrotate(this.transform, v); - }; - Object.defineProperty(Body.prototype, "fixedRotation", { - get: function () { - return this._fixedRotation; - }, - set: function (value) { - this._fixedRotation = value; - this.resetMassData(); - }, - enumerable: true, - configurable: true - }); - Body.prototype.resetMassData = function () { - this.centroid.setTo(0, 0); - this.mass = 0; - this.massInverted = 0; - this.inertia = 0; - this.inertiaInverted = 0; - if(this.isDynamic == false) { - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - return; - } - var totalMassCentroid = new Phaser.Vec2(0, 0); - var totalMass = 0; - var totalInertia = 0; - for(var i = 0; i < this.shapes.length; i++) { - var shape = this.shapes[i]; - var centroid = shape.centroid(); - var mass = shape.area() * shape.density; - var inertia = shape.inertia(mass); - totalMassCentroid.multiplyAddByScalar(centroid, mass); - totalMass += mass; - totalInertia += inertia; - } - Phaser.Vec2Utils.scale(totalMassCentroid, 1 / totalMass, this.centroid); - this.setMass(totalMass); - if(!this.fixedRotation) { - this.setInertia(totalInertia - totalMass * Phaser.Vec2Utils.dot(this.centroid, this.centroid)); - } - // Move center of mass - var oldPosition = Phaser.Vec2Utils.clone(this.position); - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - // Update center of mass velocity - oldPosition.subtract(this.position); - this.velocity.multiplyAddByScalar(Phaser.Vec2Utils.perp(oldPosition, oldPosition), this.angularVelocity); - }; - Body.prototype.resetJointAnchors = function () { - for(var i = 0; i < this.joints.length; i++) { - var joint = this.joints[i]; - if(!joint) { - continue; - } - var anchor1 = joint.getWorldAnchor1(); - var anchor2 = joint.getWorldAnchor2(); - joint.setWorldAnchor1(anchor1); - joint.setWorldAnchor2(anchor2); - } - }; - Body.prototype.cacheData = function (source) { - if (typeof source === "undefined") { source = ''; } - //Manager.write('cacheData -- start'); - //Manager.write('p: ' + this.position.toString()); - //Manager.write('xf: ' + this.transform.toString()); - this.bounds.clear(); - for(var i = 0; i < this.shapesLength; i++) { - var shape = this.shapes[i]; - shape.cacheData(this.transform); - this.bounds.addBounds(shape.bounds); - } - //Manager.write('bounds: ' + this.bounds.toString()); - //Manager.write('p: ' + this.position.toString()); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('cacheData -- stop'); - }; - Body.prototype.updateVelocity = function (gravity, dt, damping) { - Phaser.Vec2Utils.multiplyAdd(gravity, this.force, this.massInverted, this._tempVec2); - Phaser.Vec2Utils.multiplyAdd(this.velocity, this._tempVec2, dt, this.velocity); - this.angularVelocity = this.angularVelocity + this.torque * this.inertiaInverted * dt; - // Apply damping. - // ODE: dv/dt + c * v = 0 - // Solution: v(t) = v0 * exp(-c * t) - // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) - // v2 = exp(-c * dt) * v1 - // Taylor expansion: - // v2 = (1.0f - c * dt) * v1 - this.velocity.scale(this.clamp(1 - dt * (damping + this.linearDamping), 0, 1)); - this.angularVelocity *= this.clamp(1 - dt * (damping + this.angularDamping), 0, 1); - this.force.setTo(0, 0); - this.torque = 0; - }; - Body.prototype.inContact = function (body2) { - if(!body2 || this.stepCount == body2.stepCount) { - return false; - } - if(!(this.isAwake && this.isStatic == false) && !(body2.isAwake && body2.isStatic == false)) { - return false; - } - if(this.isCollidable(body2) == false) { - return false; - } - if(!this.bounds.intersectsBounds(body2.bounds)) { - return false; - } - return true; - }; - Body.prototype.clamp = function (v, min, max) { - return v < min ? min : (v > max ? max : v); - }; - Body.prototype.updatePosition = function (dt) { - this.position.add(Phaser.Vec2Utils.scale(this.velocity, dt, this._tempVec2)); - this.angle += this.angularVelocity * dt; - if(this.sprite) { - this.sprite.x = this.position.x * 50; - this.sprite.y = this.position.y * 50; - this.sprite.transform.rotation = this.game.math.radiansToDegrees(this.angle); - } - }; - Body.prototype.resetForce = function () { - this.force.setTo(0, 0); - this.torque = 0; - }; - Body.prototype.applyForce = function (force, p) { - if(this.isDynamic == false) { - return; - } - if(this.isAwake == false) { - this.awake(true); - } - this.force.add(force); - Phaser.Vec2Utils.subtract(p, this.position, this._tempVec2); - this.torque += Phaser.Vec2Utils.cross(this._tempVec2, force); - }; - Body.prototype.applyForceToCenter = function (force) { - if(this.isDynamic == false) { - return; - } - if(this.isAwake == false) { - this.awake(true); - } - this.force.add(force); - }; - Body.prototype.applyTorque = function (torque) { - if(this.isDynamic == false) { - return; - } - if(this.isAwake == false) { - this.awake(true); - } - this.torque += torque; - }; - Body.prototype.applyLinearImpulse = function (impulse, p) { - if(this.isDynamic == false) { - return; - } - if(this.isAwake == false) { - this.awake(true); - } - this.velocity.multiplyAddByScalar(impulse, this.massInverted); - Phaser.Vec2Utils.subtract(p, this.position, this._tempVec2); - this.angularVelocity += Phaser.Vec2Utils.cross(this._tempVec2, impulse) * this.inertiaInverted; - }; - Body.prototype.applyAngularImpulse = function (impulse) { - if(this.isDynamic == false) { - return; - } - if(this.isAwake == false) { - this.awake(true); - } - this.angularVelocity += impulse * this.inertiaInverted; - }; - Body.prototype.kineticEnergy = function () { - return 0.5 * (this.mass * this.velocity.dot(this.velocity) + this.inertia * (this.angularVelocity * this.angularVelocity)); - }; - Object.defineProperty(Body.prototype, "isAwake", { - get: function () { - return this.awaked; - }, - enumerable: true, - configurable: true - }); - Body.prototype.awake = function (flag) { - this.awaked = flag; - if(flag) { - this.sleepTime = 0; - } else { - this.velocity.setTo(0, 0); - this.angularVelocity = 0; - this.force.setTo(0, 0); - this.torque = 0; - } - }; - Body.prototype.isCollidable = function (other) { - if((this.isDynamic == false && other.isDynamic == false) || this == other) { - return false; - } - if(!(this.maskBits & other.categoryBits) || !(other.maskBits & this.categoryBits)) { - return false; - } - for(var i = 0; i < this.joints.length; i++) { - var joint = this.joints[i]; - if(!this.joints[i] || (!this.joints[i].collideConnected && other.jointHash[this.joints[i].id] != undefined)) { - return false; - } - } - return true; - }; - Body.prototype.toString = function () { - return "[{Body (name=" + this.name + " velocity=" + this.velocity.toString() + " angularVelocity: " + this.angularVelocity + ")}]"; - }; - return Body; - })(); - Physics.Body = Body; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Body.ts b/wip/physics/Body.ts deleted file mode 100644 index 325965af..00000000 --- a/wip/physics/Body.ts +++ /dev/null @@ -1,657 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Body -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Body { - - constructor(sprite: Phaser.Sprite, type: number, x?: number = 0, y?: number = 0, shapeType?: number = 0) { - - this.id = Phaser.Physics.AdvancedPhysics.bodyCounter++; - this.name = 'body' + this.id; - this.type = type; - - if (sprite) - { - this.sprite = sprite; - this.game = sprite.game; - this.position = new Phaser.Vec2(Phaser.Physics.AdvancedPhysics.pixelsToMeters(sprite.x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(sprite.y)); - this.angle = this.game.math.degreesToRadians(sprite.rotation); - } - else - { - this.position = new Phaser.Vec2(Phaser.Physics.AdvancedPhysics.pixelsToMeters(x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(y)); - this.angle = 0; - } - - this.transform = new Phaser.Transform(this.position, this.angle); - this.centroid = new Phaser.Vec2; - this.velocity = new Phaser.Vec2; - this.force = new Phaser.Vec2; - this.angularVelocity = 0; - this.torque = 0; - this.linearDamping = 0; - this.angularDamping = 0; - this.sleepTime = 0; - this.awaked = false; - - this.shapes = []; - this.joints = []; - this.jointHash = {}; - - this.bounds = new Bounds; - - this.allowCollisions = Phaser.Types.ANY; - - this.categoryBits = 0x0001; - this.maskBits = 0xFFFF; - - this.stepCount = 0; - - if (sprite) - { - if (shapeType == 0) - { - Phaser.BodyUtils.addBox(this, 0, 0, this.sprite.width, this.sprite.height, 1, 1, 1); - } - else - { - Phaser.BodyUtils.addCircle(this, Math.max(this.sprite.width, this.sprite.height) / 2, 0, 0, 1, 1, 1); - } - } - - } - - private _tempVec2: Phaser.Vec2 = new Phaser.Vec2; - private _fixedRotation: bool = false; - - /** - * Reference to Phaser.Game - */ - public game: Phaser.Game; - - /** - * Reference to the parent Sprite - */ - public sprite: Phaser.Sprite; - - /** - * The Body ID - */ - public id: number; - - /** - * The Body name - */ - public name: string; - - /** - * The type of Body (disabled, dynamic, static or kinematic) - * Disabled = skips all physics operations / tests (default) - * Dynamic = gives and receives impacts - * Static = gives but doesn't receive impacts, cannot be moved by physics - * Kinematic = gives impacts, but never receives, can be moved by physics - * @type {number} - */ - public type: number; - - /** - * The angle of the body in radians. Used by all of the internal physics methods. - */ - public angle: number; - - /** - * The rotation of the body in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right. - */ - public get rotation(): number { - return this.game.math.radiansToDegrees(this.angle); - } - - /** - * Set the rotation of the body in degrees. Phaser uses a right-handed coordinate system, where 0 points to the right. - * The value is automatically wrapped to be between 0 and 360. - */ - public set rotation(value: number) { - this.angle = this.game.math.degreesToRadians(this.game.math.wrap(value, 360, 0)); - } - - // Local to world transform - public transform: Phaser.Transform; - - // Local center of mass - public centroid: Phaser.Vec2; - - // World position of centroid - public position: Phaser.Vec2; - - // Velocity - public velocity: Phaser.Vec2; - - // Force - public force: Phaser.Vec2; - - // Angular velocity - public angularVelocity: number; - - // Torque - public torque: number; - - // Linear damping - public linearDamping: number; - - // Angular damping - public angularDamping: number; - - // Sleep time - public sleepTime: number; - - // Awaked - public awaked: bool; - - // Allow Collisions - public allowCollisions: number; - - // Shapes - public shapes: IShape[] = []; - - // Length of the shapes array - public shapesLength: number; - - // Joints - public joints: IJoint[] = []; - public jointHash = {}; - - // Bounds of all shapes - public bounds: Bounds; - - public mass: number; - public massInverted: number; - public inertia: number; - public inertiaInverted: number; - - public categoryBits: number = 0x0001; - public maskBits: number = 0xFFFF; - public stepCount: number = 0; - public space: Space; - - - public get isDisabled(): bool { - return this.type == Phaser.Types.BODY_DISABLED ? true : false; - } - - public get isStatic(): bool { - return this.type == Phaser.Types.BODY_STATIC ? true : false; - } - - public get isKinetic(): bool { - return this.type == Phaser.Types.BODY_KINETIC ? true : false; - } - - public get isDynamic(): bool { - return this.type == Phaser.Types.BODY_DYNAMIC ? true : false; - } - - public setType(type: number) { - - if (type == this.type) - { - return; - } - - this.force.setTo(0, 0); - this.velocity.setTo(0, 0); - this.torque = 0; - this.angularVelocity = 0; - this.type = type; - - this.awake(true); - - } - - - public addShape(shape) { - - // Check not already part of this body - shape.body = this; - - this.shapes.push(shape); - - this.shapesLength = this.shapes.length; - - return shape; - - } - - public removeShape(shape) { - - var index = this.shapes.indexOf(shape); - - if (index != -1) - { - this.shapes.splice(index, 1); - shape.body = undefined; - } - - this.shapesLength = this.shapes.length; - - } - - private setMass(mass:number) { - - this.mass = mass; - this.massInverted = mass > 0 ? 1 / mass : 0; - - } - - private setInertia(inertia:number) { - - this.inertia = inertia; - this.inertiaInverted = inertia > 0 ? 1 / inertia : 0; - - } - - private _newPosition: Phaser.Vec2 = new Phaser.Vec2; - - public setPosition(x: number, y: number) { - - this._newPosition.setTo(Phaser.Physics.AdvancedPhysics.pixelsToMeters(x), Phaser.Physics.AdvancedPhysics.pixelsToMeters(y)); - - this.setTransform(this._newPosition, this.angle); - - } - - public setTransform(pos:Phaser.Vec2, angle:number) { - - // inject the transform into this.position - this.transform.setTo(pos, angle); - //Manager.write('setTransform: ' + this.position.toString()); - //Manager.write('centroid: ' + this.centroid.toString()); - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - //Manager.write('post setTransform: ' + this.position.toString()); - //this.position.copyFrom(this.transform.transform(this.centroid)); - this.angle = angle; - - } - - public syncTransform() { - - //Manager.write('syncTransform:'); - //Manager.write('p: ' + this.position.toString()); - //Manager.write('centroid: ' + this.centroid.toString()); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('a: ' + this.angle); - this.transform.setRotation(this.angle); - // OPTIMISE: Creating new vector - Phaser.Vec2Utils.subtract(this.position, Phaser.TransformUtils.rotate(this.transform, this.centroid), this.transform.t); - //Manager.write('--------------------'); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('--------------------'); - - } - - public getWorldPoint(p:Phaser.Vec2) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.transform(this.transform, p); - } - - public getWorldVector(v:Phaser.Vec2) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.rotate(this.transform, v); - } - - public getLocalPoint(p:Phaser.Vec2) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.untransform(this.transform, p); - } - - public getLocalVector(v:Phaser.Vec2) { - // OPTIMISE: Creating new vector - return Phaser.TransformUtils.unrotate(this.transform, v); - } - - public set fixedRotation(value:bool) { - - this._fixedRotation = value; - - this.resetMassData(); - - } - - public get fixedRotation(): bool { - return this._fixedRotation; - } - - public resetMassData() { - - this.centroid.setTo(0, 0); - this.mass = 0; - this.massInverted = 0; - this.inertia = 0; - this.inertiaInverted = 0; - - if (this.isDynamic == false) - { - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - return; - } - - var totalMassCentroid = new Phaser.Vec2(0, 0); - var totalMass = 0; - var totalInertia = 0; - - for (var i = 0; i < this.shapes.length; i++) - { - var shape = this.shapes[i]; - var centroid = shape.centroid(); - var mass = shape.area() * shape.density; - var inertia = shape.inertia(mass); - - totalMassCentroid.multiplyAddByScalar(centroid, mass); - totalMass += mass; - totalInertia += inertia; - } - - Phaser.Vec2Utils.scale(totalMassCentroid, 1 / totalMass, this.centroid); - - this.setMass(totalMass); - - if (!this.fixedRotation) - { - this.setInertia(totalInertia - totalMass * Phaser.Vec2Utils.dot(this.centroid, this.centroid)); - } - - // Move center of mass - var oldPosition: Phaser.Vec2 = Phaser.Vec2Utils.clone(this.position); - Phaser.TransformUtils.transform(this.transform, this.centroid, this.position); - - // Update center of mass velocity - oldPosition.subtract(this.position); - this.velocity.multiplyAddByScalar(Phaser.Vec2Utils.perp(oldPosition, oldPosition), this.angularVelocity); - - } - - public resetJointAnchors() { - - for (var i = 0; i < this.joints.length; i++) - { - var joint = this.joints[i]; - - if (!joint) - { - continue; - } - - var anchor1 = joint.getWorldAnchor1(); - var anchor2 = joint.getWorldAnchor2(); - - joint.setWorldAnchor1(anchor1); - joint.setWorldAnchor2(anchor2); - } - } - - public cacheData(source:string = '') { - - //Manager.write('cacheData -- start'); - //Manager.write('p: ' + this.position.toString()); - //Manager.write('xf: ' + this.transform.toString()); - - this.bounds.clear(); - - for (var i = 0; i < this.shapesLength; i++) - { - var shape: IShape = this.shapes[i]; - shape.cacheData(this.transform); - this.bounds.addBounds(shape.bounds); - } - - //Manager.write('bounds: ' + this.bounds.toString()); - - //Manager.write('p: ' + this.position.toString()); - //Manager.write('xf: ' + this.transform.toString()); - //Manager.write('cacheData -- stop'); - - } - - public updateVelocity(gravity, dt, damping) { - - Phaser.Vec2Utils.multiplyAdd(gravity, this.force, this.massInverted, this._tempVec2); - Phaser.Vec2Utils.multiplyAdd(this.velocity, this._tempVec2, dt, this.velocity); - - this.angularVelocity = this.angularVelocity + this.torque * this.inertiaInverted * dt; - - // Apply damping. - // ODE: dv/dt + c * v = 0 - // Solution: v(t) = v0 * exp(-c * t) - // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) - // v2 = exp(-c * dt) * v1 - // Taylor expansion: - // v2 = (1.0f - c * dt) * v1 - this.velocity.scale(this.clamp(1 - dt * (damping + this.linearDamping), 0, 1)); - this.angularVelocity *= this.clamp(1 - dt * (damping + this.angularDamping), 0, 1); - - this.force.setTo(0, 0); - this.torque = 0; - - } - - public inContact(body2: Body): bool { - - if (!body2 || this.stepCount == body2.stepCount) - { - return false; - } - - if (!(this.isAwake && this.isStatic == false) && !(body2.isAwake && body2.isStatic == false)) - { - return false; - } - - if (this.isCollidable(body2) == false) - { - return false; - } - - if (!this.bounds.intersectsBounds(body2.bounds)) - { - return false; - } - - return true; - - } - - public clamp(v, min, max) { - return v < min ? min : (v > max ? max : v); - } - - public updatePosition(dt:number) { - - this.position.add(Phaser.Vec2Utils.scale(this.velocity, dt, this._tempVec2)); - - this.angle += this.angularVelocity * dt; - - if (this.sprite) - { - this.sprite.x = this.position.x * 50; - this.sprite.y = this.position.y * 50; - this.sprite.transform.rotation = this.game.math.radiansToDegrees(this.angle); - } - - } - - public resetForce() { - - this.force.setTo(0, 0); - this.torque = 0; - - } - - public applyForce(force:Phaser.Vec2, p:Phaser.Vec2) { - - if (this.isDynamic == false) - { - return; - } - - if (this.isAwake == false) - { - this.awake(true); - } - - this.force.add(force); - - Phaser.Vec2Utils.subtract(p, this.position, this._tempVec2); - - this.torque += Phaser.Vec2Utils.cross(this._tempVec2, force); - - } - - public applyForceToCenter(force:Phaser.Vec2) { - - if (this.isDynamic == false) - { - return; - } - - if (this.isAwake == false) - { - this.awake(true); - } - - this.force.add(force); - - } - - public applyTorque(torque:number) { - - if (this.isDynamic == false) - { - return; - } - - if (this.isAwake == false) - { - this.awake(true); - } - - this.torque += torque; - - } - - public applyLinearImpulse(impulse:Phaser.Vec2, p:Phaser.Vec2) { - - if (this.isDynamic == false) - { - return; - } - - if (this.isAwake == false) - { - this.awake(true); - } - - this.velocity.multiplyAddByScalar(impulse, this.massInverted); - - Phaser.Vec2Utils.subtract(p, this.position, this._tempVec2); - - this.angularVelocity += Phaser.Vec2Utils.cross(this._tempVec2, impulse) * this.inertiaInverted; - - } - - public applyAngularImpulse(impulse: number) { - - if (this.isDynamic == false) - { - return; - } - - if (this.isAwake == false) - { - this.awake(true); - } - - this.angularVelocity += impulse * this.inertiaInverted; - - } - - public kineticEnergy() { - - return 0.5 * (this.mass * this.velocity.dot(this.velocity) + this.inertia * (this.angularVelocity * this.angularVelocity)); - - } - - public get isAwake(): bool { - return this.awaked; - } - - public awake(flag) { - - this.awaked = flag; - - if (flag) - { - this.sleepTime = 0; - } - else - { - this.velocity.setTo(0, 0); - this.angularVelocity = 0; - this.force.setTo(0, 0); - this.torque = 0; - } - - } - - public isCollidable(other:Body) { - - if ((this.isDynamic == false && other.isDynamic == false) || this == other) - { - return false; - } - - if (!(this.maskBits & other.categoryBits) || !(other.maskBits & this.categoryBits)) - { - return false; - } - - for (var i = 0; i < this.joints.length; i++) - { - var joint = this.joints[i]; - - if (!this.joints[i] || (!this.joints[i].collideConnected && other.jointHash[this.joints[i].id] != undefined)) - { - return false; - } - } - - return true; - - } - - public toString(): string { - return "[{Body (name=" + this.name + " velocity=" + this.velocity.toString() + " angularVelocity: " + this.angularVelocity + ")}]"; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/BodyUtils.ts b/wip/physics/BodyUtils.ts deleted file mode 100644 index e43a770d..00000000 --- a/wip/physics/BodyUtils.ts +++ /dev/null @@ -1,94 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - BodyUtils -* -* A collection of methods useful for manipulating AdvancedPhysics Body objects. -*/ - -module Phaser { - - export class BodyUtils { - - static duplicate(source: Phaser.Physics.Body, output?: Phaser.Physics.Body): Phaser.Physics.Body { - - /* - console.log('body duplicate called'); - - var newBody = new Phaser.Physics.Body(source.type, source.transform.t, source.rotation); - - for (var i = 0; i < source.shapes.length; i++) - { - output.addShape(source.shapes[i].duplicate()); - } - - output.resetMassData(); - */ - - return output; - - } - - static addPoly(body: Phaser.Physics.Body, verts, elasticity?: number = 1, friction?: number = 1, density?: number = 1): Phaser.Physics.Shapes.Poly { - - var poly: Phaser.Physics.Shapes.Poly = new Phaser.Physics.Shapes.Poly(verts); - poly.elasticity = elasticity; - poly.friction = friction; - poly.density = density; - - body.addShape(poly); - body.resetMassData(); - - return poly; - - } - - static addTriangle(body: Phaser.Physics.Body, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, elasticity?: number = 1, friction?: number = 1, density?: number = 1): Phaser.Physics.Shapes.Triangle { - - var tri: Phaser.Physics.Shapes.Triangle = new Phaser.Physics.Shapes.Triangle(x1, y1, x2, y2, x3, y3); - tri.elasticity = elasticity; - tri.friction = friction; - tri.density = density; - - body.addShape(tri); - body.resetMassData(); - - return tri; - - } - - static addBox(body: Phaser.Physics.Body, x: number, y: number, width: number, height: number, elasticity?: number = 1, friction?: number = 1, density?: number = 1): Phaser.Physics.Shapes.Box { - - var box: Phaser.Physics.Shapes.Box = new Phaser.Physics.Shapes.Box(x, y, width, height); - box.elasticity = elasticity; - box.friction = friction; - box.density = density; - - body.addShape(box); - body.resetMassData(); - - return box; - - } - - static addCircle(body: Phaser.Physics.Body, radius: number, x?: number = 0, y?: number = 0, elasticity?: number = 1, friction?: number = 1, density?: number = 1): Phaser.Physics.Shapes.Circle { - - var circle: Phaser.Physics.Shapes.Circle = new Phaser.Physics.Shapes.Circle(radius, x, y); - circle.elasticity = elasticity; - circle.friction = friction; - circle.density = density; - - body.addShape(circle); - body.resetMassData(); - - return circle; - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/Bounds.js b/wip/physics/Bounds.js deleted file mode 100644 index 47b9ef6e..00000000 --- a/wip/physics/Bounds.js +++ /dev/null @@ -1,201 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /** - * Phaser - 2D AABB - * - * A 2D AABB object - */ - (function (Physics) { - var Bounds = (function () { - /** - * Creates a new 2D AABB object. - * @class Bounds - * @constructor - * @return {Bounds} This object - **/ - function Bounds(mins, maxs) { - if (typeof mins === "undefined") { mins = null; } - if (typeof maxs === "undefined") { maxs = null; } - if(mins) { - this.mins = Phaser.Vec2Utils.clone(mins); - } else { - this.mins = new Phaser.Vec2(999999, 999999); - } - if(maxs) { - this.maxs = Phaser.Vec2Utils.clone(maxs); - } else { - this.maxs = new Phaser.Vec2(999999, 999999); - } - } - Bounds.prototype.toString = function () { - return [ - "mins:", - this.mins.toString(), - "maxs:", - this.maxs.toString() - ].join(" "); - }; - Bounds.prototype.setTo = function (mins, maxs) { - this.mins.setTo(mins.x, mins.y); - this.maxs.setTo(maxs.x, maxs.y); - }; - Bounds.prototype.copy = function (b) { - this.mins.copyFrom(b.mins); - this.maxs.copyFrom(b.maxs); - return this; - }; - Bounds.prototype.clear = function () { - this.mins.setTo(999999, 999999); - this.maxs.setTo(-999999, -999999); - return this; - }; - Object.defineProperty(Bounds.prototype, "x", { - get: function () { - return Physics.AdvancedPhysics.metersToPixels(this.mins.x); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Bounds.prototype, "y", { - get: function () { - return Physics.AdvancedPhysics.metersToPixels(this.mins.y); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Bounds.prototype, "width", { - get: function () { - return Physics.AdvancedPhysics.metersToPixels(this.maxs.x - this.mins.x); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Bounds.prototype, "height", { - get: function () { - return Physics.AdvancedPhysics.metersToPixels(this.maxs.y - this.mins.y); - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Bounds.prototype, "right", { - get: function () { - return this.x + this.width; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Bounds.prototype, "bottom", { - get: function () { - return this.y + this.height; - }, - enumerable: true, - configurable: true - }); - Bounds.prototype.isEmpty = function () { - return (this.mins.x > this.maxs.x || this.mins.y > this.maxs.y); - }; - Bounds.prototype.getPerimeter = /* - public getCenter() { - return vec2.scale(vec2.add(this.mins, this.maxs), 0.5); - } - - public getExtent() { - return vec2.scale(vec2.sub(this.maxs, this.mins), 0.5); - } - */ - function () { - return (this.maxs.x - this.mins.x + this.maxs.y - this.mins.y) * 2; - }; - Bounds.prototype.addPoint = function (p) { - if(this.mins.x > p.x) { - this.mins.x = p.x; - } - if(this.maxs.x < p.x) { - this.maxs.x = p.x; - } - if(this.mins.y > p.y) { - this.mins.y = p.y; - } - if(this.maxs.y < p.y) { - this.maxs.y = p.y; - } - return this; - }; - Bounds.prototype.addBounds = function (b) { - if(this.mins.x > b.mins.x) { - this.mins.x = b.mins.x; - } - if(this.maxs.x < b.maxs.x) { - this.maxs.x = b.maxs.x; - } - if(this.mins.y > b.mins.y) { - this.mins.y = b.mins.y; - } - if(this.maxs.y < b.maxs.y) { - this.maxs.y = b.maxs.y; - } - return this; - }; - Bounds.prototype.addBounds2 = function (mins, maxs) { - if(this.mins.x > mins.x) { - this.mins.x = mins.x; - } - if(this.maxs.x < maxs.x) { - this.maxs.x = maxs.x; - } - if(this.mins.y > mins.y) { - this.mins.y = mins.y; - } - if(this.maxs.y < maxs.y) { - this.maxs.y = maxs.y; - } - return this; - }; - Bounds.prototype.addExtents = function (center, extent_x, extent_y) { - if(this.mins.x > center.x - extent_x) { - this.mins.x = center.x - extent_x; - } - if(this.maxs.x < center.x + extent_x) { - this.maxs.x = center.x + extent_x; - } - if(this.mins.y > center.y - extent_y) { - this.mins.y = center.y - extent_y; - } - if(this.maxs.y < center.y + extent_y) { - this.maxs.y = center.y + extent_y; - } - return this; - }; - Bounds.prototype.expand = function (ax, ay) { - this.mins.x -= ax; - this.mins.y -= ay; - this.maxs.x += ax; - this.maxs.y += ay; - return this; - }; - Bounds.prototype.containPoint = function (p) { - if(p.x < this.mins.x || p.x > this.maxs.x || p.y < this.mins.y || p.y > this.maxs.y) { - return false; - } - return true; - }; - Bounds.prototype.intersectsBounds = function (b) { - if(this.mins.x > b.maxs.x || this.maxs.x < b.mins.x || this.mins.y > b.maxs.y || this.maxs.y < b.mins.y) { - return false; - } - return true; - }; - Bounds.expand = function expand(b, ax, ay) { - var b = new Bounds(b.mins, b.maxs); - b.expand(ax, ay); - return b; - }; - return Bounds; - })(); - Physics.Bounds = Bounds; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Bounds.ts b/wip/physics/Bounds.ts deleted file mode 100644 index 8c3a72e5..00000000 --- a/wip/physics/Bounds.ts +++ /dev/null @@ -1,199 +0,0 @@ -/// -/// -/// - -/** -* Phaser - 2D AABB -* -* A 2D AABB object -*/ - -module Phaser.Physics { - - export class Bounds { - - /** - * Creates a new 2D AABB object. - * @class Bounds - * @constructor - * @return {Bounds} This object - **/ - constructor(mins?: Phaser.Vec2 = null, maxs?: Phaser.Vec2 = null) { - - if (mins) - { - this.mins = Phaser.Vec2Utils.clone(mins); - } - else - { - this.mins = new Phaser.Vec2(999999, 999999); - } - - if (maxs) - { - this.maxs = Phaser.Vec2Utils.clone(maxs); - } - else - { - this.maxs = new Phaser.Vec2(999999, 999999); - } - - } - - public mins: Phaser.Vec2; - public maxs: Phaser.Vec2; - - public toString() { - return ["mins:", this.mins.toString(), "maxs:", this.maxs.toString()].join(" "); - } - - public setTo(mins: Phaser.Vec2, maxs: Phaser.Vec2) { - - this.mins.setTo(mins.x, mins.y); - this.maxs.setTo(maxs.x, maxs.y); - - } - - public copy(b: Bounds): Bounds { - - this.mins.copyFrom(b.mins); - this.maxs.copyFrom(b.maxs); - - return this; - } - - public clear(): Bounds { - - this.mins.setTo(999999, 999999); - this.maxs.setTo(-999999, -999999); - - return this; - - } - - public get x(): number { - return AdvancedPhysics.metersToPixels(this.mins.x); - } - - public get y(): number { - return AdvancedPhysics.metersToPixels(this.mins.y); - } - - public get width(): number { - return AdvancedPhysics.metersToPixels(this.maxs.x - this.mins.x); - } - - public get height(): number { - return AdvancedPhysics.metersToPixels(this.maxs.y - this.mins.y); - } - - public get right(): number { - return this.x + this.width; - } - - public get bottom(): number { - return this.y + this.height; - } - - public isEmpty(): bool { - return (this.mins.x > this.maxs.x || this.mins.y > this.maxs.y); - } - - /* - public getCenter() { - return vec2.scale(vec2.add(this.mins, this.maxs), 0.5); - } - - public getExtent() { - return vec2.scale(vec2.sub(this.maxs, this.mins), 0.5); - } - */ - - public getPerimeter(): number { - return (this.maxs.x - this.mins.x + this.maxs.y - this.mins.y) * 2; - } - - public addPoint(p: Phaser.Vec2): Bounds { - - if (this.mins.x > p.x) this.mins.x = p.x; - if (this.maxs.x < p.x) this.maxs.x = p.x; - if (this.mins.y > p.y) this.mins.y = p.y; - if (this.maxs.y < p.y) this.maxs.y = p.y; - - return this; - } - - public addBounds(b: Bounds): Bounds { - - if (this.mins.x > b.mins.x) this.mins.x = b.mins.x; - if (this.maxs.x < b.maxs.x) this.maxs.x = b.maxs.x; - if (this.mins.y > b.mins.y) this.mins.y = b.mins.y; - if (this.maxs.y < b.maxs.y) this.maxs.y = b.maxs.y; - - return this; - } - - public addBounds2(mins, maxs): Bounds { - - if (this.mins.x > mins.x) this.mins.x = mins.x; - if (this.maxs.x < maxs.x) this.maxs.x = maxs.x; - if (this.mins.y > mins.y) this.mins.y = mins.y; - if (this.maxs.y < maxs.y) this.maxs.y = maxs.y; - - return this; - } - - public addExtents(center: Phaser.Vec2, extent_x: number, extent_y: number): Bounds { - - if (this.mins.x > center.x - extent_x) this.mins.x = center.x - extent_x; - if (this.maxs.x < center.x + extent_x) this.maxs.x = center.x + extent_x; - if (this.mins.y > center.y - extent_y) this.mins.y = center.y - extent_y; - if (this.maxs.y < center.y + extent_y) this.maxs.y = center.y + extent_y; - - return this; - - } - - public expand(ax: number, ay: number): Bounds { - - this.mins.x -= ax; - this.mins.y -= ay; - this.maxs.x += ax; - this.maxs.y += ay; - - return this; - - } - - public containPoint(p: Phaser.Vec2): bool { - - if (p.x < this.mins.x || p.x > this.maxs.x || p.y < this.mins.y || p.y > this.maxs.y) - { - return false; - } - - return true; - - } - - public intersectsBounds(b: Bounds): bool { - - if (this.mins.x > b.maxs.x || this.maxs.x < b.mins.x || this.mins.y > b.maxs.y || this.maxs.y < b.mins.y) - { - return false; - } - - return true; - } - - public static expand(b: Bounds, ax, ay) { - - var b = new Bounds(b.mins, b.maxs); - b.expand(ax, ay); - return b; - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/Collision.js b/wip/physics/Collision.js deleted file mode 100644 index 4ea803a9..00000000 --- a/wip/physics/Collision.js +++ /dev/null @@ -1,373 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Collision Handlers - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Collision = (function () { - function Collision() { } - Collision.prototype.collide = function (a, b, contacts) { - // Circle (a is the circle) - if(a.type == Physics.AdvancedPhysics.SHAPE_TYPE_CIRCLE) { - if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_CIRCLE) { - return this.circle2Circle(a, b, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_SEGMENT) { - return this.circle2Segment(a, b, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_POLY) { - return this.circle2Poly(a, b, contacts); - } - } - // Segment (a is the segment) - if(a.type == Physics.AdvancedPhysics.SHAPE_TYPE_SEGMENT) { - if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_CIRCLE) { - return this.circle2Segment(b, a, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_SEGMENT) { - return this.segment2Segment(a, b, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_POLY) { - return this.segment2Poly(a, b, contacts); - } - } - // Poly (a is the poly) - if(a.type == Physics.AdvancedPhysics.SHAPE_TYPE_POLY) { - if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_CIRCLE) { - return this.circle2Poly(b, a, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_SEGMENT) { - return this.segment2Poly(b, a, contacts); - } else if(b.type == Physics.AdvancedPhysics.SHAPE_TYPE_POLY) { - return this.poly2Poly(a, b, contacts); - } - } - }; - Collision.prototype._circle2Circle = function (c1, r1, c2, r2, contactArr) { - var rmax = r1 + r2; - var t = new Phaser.Vec2(); - //var t = vec2.sub(c2, c1); - Phaser.Vec2Utils.subtract(c2, c1, t); - var distsq = t.lengthSq(); - if(distsq > rmax * rmax) { - return 0; - } - var dist = Math.sqrt(distsq); - var p = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(c1, t, 0.5 + (r1 - r2) * 0.5 / dist, p); - //var p = vec2.mad(c1, t, 0.5 + (r1 - r2) * 0.5 / dist); - var n = new Phaser.Vec2(); - //var n = (dist != 0) ? vec2.scale(t, 1 / dist) : vec2.zero; - if(dist != 0) { - Phaser.Vec2Utils.scale(t, 1 / dist, n); - } - var d = dist - rmax; - contactArr.push(new Physics.Contact(p, n, d, 0)); - return 1; - }; - Collision.prototype.circle2Circle = function (circ1, circ2, contactArr) { - return this._circle2Circle(circ1.tc, circ1.radius, circ2.tc, circ2.radius, contactArr); - }; - Collision.prototype.circle2Segment = function (circ, seg, contactArr) { - var rsum = circ.radius + seg.radius; - // Normal distance from segment - var dn = Phaser.Vec2Utils.dot(circ.tc, seg.tn) - Phaser.Vec2Utils.dot(seg.ta, seg.tn); - var dist = (dn < 0 ? dn * -1 : dn) - rsum; - if(dist > 0) { - return 0; - } - // Tangential distance along segment - var dt = Phaser.Vec2Utils.cross(circ.tc, seg.tn); - var dtMin = Phaser.Vec2Utils.cross(seg.ta, seg.tn); - var dtMax = Phaser.Vec2Utils.cross(seg.tb, seg.tn); - if(dt < dtMin) { - if(dt < dtMin - rsum) { - return 0; - } - return this._circle2Circle(circ.tc, circ.radius, seg.ta, seg.radius, contactArr); - } else if(dt > dtMax) { - if(dt > dtMax + rsum) { - return 0; - } - return this._circle2Circle(circ.tc, circ.radius, seg.tb, seg.radius, contactArr); - } - var n = new Phaser.Vec2(); - if(dn > 0) { - n.copyFrom(seg.tn); - } else { - Phaser.Vec2Utils.negative(seg.tn, n); - } - //var n = (dn > 0) ? seg.tn : vec2.neg(seg.tn); - var c1 = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(circ.tc, n, -(circ.radius + dist * 0.5), c1); - var c2 = new Phaser.Vec2(); - Phaser.Vec2Utils.negative(n, c2); - contactArr.push(new Physics.Contact(c1, c2, dist, 0)); - //contactArr.push(new Contact(vec2.mad(circ.tc, n, -(circ.r + dist * 0.5)), vec2.neg(n), dist, 0)); - return 1; - }; - Collision.prototype.circle2Poly = function (circ, poly, contactArr) { - var minDist = -999999; - var minIdx = -1; - for(var i = 0; i < poly.verts.length; i++) { - var plane = poly.tplanes[i]; - var dist = Phaser.Vec2Utils.dot(circ.tc, plane.normal) - plane.d - circ.radius; - if(dist > 0) { - return 0; - } else if(dist > minDist) { - minDist = dist; - minIdx = i; - } - } - var n = poly.tplanes[minIdx].normal; - var a = poly.tverts[minIdx]; - var b = poly.tverts[(minIdx + 1) % poly.verts.length]; - var dta = Phaser.Vec2Utils.cross(a, n); - var dtb = Phaser.Vec2Utils.cross(b, n); - var dt = Phaser.Vec2Utils.cross(circ.tc, n); - if(dt > dta) { - return this._circle2Circle(circ.tc, circ.radius, a, 0, contactArr); - } else if(dt < dtb) { - return this._circle2Circle(circ.tc, circ.radius, b, 0, contactArr); - } - var c1 = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(circ.tc, n, -(circ.radius + minDist * 0.5), c1); - var c2 = new Phaser.Vec2(); - Phaser.Vec2Utils.negative(n, c2); - contactArr.push(new Physics.Contact(c1, c2, minDist, 0)); - //contactArr.push(new Contact(vec2.mad(circ.tc, n, -(circ.r + minDist * 0.5)), vec2.neg(n), minDist, 0)); - return 1; - }; - Collision.prototype.segmentPointDistanceSq = function (seg, p) { - var w = new Phaser.Vec2(); - var d = new Phaser.Vec2(); - Phaser.Vec2Utils.subtract(p, seg.ta, w); - Phaser.Vec2Utils.subtract(seg.tb, seg.ta, d); - //var w = vec2.sub(p, seg.ta); - //var d = vec2.sub(seg.tb, seg.ta); - var proj = w.dot(d); - if(proj <= 0) { - return w.dot(w); - } - var vsq = d.dot(d); - if(proj >= vsq) { - return w.dot(w) - 2 * proj + vsq; - } - return w.dot(w) - proj * proj / vsq; - }; - Collision.prototype.segment2Segment = // FIXME and optimise me lots!!! - function (seg1, seg2, contactArr) { - var d = []; - d[0] = this.segmentPointDistanceSq(seg1, seg2.ta); - d[1] = this.segmentPointDistanceSq(seg1, seg2.tb); - d[2] = this.segmentPointDistanceSq(seg2, seg1.ta); - d[3] = this.segmentPointDistanceSq(seg2, seg1.tb); - var idx1 = d[0] < d[1] ? 0 : 1; - var idx2 = d[2] < d[3] ? 2 : 3; - var idxm = d[idx1] < d[idx2] ? idx1 : idx2; - var s, t; - var u = Phaser.Vec2Utils.subtract(seg1.tb, seg1.ta); - var v = Phaser.Vec2Utils.subtract(seg2.tb, seg2.ta); - switch(idxm) { - case 0: - s = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg2.ta, seg1.ta), u) / Phaser.Vec2Utils.dot(u, u); - s = s < 0 ? 0 : (s > 1 ? 1 : s); - t = 0; - break; - case 1: - s = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg2.tb, seg1.ta), u) / Phaser.Vec2Utils.dot(u, u); - s = s < 0 ? 0 : (s > 1 ? 1 : s); - t = 1; - break; - case 2: - s = 0; - t = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg1.ta, seg2.ta), v) / Phaser.Vec2Utils.dot(v, v); - t = t < 0 ? 0 : (t > 1 ? 1 : t); - break; - case 3: - s = 1; - t = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg1.tb, seg2.ta), v) / Phaser.Vec2Utils.dot(v, v); - t = t < 0 ? 0 : (t > 1 ? 1 : t); - break; - } - var minp1 = Phaser.Vec2Utils.multiplyAdd(seg1.ta, u, s); - var minp2 = Phaser.Vec2Utils.multiplyAdd(seg2.ta, v, t); - return this._circle2Circle(minp1, seg1.radius, minp2, seg2.radius, contactArr); - }; - Collision.prototype.findPointsBehindSeg = // Identify vertexes that have penetrated the segment. - function (contactArr, seg, poly, dist, coef) { - var dta = Phaser.Vec2Utils.cross(seg.tn, seg.ta); - var dtb = Phaser.Vec2Utils.cross(seg.tn, seg.tb); - var n = new Phaser.Vec2(); - Phaser.Vec2Utils.scale(seg.tn, coef, n); - //var n = vec2.scale(seg.tn, coef); - for(var i = 0; i < poly.verts.length; i++) { - var v = poly.tverts[i]; - if(Phaser.Vec2Utils.dot(v, n) < Phaser.Vec2Utils.dot(seg.tn, seg.ta) * coef + seg.radius) { - var dt = Phaser.Vec2Utils.cross(seg.tn, v); - if(dta >= dt && dt >= dtb) { - contactArr.push(new Physics.Contact(v, n, dist, (poly.id << 16) | i)); - } - } - } - }; - Collision.prototype.segment2Poly = function (seg, poly, contactArr) { - var seg_td = Phaser.Vec2Utils.dot(seg.tn, seg.ta); - var seg_d1 = poly.distanceOnPlane(seg.tn, seg_td) - seg.radius; - if(seg_d1 > 0) { - return 0; - } - var n = new Phaser.Vec2(); - Phaser.Vec2Utils.negative(seg.tn, n); - var seg_d2 = poly.distanceOnPlane(n, -seg_td) - seg.radius; - //var seg_d2 = poly.distanceOnPlane(vec2.neg(seg.tn), -seg_td) - seg.r; - if(seg_d2 > 0) { - return 0; - } - var poly_d = -999999; - var poly_i = -1; - for(var i = 0; i < poly.verts.length; i++) { - var plane = poly.tplanes[i]; - var dist = seg.distanceOnPlane(plane.normal, plane.d); - if(dist > 0) { - return 0; - } - if(dist > poly_d) { - poly_d = dist; - poly_i = i; - } - } - var poly_n = new Phaser.Vec2(); - Phaser.Vec2Utils.negative(poly.tplanes[poly_i].normal, poly_n); - //var poly_n = vec2.neg(poly.tplanes[poly_i].n); - var va = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(seg.ta, poly_n, seg.radius, va); - //var va = vec2.mad(seg.ta, poly_n, seg.r); - var vb = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(seg.tb, poly_n, seg.radius, vb); - //var vb = vec2.mad(seg.tb, poly_n, seg.r); - if(poly.containPoint(va)) { - contactArr.push(new Physics.Contact(va, poly_n, poly_d, (seg.id << 16) | 0)); - } - if(poly.containPoint(vb)) { - contactArr.push(new Physics.Contact(vb, poly_n, poly_d, (seg.id << 16) | 1)); - } - // Floating point precision problems here. - // This will have to do for now. - poly_d -= 0.1; - if(seg_d1 >= poly_d || seg_d2 >= poly_d) { - if(seg_d1 > seg_d2) { - this.findPointsBehindSeg(contactArr, seg, poly, seg_d1, 1); - } else { - this.findPointsBehindSeg(contactArr, seg, poly, seg_d2, -1); - } - } - // If no other collision points are found, try colliding endpoints. - if(contactArr.length == 0) { - var poly_a = poly.tverts[poly_i]; - var poly_b = poly.tverts[(poly_i + 1) % poly.verts.length]; - if(this._circle2Circle(seg.ta, seg.radius, poly_a, 0, contactArr)) { - return 1; - } - if(this._circle2Circle(seg.tb, seg.radius, poly_a, 0, contactArr)) { - return 1; - } - if(this._circle2Circle(seg.ta, seg.radius, poly_b, 0, contactArr)) { - return 1; - } - if(this._circle2Circle(seg.tb, seg.radius, poly_b, 0, contactArr)) { - return 1; - } - } - return contactArr.length; - }; - Collision.prototype.findMSA = // Find the minimum separating axis for the given poly and plane list. - function (poly, planes, num) { - var min_dist = -999999; - var min_index = -1; - for(var i = 0; i < num; i++) { - var dist = poly.distanceOnPlane(planes[i].normal, planes[i].d); - if(dist > 0) { - // no collision - return { - dist: 0, - index: -1 - }; - } else if(dist > min_dist) { - min_dist = dist; - min_index = i; - } - } - // new object - see what we can do here - return { - dist: min_dist, - index: min_index - }; - }; - Collision.prototype.findVertsFallback = function (contactArr, poly1, poly2, n, dist) { - var num = 0; - for(var i = 0; i < poly1.verts.length; i++) { - var v = poly1.tverts[i]; - if(poly2.containPointPartial(v, n)) { - contactArr.push(new Physics.Contact(v, n, dist, (poly1.id << 16) | i)); - num++; - } - } - for(var i = 0; i < poly2.verts.length; i++) { - var v = poly2.tverts[i]; - if(poly1.containPointPartial(v, n)) { - contactArr.push(new Physics.Contact(v, n, dist, (poly2.id << 16) | i)); - num++; - } - } - return num; - }; - Collision.prototype.findVerts = // Find the overlapped vertices. - function (contactArr, poly1, poly2, n, dist) { - var num = 0; - for(var i = 0; i < poly1.verts.length; i++) { - var v = poly1.tverts[i]; - if(poly2.containPoint(v)) { - contactArr.push(new Physics.Contact(v, n, dist, (poly1.id << 16) | i)); - num++; - } - } - for(var i = 0; i < poly2.verts.length; i++) { - var v = poly2.tverts[i]; - if(poly1.containPoint(v)) { - contactArr.push(new Physics.Contact(v, n, dist, (poly2.id << 16) | i)); - num++; - } - } - return num > 0 ? num : this.findVertsFallback(contactArr, poly1, poly2, n, dist); - }; - Collision.prototype.poly2Poly = function (poly1, poly2, contactArr) { - var msa1 = this.findMSA(poly2, poly1.tplanes, poly1.verts.length); - if(msa1.index == -1) { - console.log('poly2poly 0', msa1); - return 0; - } - var msa2 = this.findMSA(poly1, poly2.tplanes, poly2.verts.length); - if(msa2.index == -1) { - console.log('poly2poly 1', msa2); - return 0; - } - // Penetration normal direction should be from poly1 to poly2 - if(msa1.dist > msa2.dist) { - return this.findVerts(contactArr, poly1, poly2, poly1.tplanes[msa1.index].normal, msa1.dist); - } - return this.findVerts(contactArr, poly1, poly2, Phaser.Vec2Utils.negative(poly2.tplanes[msa2.index].normal), msa2.dist); - }; - return Collision; - })(); - Physics.Collision = Collision; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Collision.ts b/wip/physics/Collision.ts deleted file mode 100644 index 3cb00ebd..00000000 --- a/wip/physics/Collision.ts +++ /dev/null @@ -1,559 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Collision Handlers -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Collision { - - public collide(a, b, contacts: Contact[]) { - - // Circle (a is the circle) - if (a.type == AdvancedPhysics.SHAPE_TYPE_CIRCLE) - { - if (b.type == AdvancedPhysics.SHAPE_TYPE_CIRCLE) - { - return this.circle2Circle(a, b, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_SEGMENT) - { - return this.circle2Segment(a, b, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_POLY) - { - return this.circle2Poly(a, b, contacts); - } - } - - // Segment (a is the segment) - if (a.type == AdvancedPhysics.SHAPE_TYPE_SEGMENT) - { - if (b.type == AdvancedPhysics.SHAPE_TYPE_CIRCLE) - { - return this.circle2Segment(b, a, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_SEGMENT) - { - return this.segment2Segment(a, b, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_POLY) - { - return this.segment2Poly(a, b, contacts); - } - } - - // Poly (a is the poly) - if (a.type == AdvancedPhysics.SHAPE_TYPE_POLY) - { - if (b.type == AdvancedPhysics.SHAPE_TYPE_CIRCLE) - { - return this.circle2Poly(b, a, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_SEGMENT) - { - return this.segment2Poly(b, a, contacts); - } - else if (b.type == AdvancedPhysics.SHAPE_TYPE_POLY) - { - return this.poly2Poly(a, b, contacts); - } - } - - } - - private _circle2Circle(c1, r1, c2, r2, contactArr) { - - var rmax = r1 + r2; - - var t: Phaser.Vec2 = new Phaser.Vec2; - //var t = vec2.sub(c2, c1); - Phaser.Vec2Utils.subtract(c2, c1, t); - - var distsq = t.lengthSq(); - - if (distsq > rmax * rmax) - { - return 0; - } - - var dist = Math.sqrt(distsq); - - var p: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.multiplyAdd(c1, t, 0.5 + (r1 - r2) * 0.5 / dist, p); - //var p = vec2.mad(c1, t, 0.5 + (r1 - r2) * 0.5 / dist); - - var n: Phaser.Vec2 = new Phaser.Vec2; - //var n = (dist != 0) ? vec2.scale(t, 1 / dist) : vec2.zero; - - if (dist != 0) - { - Phaser.Vec2Utils.scale(t, 1 / dist, n); - } - - var d = dist - rmax; - - contactArr.push(new Contact(p, n, d, 0)); - - return 1; - - } - - public circle2Circle(circ1: Phaser.Physics.Shapes.Circle, circ2: Phaser.Physics.Shapes.Circle, contactArr: Contact[]) { - return this._circle2Circle(circ1.tc, circ1.radius, circ2.tc, circ2.radius, contactArr); - } - - public circle2Segment(circ: Phaser.Physics.Shapes.Circle, seg: Phaser.Physics.Shapes.Segment, contactArr: Contact[]) { - - var rsum = circ.radius + seg.radius; - - // Normal distance from segment - var dn = Phaser.Vec2Utils.dot(circ.tc, seg.tn) - Phaser.Vec2Utils.dot(seg.ta, seg.tn); - var dist = (dn < 0 ? dn * -1 : dn) - rsum; - if (dist > 0) - { - return 0; - } - - // Tangential distance along segment - var dt = Phaser.Vec2Utils.cross(circ.tc, seg.tn); - var dtMin = Phaser.Vec2Utils.cross(seg.ta, seg.tn); - var dtMax = Phaser.Vec2Utils.cross(seg.tb, seg.tn); - - if (dt < dtMin) - { - if (dt < dtMin - rsum) - { - return 0; - } - - return this._circle2Circle(circ.tc, circ.radius, seg.ta, seg.radius, contactArr); - } - else if (dt > dtMax) - { - if (dt > dtMax + rsum) - { - return 0; - } - - return this._circle2Circle(circ.tc, circ.radius, seg.tb, seg.radius, contactArr); - } - - var n: Phaser.Vec2 = new Phaser.Vec2; - - if (dn > 0) - { - n.copyFrom(seg.tn); - } - else - { - Phaser.Vec2Utils.negative(seg.tn, n); - } - //var n = (dn > 0) ? seg.tn : vec2.neg(seg.tn); - - var c1: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.multiplyAdd(circ.tc, n, -(circ.radius + dist * 0.5), c1); - - var c2: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.negative(n, c2); - - contactArr.push(new Contact(c1, c2, dist, 0)); - //contactArr.push(new Contact(vec2.mad(circ.tc, n, -(circ.r + dist * 0.5)), vec2.neg(n), dist, 0)); - - return 1; - - } - - public circle2Poly(circ: Phaser.Physics.Shapes.Circle, poly: Phaser.Physics.Shapes.Poly, contactArr: Contact[]) { - - var minDist = -999999; - var minIdx = -1; - - for (var i = 0; i < poly.verts.length; i++) - { - var plane = poly.tplanes[i]; - var dist = Phaser.Vec2Utils.dot(circ.tc, plane.normal) - plane.d - circ.radius; - - if (dist > 0) - { - return 0; - } - else if (dist > minDist) - { - minDist = dist; - minIdx = i; - } - } - - var n = poly.tplanes[minIdx].normal; - var a = poly.tverts[minIdx]; - var b = poly.tverts[(minIdx + 1) % poly.verts.length]; - var dta = Phaser.Vec2Utils.cross(a, n); - var dtb = Phaser.Vec2Utils.cross(b, n); - var dt = Phaser.Vec2Utils.cross(circ.tc, n); - - if (dt > dta) - { - return this._circle2Circle(circ.tc, circ.radius, a, 0, contactArr); - } - else if (dt < dtb) - { - return this._circle2Circle(circ.tc, circ.radius, b, 0, contactArr); - } - - var c1: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.multiplyAdd(circ.tc, n, -(circ.radius + minDist * 0.5), c1); - - var c2: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.negative(n, c2); - - contactArr.push(new Contact(c1, c2, minDist, 0)); - - //contactArr.push(new Contact(vec2.mad(circ.tc, n, -(circ.r + minDist * 0.5)), vec2.neg(n), minDist, 0)); - - return 1; - - } - - public segmentPointDistanceSq(seg: Phaser.Physics.Shapes.Segment, p) { - - var w: Phaser.Vec2 = new Phaser.Vec2; - var d: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.subtract(p, seg.ta, w); - Phaser.Vec2Utils.subtract(seg.tb, seg.ta, d); - - //var w = vec2.sub(p, seg.ta); - //var d = vec2.sub(seg.tb, seg.ta); - - var proj = w.dot(d); - - if (proj <= 0) - { - return w.dot(w); - } - - var vsq = d.dot(d); - - if (proj >= vsq) - { - return w.dot(w) - 2 * proj + vsq; - } - - return w.dot(w) - proj * proj / vsq; - - } - - // FIXME and optimise me lots!!! - public segment2Segment(seg1: Phaser.Physics.Shapes.Segment, seg2: Phaser.Physics.Shapes.Segment, contactArr: Contact[]) { - - var d = []; - d[0] = this.segmentPointDistanceSq(seg1, seg2.ta); - d[1] = this.segmentPointDistanceSq(seg1, seg2.tb); - d[2] = this.segmentPointDistanceSq(seg2, seg1.ta); - d[3] = this.segmentPointDistanceSq(seg2, seg1.tb); - - var idx1 = d[0] < d[1] ? 0 : 1; - var idx2 = d[2] < d[3] ? 2 : 3; - var idxm = d[idx1] < d[idx2] ? idx1 : idx2; - var s, t; - - var u = Phaser.Vec2Utils.subtract(seg1.tb, seg1.ta); - var v = Phaser.Vec2Utils.subtract(seg2.tb, seg2.ta); - - switch (idxm) - { - case 0: - s = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg2.ta, seg1.ta), u) / Phaser.Vec2Utils.dot(u, u); - s = s < 0 ? 0 : (s > 1 ? 1 : s); - t = 0; - break; - case 1: - s = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg2.tb, seg1.ta), u) / Phaser.Vec2Utils.dot(u, u); - s = s < 0 ? 0 : (s > 1 ? 1 : s); - t = 1; - break; - case 2: - s = 0; - t = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg1.ta, seg2.ta), v) / Phaser.Vec2Utils.dot(v, v); - t = t < 0 ? 0 : (t > 1 ? 1 : t); - break; - case 3: - s = 1; - t = Phaser.Vec2Utils.dot(Phaser.Vec2Utils.subtract(seg1.tb, seg2.ta), v) / Phaser.Vec2Utils.dot(v, v); - t = t < 0 ? 0 : (t > 1 ? 1 : t); - break; - } - - var minp1 = Phaser.Vec2Utils.multiplyAdd(seg1.ta, u, s); - var minp2 = Phaser.Vec2Utils.multiplyAdd(seg2.ta, v, t); - - return this._circle2Circle(minp1, seg1.radius, minp2, seg2.radius, contactArr); - - } - - // Identify vertexes that have penetrated the segment. - public findPointsBehindSeg(contactArr: Contact[], seg: Phaser.Physics.Shapes.Segment, poly: Phaser.Physics.Shapes.Poly, dist: number, coef: number) { - - var dta = Phaser.Vec2Utils.cross(seg.tn, seg.ta); - var dtb = Phaser.Vec2Utils.cross(seg.tn, seg.tb); - - var n: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.scale(seg.tn, coef, n); - //var n = vec2.scale(seg.tn, coef); - - for (var i = 0; i < poly.verts.length; i++) - { - var v = poly.tverts[i]; - - if (Phaser.Vec2Utils.dot(v, n) < Phaser.Vec2Utils.dot(seg.tn, seg.ta) * coef + seg.radius) - { - var dt = Phaser.Vec2Utils.cross(seg.tn, v); - - if (dta >= dt && dt >= dtb) - { - contactArr.push(new Contact(v, n, dist, (poly.id << 16) | i)); - } - } - } - } - - public segment2Poly(seg: Phaser.Physics.Shapes.Segment, poly: Phaser.Physics.Shapes.Poly, contactArr: Contact[]) { - - var seg_td = Phaser.Vec2Utils.dot(seg.tn, seg.ta); - var seg_d1 = poly.distanceOnPlane(seg.tn, seg_td) - seg.radius; - - if (seg_d1 > 0) - { - return 0; - } - - var n: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.negative(seg.tn, n); - var seg_d2 = poly.distanceOnPlane(n, -seg_td) - seg.radius; - //var seg_d2 = poly.distanceOnPlane(vec2.neg(seg.tn), -seg_td) - seg.r; - - if (seg_d2 > 0) - { - return 0; - } - - var poly_d = -999999; - var poly_i = -1; - - for (var i = 0; i < poly.verts.length; i++) - { - var plane = poly.tplanes[i]; - var dist = seg.distanceOnPlane(plane.normal, plane.d); - - if (dist > 0) - { - return 0; - } - - if (dist > poly_d) - { - poly_d = dist; - poly_i = i; - } - } - - var poly_n: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.negative(poly.tplanes[poly_i].normal, poly_n); - //var poly_n = vec2.neg(poly.tplanes[poly_i].n); - - var va: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.multiplyAdd(seg.ta, poly_n, seg.radius, va); - //var va = vec2.mad(seg.ta, poly_n, seg.r); - - var vb: Phaser.Vec2 = new Phaser.Vec2; - Phaser.Vec2Utils.multiplyAdd(seg.tb, poly_n, seg.radius, vb); - //var vb = vec2.mad(seg.tb, poly_n, seg.r); - - if (poly.containPoint(va)) - { - contactArr.push(new Contact(va, poly_n, poly_d, (seg.id << 16) | 0)); - } - - if (poly.containPoint(vb)) - { - contactArr.push(new Contact(vb, poly_n, poly_d, (seg.id << 16) | 1)); - } - - // Floating point precision problems here. - // This will have to do for now. - poly_d -= 0.1 - - if (seg_d1 >= poly_d || seg_d2 >= poly_d) - { - if (seg_d1 > seg_d2) - { - this.findPointsBehindSeg(contactArr, seg, poly, seg_d1, 1); - } - else - { - this.findPointsBehindSeg(contactArr, seg, poly, seg_d2, -1); - } - } - - // If no other collision points are found, try colliding endpoints. - if (contactArr.length == 0) - { - var poly_a = poly.tverts[poly_i]; - var poly_b = poly.tverts[(poly_i + 1) % poly.verts.length]; - - if (this._circle2Circle(seg.ta, seg.radius, poly_a, 0, contactArr)) - { - return 1; - } - - if (this._circle2Circle(seg.tb, seg.radius, poly_a, 0, contactArr)) - { - return 1; - } - - if (this._circle2Circle(seg.ta, seg.radius, poly_b, 0, contactArr)) - { - return 1; - } - - if (this._circle2Circle(seg.tb, seg.radius, poly_b, 0, contactArr)) - { - return 1; - } - } - - return contactArr.length; - - } - - // Find the minimum separating axis for the given poly and plane list. - public findMSA(poly: Phaser.Physics.Shapes.Poly, planes: Phaser.Physics.Plane[], num: number) { - - var min_dist: number = -999999; - var min_index: number = -1; - - for (var i: number = 0; i < num; i++) - { - var dist: number = poly.distanceOnPlane(planes[i].normal, planes[i].d); - - if (dist > 0) - { - // no collision - return { dist: 0, index: -1 }; - } - else if (dist > min_dist) - { - min_dist = dist; - min_index = i; - } - } - - // new object - see what we can do here - return { dist: min_dist, index: min_index }; - - } - - public findVertsFallback(contactArr: Contact[], poly1: Phaser.Physics.Shapes.Poly, poly2: Phaser.Physics.Shapes.Poly, n, dist: number) { - - var num = 0; - - for (var i = 0; i < poly1.verts.length; i++) - { - var v = poly1.tverts[i]; - - if (poly2.containPointPartial(v, n)) - { - contactArr.push(new Contact(v, n, dist, (poly1.id << 16) | i)); - num++; - } - } - - for (var i = 0; i < poly2.verts.length; i++) - { - var v = poly2.tverts[i]; - - if (poly1.containPointPartial(v, n)) - { - contactArr.push(new Contact(v, n, dist, (poly2.id << 16) | i)); - num++; - } - } - - return num; - - } - - // Find the overlapped vertices. - public findVerts(contactArr: Contact[], poly1: Phaser.Physics.Shapes.Poly, poly2: Phaser.Physics.Shapes.Poly, n, dist: number) { - - var num = 0; - - for (var i = 0; i < poly1.verts.length; i++) - { - var v = poly1.tverts[i]; - - if (poly2.containPoint(v)) - { - contactArr.push(new Contact(v, n, dist, (poly1.id << 16) | i)); - num++; - } - } - - for (var i = 0; i < poly2.verts.length; i++) - { - var v = poly2.tverts[i]; - - if (poly1.containPoint(v)) - { - contactArr.push(new Contact(v, n, dist, (poly2.id << 16) | i)); - num++; - } - } - - return num > 0 ? num : this.findVertsFallback(contactArr, poly1, poly2, n, dist); - - } - - public poly2Poly(poly1: Phaser.Physics.Shapes.Poly, poly2: Phaser.Physics.Shapes.Poly, contactArr: Contact[]) { - - var msa1 = this.findMSA(poly2, poly1.tplanes, poly1.verts.length); - - if (msa1.index == -1) - { - console.log('poly2poly 0', msa1); - return 0; - } - - var msa2 = this.findMSA(poly1, poly2.tplanes, poly2.verts.length); - - if (msa2.index == -1) - { - console.log('poly2poly 1', msa2); - return 0; - } - - // Penetration normal direction should be from poly1 to poly2 - if (msa1.dist > msa2.dist) - { - return this.findVerts(contactArr, poly1, poly2, poly1.tplanes[msa1.index].normal, msa1.dist); - } - - return this.findVerts(contactArr, poly1, poly2, Phaser.Vec2Utils.negative(poly2.tplanes[msa2.index].normal), msa2.dist); - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/Contact.js b/wip/physics/Contact.js deleted file mode 100644 index 61569c60..00000000 --- a/wip/physics/Contact.js +++ /dev/null @@ -1,32 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Contact - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Contact = (function () { - function Contact(p, n, d, hash) { - this.hash = hash; - this.point = p; - this.normal = n; - this.depth = d; - this.lambdaNormal = 0; - this.lambdaTangential = 0; - this.r1 = new Phaser.Vec2(); - this.r2 = new Phaser.Vec2(); - this.r1_local = new Phaser.Vec2(); - this.r2_local = new Phaser.Vec2(); - } - return Contact; - })(); - Physics.Contact = Contact; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Contact.ts b/wip/physics/Contact.ts deleted file mode 100644 index fe6f544f..00000000 --- a/wip/physics/Contact.ts +++ /dev/null @@ -1,62 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Contact -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Contact { - - constructor(p, n, d, hash) { - - this.hash = hash; - this.point = p; - this.normal = n; - this.depth = d; - this.lambdaNormal = 0; - this.lambdaTangential = 0; - - this.r1 = new Phaser.Vec2; - this.r2 = new Phaser.Vec2; - this.r1_local = new Phaser.Vec2; - this.r2_local = new Phaser.Vec2; - - } - - public hash; - - // Linear velocities at contact point - public r1: Phaser.Vec2; - public r2: Phaser.Vec2; - public r1_local: Phaser.Vec2; - public r2_local: Phaser.Vec2; - // Bounce velocity - public bounce: number; - public emn: number; - public emt: number; - - // Contact point - public point; - - // Contact normal (toward shape2) - public normal: Phaser.Vec2; - - // Penetration depth (d < 0) - public depth; - - // Accumulated normal constraint impulse - public lambdaNormal; - - // Accumulated tangential constraint impulse - public lambdaTangential; - - } - -} diff --git a/wip/physics/ContactSolver.js b/wip/physics/ContactSolver.js deleted file mode 100644 index 203a8740..00000000 --- a/wip/physics/ContactSolver.js +++ /dev/null @@ -1,269 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - ContactSolver - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - //------------------------------------------------------------------------------------------------- - // Contact Constraint - // - // Non-penetration constraint: - // C = dot(p2 - p1, n) - // Cdot = dot(v2 - v1, n) - // J = [ -n, -cross(r1, n), n, cross(r2, n) ] - // - // impulse = JT * lambda = [ -n * lambda, -cross(r1, n) * lambda, n * lambda, cross(r1, n) * lambda ] - // - // Friction constraint: - // C = dot(p2 - p1, t) - // Cdot = dot(v2 - v1, t) - // J = [ -t, -cross(r1, t), t, cross(r2, t) ] - // - // impulse = JT * lambda = [ -t * lambda, -cross(r1, t) * lambda, t * lambda, cross(r1, t) * lambda ] - // - // NOTE: lambda is an impulse in constraint space. - //------------------------------------------------------------------------------------------------- - (function (Physics) { - var ContactSolver = (function () { - function ContactSolver(shape1, shape2) { - this.shape1 = shape1; - this.shape2 = shape2; - this.contacts = []; - this.elasticity = 1; - this.friction = 1; - } - ContactSolver.prototype.update = function (newContactArr) { - for(var i = 0; i < newContactArr.length; i++) { - var newContact = newContactArr[i]; - var k = -1; - for(var j = 0; j < this.contacts.length; j++) { - if(newContact.hash == this.contacts[j].hash) { - k = j; - break; - } - } - if(k > -1) { - newContact.lambdaNormal = this.contacts[k].lambdaNormal; - newContact.lambdaTangential = this.contacts[k].lambdaTangential; - } - } - this.contacts = newContactArr; - }; - ContactSolver.prototype.initSolver = function (dt_inv) { - var body1 = this.shape1.body; - var body2 = this.shape2.body; - var sum_m_inv = body1.massInverted + body2.massInverted; - for(var i = 0; i < this.contacts.length; i++) { - var con = this.contacts[i]; - //console.log('initSolver con'); - //console.log(con); - // Transformed r1, r2 - Phaser.Vec2Utils.subtract(con.point, body1.position, con.r1); - Phaser.Vec2Utils.subtract(con.point, body2.position, con.r2); - //con.r1 = vec2.sub(con.point, body1.p); - //con.r2 = vec2.sub(con.point, body2.p); - // Local r1, r2 - Phaser.TransformUtils.unrotate(body1.transform, con.r1, con.r1_local); - Phaser.TransformUtils.unrotate(body2.transform, con.r2, con.r2_local); - //con.r1_local = body1.transform.unrotate(con.r1); - //con.r2_local = body2.transform.unrotate(con.r2); - var n = con.normal; - var t = Phaser.Vec2Utils.perp(con.normal); - // invEMn = J * invM * JT - // J = [ -n, -cross(r1, n), n, cross(r2, n) ] - var sn1 = Phaser.Vec2Utils.cross(con.r1, n); - var sn2 = Phaser.Vec2Utils.cross(con.r2, n); - var emn_inv = sum_m_inv + body1.inertiaInverted * sn1 * sn1 + body2.inertiaInverted * sn2 * sn2; - con.emn = emn_inv == 0 ? 0 : 1 / emn_inv; - // invEMt = J * invM * JT - // J = [ -t, -cross(r1, t), t, cross(r2, t) ] - var st1 = Phaser.Vec2Utils.cross(con.r1, t); - var st2 = Phaser.Vec2Utils.cross(con.r2, t); - var emt_inv = sum_m_inv + body1.inertiaInverted * st1 * st1 + body2.inertiaInverted * st2 * st2; - con.emt = emt_inv == 0 ? 0 : 1 / emt_inv; - // Linear velocities at contact point - // in 2D: cross(w, r) = perp(r) * w - var v1 = new Phaser.Vec2(); - var v2 = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(body1.velocity, Phaser.Vec2Utils.perp(con.r1), body1.angularVelocity, v1); - Phaser.Vec2Utils.multiplyAdd(body2.velocity, Phaser.Vec2Utils.perp(con.r2), body2.angularVelocity, v2); - //var v1 = vec2.mad(body1.v, vec2.perp(con.r1), body1.w); - //var v2 = vec2.mad(body2.v, vec2.perp(con.r2), body2.w); - // relative velocity at contact point - var rv = new Phaser.Vec2(); - Phaser.Vec2Utils.subtract(v2, v1, rv); - //var rv = vec2.sub(v2, v1); - // bounce velocity dot n - con.bounce = Phaser.Vec2Utils.dot(rv, con.normal) * this.elasticity; - } - }; - ContactSolver.prototype.warmStart = function () { - var body1 = this.shape1.body; - var body2 = this.shape2.body; - for(var i = 0; i < this.contacts.length; i++) { - var con = this.contacts[i]; - var n = con.normal; - var lambda_n = con.lambdaNormal; - var lambda_t = con.lambdaTangential; - // Apply accumulated impulses - //var impulse = vec2.rotate_vec(new vec2(lambda_n, lambda_t), n); - //var impulse = new vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - var impulse = new Phaser.Vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - //console.log('phaser warmStart impulse ' + i + ' = ' + impulse.toString()); - body1.velocity.multiplyAddByScalar(impulse, -body1.massInverted); - //body1.v.mad(impulse, -body1.m_inv); - body1.angularVelocity -= Phaser.Vec2Utils.cross(con.r1, impulse) * body1.inertiaInverted; - //body1.w -= vec2.cross(con.r1, impulse) * body1.i_inv; - body2.velocity.multiplyAddByScalar(impulse, body2.massInverted); - //body2.v.mad(impulse, body2.m_inv); - body2.angularVelocity += Phaser.Vec2Utils.cross(con.r2, impulse) * body2.inertiaInverted; - //body2.w += vec2.cross(con.r2, impulse) * body2.i_inv; - } - }; - ContactSolver.prototype.solveVelocityConstraints = function () { - var body1 = this.shape1.body; - var body2 = this.shape2.body; - Physics.AdvancedPhysics.write('solveVelocityConstraints. Body1: ' + body1.name + ' Body2: ' + body2.name); - Physics.AdvancedPhysics.write('Shape 1: ' + this.shape1.type + ' Shape 2: ' + this.shape2.type); - var m1_inv = body1.massInverted; - var i1_inv = body1.inertiaInverted; - var m2_inv = body2.massInverted; - var i2_inv = body2.inertiaInverted; - Physics.AdvancedPhysics.write('m1_inv: ' + m1_inv); - Physics.AdvancedPhysics.write('i1_inv: ' + i1_inv); - Physics.AdvancedPhysics.write('m2_inv: ' + m2_inv); - Physics.AdvancedPhysics.write('i2_inv: ' + i2_inv); - for(var i = 0; i < this.contacts.length; i++) { - Physics.AdvancedPhysics.write('------------ solve con ' + i); - var con = this.contacts[i]; - var n = con.normal; - var t = Phaser.Vec2Utils.perp(n); - var r1 = con.r1; - var r2 = con.r2; - // Linear velocities at contact point - // in 2D: cross(w, r) = perp(r) * w - var v1 = new Phaser.Vec2(); - var v2 = new Phaser.Vec2(); - Phaser.Vec2Utils.multiplyAdd(body1.velocity, Phaser.Vec2Utils.perp(r1), body1.angularVelocity, v1); - //var v1 = vec2.mad(body1.v, vec2.perp(r1), body1.w); - Physics.AdvancedPhysics.write('v1 ' + v1.toString()); - Phaser.Vec2Utils.multiplyAdd(body2.velocity, Phaser.Vec2Utils.perp(r2), body2.angularVelocity, v2); - //var v2 = vec2.mad(body2.v, vec2.perp(r2), body2.w); - Physics.AdvancedPhysics.write('v2 ' + v2.toString()); - // Relative velocity at contact point - var rv = new Phaser.Vec2(); - Phaser.Vec2Utils.subtract(v2, v1, rv); - //var rv = vec2.sub(v2, v1); - Physics.AdvancedPhysics.write('rv ' + rv.toString()); - // Compute normal constraint impulse + adding bounce as a velocity bias - // lambda_n = -EMn * J * V - var lambda_n = -con.emn * (Phaser.Vec2Utils.dot(n, rv) + con.bounce); - Physics.AdvancedPhysics.write('lambda_n: ' + lambda_n); - // Accumulate and clamp - var lambda_n_old = con.lambdaNormal; - con.lambdaNormal = Math.max(lambda_n_old + lambda_n, 0); - //con.lambdaNormal = this.clamp(lambda_n_old + lambda_n, 0); - lambda_n = con.lambdaNormal - lambda_n_old; - Physics.AdvancedPhysics.write('lambda_n clamped: ' + lambda_n); - // Compute frictional constraint impulse - // lambda_t = -EMt * J * V - var lambda_t = -con.emt * Phaser.Vec2Utils.dot(t, rv); - // Max friction constraint impulse (Coulomb's Law) - var lambda_t_max = con.lambdaNormal * this.friction; - // Accumulate and clamp - var lambda_t_old = con.lambdaTangential; - con.lambdaTangential = this.clamp(lambda_t_old + lambda_t, -lambda_t_max, lambda_t_max); - lambda_t = con.lambdaTangential - lambda_t_old; - // Apply the final impulses - //var impulse = vec2.rotate_vec(new vec2(lambda_n, lambda_t), n); - var impulse = new Phaser.Vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - Physics.AdvancedPhysics.write('impulse: ' + impulse.toString()); - body1.velocity.multiplyAddByScalar(impulse, -m1_inv); - //body1.v.mad(impulse, -m1_inv); - body1.angularVelocity -= Phaser.Vec2Utils.cross(r1, impulse) * i1_inv; - //body1.w -= vec2.cross(r1, impulse) * i1_inv; - body2.velocity.multiplyAddByScalar(impulse, m2_inv); - //body2.v.mad(impulse, m2_inv); - body2.angularVelocity += Phaser.Vec2Utils.cross(r2, impulse) * i2_inv; - //body2.w += vec2.cross(r2, impulse) * i2_inv; - Physics.AdvancedPhysics.write('body1: ' + body1.toString()); - Physics.AdvancedPhysics.write('body2: ' + body2.toString()); - } - }; - ContactSolver.prototype.solvePositionConstraints = function () { - var body1 = this.shape1.body; - var body2 = this.shape2.body; - Physics.AdvancedPhysics.write('solvePositionConstraints'); - var m1_inv = body1.massInverted; - var i1_inv = body1.inertiaInverted; - var m2_inv = body2.massInverted; - var i2_inv = body2.inertiaInverted; - var sum_m_inv = m1_inv + m2_inv; - var max_penetration = 0; - for(var i = 0; i < this.contacts.length; i++) { - Physics.AdvancedPhysics.write('------------- solvePositionConstraints ' + i); - var con = this.contacts[i]; - var n = con.normal; - var r1 = new Phaser.Vec2(); - var r2 = new Phaser.Vec2(); - // Transformed r1, r2 - Phaser.Vec2Utils.rotate(con.r1_local, body1.angle, r1); - Phaser.Vec2Utils.rotate(con.r2_local, body2.angle, r2); - Physics.AdvancedPhysics.write('r1_local.x = ' + con.r1_local.x + ' r1_local.y = ' + con.r1_local.y + ' angle: ' + body1.angle); - Physics.AdvancedPhysics.write('r1 rotated: r1.x = ' + r1.x + ' r1.y = ' + r1.y); - Physics.AdvancedPhysics.write('r2_local.x = ' + con.r2_local.x + ' r2_local.y = ' + con.r2_local.y + ' angle: ' + body2.angle); - Physics.AdvancedPhysics.write('r2 rotated: r2.x = ' + r2.x + ' r2.y = ' + r2.y); - // Contact points (corrected) - var p1 = new Phaser.Vec2(); - var p2 = new Phaser.Vec2(); - Phaser.Vec2Utils.add(body1.position, r1, p1); - Phaser.Vec2Utils.add(body2.position, r2, p2); - Physics.AdvancedPhysics.write('body1.pos.x=' + body1.position.x + ' y=' + body1.position.y); - Physics.AdvancedPhysics.write('body2.pos.x=' + body2.position.x + ' y=' + body2.position.y); - // Corrected delta vector - var dp = new Phaser.Vec2(); - Phaser.Vec2Utils.subtract(p2, p1, dp); - // Position constraint - var c = Phaser.Vec2Utils.dot(dp, n) + con.depth; - var correction = this.clamp(Physics.AdvancedPhysics.CONTACT_SOLVER_BAUMGARTE * (c + Physics.AdvancedPhysics.CONTACT_SOLVER_COLLISION_SLOP), -Physics.AdvancedPhysics.CONTACT_SOLVER_MAX_LINEAR_CORRECTION, 0); - if(correction == 0) { - continue; - } - // We don't need max_penetration less than or equal slop - max_penetration = Math.max(max_penetration, -c); - // Compute lambda for position constraint - // Solve (J * invM * JT) * lambda = -C / dt - var sn1 = Phaser.Vec2Utils.cross(r1, n); - var sn2 = Phaser.Vec2Utils.cross(r2, n); - var em_inv = sum_m_inv + body1.inertiaInverted * sn1 * sn1 + body2.inertiaInverted * sn2 * sn2; - var lambda_dt = em_inv == 0 ? 0 : -correction / em_inv; - // Apply correction impulses - var impulse_dt = new Phaser.Vec2(); - Phaser.Vec2Utils.scale(n, lambda_dt, impulse_dt); - body1.position.multiplyAddByScalar(impulse_dt, -m1_inv); - body1.angle -= sn1 * lambda_dt * i1_inv; - body2.position.multiplyAddByScalar(impulse_dt, m2_inv); - body2.angle += sn2 * lambda_dt * i2_inv; - Physics.AdvancedPhysics.write('body1.pos.x=' + body1.position.x + ' y=' + body1.position.y); - Physics.AdvancedPhysics.write('body2.pos.x=' + body2.position.x + ' y=' + body2.position.y); - } - Physics.AdvancedPhysics.write('max_penetration: ' + max_penetration); - return max_penetration <= Physics.AdvancedPhysics.CONTACT_SOLVER_COLLISION_SLOP * 3; - }; - ContactSolver.prototype.clamp = function (v, min, max) { - return v < min ? min : (v > max ? max : v); - }; - return ContactSolver; - })(); - Physics.ContactSolver = ContactSolver; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/ContactSolver.ts b/wip/physics/ContactSolver.ts deleted file mode 100644 index 675e8b6b..00000000 --- a/wip/physics/ContactSolver.ts +++ /dev/null @@ -1,386 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - ContactSolver -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -//------------------------------------------------------------------------------------------------- -// Contact Constraint -// -// Non-penetration constraint: -// C = dot(p2 - p1, n) -// Cdot = dot(v2 - v1, n) -// J = [ -n, -cross(r1, n), n, cross(r2, n) ] -// -// impulse = JT * lambda = [ -n * lambda, -cross(r1, n) * lambda, n * lambda, cross(r1, n) * lambda ] -// -// Friction constraint: -// C = dot(p2 - p1, t) -// Cdot = dot(v2 - v1, t) -// J = [ -t, -cross(r1, t), t, cross(r2, t) ] -// -// impulse = JT * lambda = [ -t * lambda, -cross(r1, t) * lambda, t * lambda, cross(r1, t) * lambda ] -// -// NOTE: lambda is an impulse in constraint space. -//------------------------------------------------------------------------------------------------- - -module Phaser.Physics { - - export class ContactSolver { - - constructor(shape1, shape2) { - - this.shape1 = shape1; - this.shape2 = shape2; - - this.contacts = []; - this.elasticity = 1; - this.friction = 1; - - } - - public shape1; - public shape2; - - // Contact list - public contacts: Contact[]; - - // Coefficient of restitution (elasticity) - public elasticity: number; - - // Frictional coefficient - public friction: number; - - public update(newContactArr: Contact[]) { - - for (var i = 0; i < newContactArr.length; i++) - { - var newContact = newContactArr[i]; - var k = -1; - - for (var j = 0; j < this.contacts.length; j++) - { - if (newContact.hash == this.contacts[j].hash) - { - k = j; - break; - } - } - - if (k > -1) - { - newContact.lambdaNormal = this.contacts[k].lambdaNormal; - newContact.lambdaTangential = this.contacts[k].lambdaTangential; - } - } - - this.contacts = newContactArr; - - } - - public initSolver(dt_inv) { - - var body1: Body = this.shape1.body; - var body2: Body = this.shape2.body; - - var sum_m_inv = body1.massInverted + body2.massInverted; - - for (var i = 0; i < this.contacts.length; i++) - { - var con: Contact = this.contacts[i]; - - //console.log('initSolver con'); - //console.log(con); - - // Transformed r1, r2 - Phaser.Vec2Utils.subtract(con.point, body1.position, con.r1); - Phaser.Vec2Utils.subtract(con.point, body2.position, con.r2); - //con.r1 = vec2.sub(con.point, body1.p); - //con.r2 = vec2.sub(con.point, body2.p); - - // Local r1, r2 - Phaser.TransformUtils.unrotate(body1.transform, con.r1, con.r1_local); - Phaser.TransformUtils.unrotate(body2.transform, con.r2, con.r2_local); - //con.r1_local = body1.transform.unrotate(con.r1); - //con.r2_local = body2.transform.unrotate(con.r2); - - var n = con.normal; - var t = Phaser.Vec2Utils.perp(con.normal); - - // invEMn = J * invM * JT - // J = [ -n, -cross(r1, n), n, cross(r2, n) ] - var sn1 = Phaser.Vec2Utils.cross(con.r1, n); - var sn2 = Phaser.Vec2Utils.cross(con.r2, n); - var emn_inv = sum_m_inv + body1.inertiaInverted * sn1 * sn1 + body2.inertiaInverted * sn2 * sn2; - con.emn = emn_inv == 0 ? 0 : 1 / emn_inv; - - // invEMt = J * invM * JT - // J = [ -t, -cross(r1, t), t, cross(r2, t) ] - var st1 = Phaser.Vec2Utils.cross(con.r1, t); - var st2 = Phaser.Vec2Utils.cross(con.r2, t); - var emt_inv = sum_m_inv + body1.inertiaInverted * st1 * st1 + body2.inertiaInverted * st2 * st2; - con.emt = emt_inv == 0 ? 0 : 1 / emt_inv; - - // Linear velocities at contact point - // in 2D: cross(w, r) = perp(r) * w - - var v1 = new Phaser.Vec2; - var v2 = new Phaser.Vec2; - - Phaser.Vec2Utils.multiplyAdd(body1.velocity, Phaser.Vec2Utils.perp(con.r1), body1.angularVelocity, v1); - Phaser.Vec2Utils.multiplyAdd(body2.velocity, Phaser.Vec2Utils.perp(con.r2), body2.angularVelocity, v2); - //var v1 = vec2.mad(body1.v, vec2.perp(con.r1), body1.w); - //var v2 = vec2.mad(body2.v, vec2.perp(con.r2), body2.w); - - // relative velocity at contact point - var rv = new Phaser.Vec2; - Phaser.Vec2Utils.subtract(v2, v1, rv); - //var rv = vec2.sub(v2, v1); - - // bounce velocity dot n - con.bounce = Phaser.Vec2Utils.dot(rv, con.normal) * this.elasticity; - - } - } - - public warmStart() { - - var body1: Body = this.shape1.body; - var body2: Body = this.shape2.body; - - for (var i = 0; i < this.contacts.length; i++) - { - var con:Contact = this.contacts[i]; - var n = con.normal; - var lambda_n = con.lambdaNormal; - var lambda_t = con.lambdaTangential; - - // Apply accumulated impulses - //var impulse = vec2.rotate_vec(new vec2(lambda_n, lambda_t), n); - //var impulse = new vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - var impulse = new Phaser.Vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - - //console.log('phaser warmStart impulse ' + i + ' = ' + impulse.toString()); - - body1.velocity.multiplyAddByScalar(impulse, -body1.massInverted); - //body1.v.mad(impulse, -body1.m_inv); - - body1.angularVelocity -= Phaser.Vec2Utils.cross(con.r1, impulse) * body1.inertiaInverted; - //body1.w -= vec2.cross(con.r1, impulse) * body1.i_inv; - - body2.velocity.multiplyAddByScalar(impulse, body2.massInverted); - //body2.v.mad(impulse, body2.m_inv); - - body2.angularVelocity += Phaser.Vec2Utils.cross(con.r2, impulse) * body2.inertiaInverted; - //body2.w += vec2.cross(con.r2, impulse) * body2.i_inv; - } - - } - - public solveVelocityConstraints() { - - var body1: Body = this.shape1.body; - var body2: Body = this.shape2.body; - - AdvancedPhysics.write('solveVelocityConstraints. Body1: ' + body1.name + ' Body2: ' + body2.name); - AdvancedPhysics.write('Shape 1: ' + this.shape1.type + ' Shape 2: ' + this.shape2.type); - - var m1_inv = body1.massInverted; - var i1_inv = body1.inertiaInverted; - var m2_inv = body2.massInverted; - var i2_inv = body2.inertiaInverted; - - AdvancedPhysics.write('m1_inv: ' + m1_inv); - AdvancedPhysics.write('i1_inv: ' + i1_inv); - AdvancedPhysics.write('m2_inv: ' + m2_inv); - AdvancedPhysics.write('i2_inv: ' + i2_inv); - - for (var i = 0; i < this.contacts.length; i++) - { - AdvancedPhysics.write('------------ solve con ' + i); - - var con: Contact = this.contacts[i]; - var n: Phaser.Vec2 = con.normal; - var t = Phaser.Vec2Utils.perp(n); - var r1 = con.r1; - var r2 = con.r2; - - // Linear velocities at contact point - // in 2D: cross(w, r) = perp(r) * w - - var v1 = new Phaser.Vec2; - var v2 = new Phaser.Vec2; - - Phaser.Vec2Utils.multiplyAdd(body1.velocity, Phaser.Vec2Utils.perp(r1), body1.angularVelocity, v1); - //var v1 = vec2.mad(body1.v, vec2.perp(r1), body1.w); - - AdvancedPhysics.write('v1 ' + v1.toString()); - - Phaser.Vec2Utils.multiplyAdd(body2.velocity, Phaser.Vec2Utils.perp(r2), body2.angularVelocity, v2); - //var v2 = vec2.mad(body2.v, vec2.perp(r2), body2.w); - - AdvancedPhysics.write('v2 ' + v2.toString()); - - // Relative velocity at contact point - var rv = new Phaser.Vec2; - Phaser.Vec2Utils.subtract(v2, v1, rv); - //var rv = vec2.sub(v2, v1); - - AdvancedPhysics.write('rv ' + rv.toString()); - - // Compute normal constraint impulse + adding bounce as a velocity bias - // lambda_n = -EMn * J * V - var lambda_n = -con.emn * (Phaser.Vec2Utils.dot(n, rv) + con.bounce); - - AdvancedPhysics.write('lambda_n: ' + lambda_n); - - // Accumulate and clamp - var lambda_n_old = con.lambdaNormal; - con.lambdaNormal = Math.max(lambda_n_old + lambda_n, 0); - //con.lambdaNormal = this.clamp(lambda_n_old + lambda_n, 0); - lambda_n = con.lambdaNormal - lambda_n_old; - - AdvancedPhysics.write('lambda_n clamped: ' + lambda_n); - - // Compute frictional constraint impulse - // lambda_t = -EMt * J * V - var lambda_t = -con.emt * Phaser.Vec2Utils.dot(t, rv); - - // Max friction constraint impulse (Coulomb's Law) - var lambda_t_max = con.lambdaNormal * this.friction; - - // Accumulate and clamp - var lambda_t_old = con.lambdaTangential; - con.lambdaTangential = this.clamp(lambda_t_old + lambda_t, -lambda_t_max, lambda_t_max); - lambda_t = con.lambdaTangential - lambda_t_old; - - // Apply the final impulses - //var impulse = vec2.rotate_vec(new vec2(lambda_n, lambda_t), n); - var impulse = new Phaser.Vec2(lambda_n * n.x - lambda_t * n.y, lambda_t * n.x + lambda_n * n.y); - - AdvancedPhysics.write('impulse: ' + impulse.toString()); - - body1.velocity.multiplyAddByScalar(impulse, -m1_inv); - //body1.v.mad(impulse, -m1_inv); - - body1.angularVelocity -= Phaser.Vec2Utils.cross(r1, impulse) * i1_inv; - //body1.w -= vec2.cross(r1, impulse) * i1_inv; - - body2.velocity.multiplyAddByScalar(impulse, m2_inv); - //body2.v.mad(impulse, m2_inv); - - body2.angularVelocity += Phaser.Vec2Utils.cross(r2, impulse) * i2_inv; - //body2.w += vec2.cross(r2, impulse) * i2_inv; - - AdvancedPhysics.write('body1: ' + body1.toString()); - AdvancedPhysics.write('body2: ' + body2.toString()); - - } - - } - - public solvePositionConstraints() { - - var body1: Body = this.shape1.body; - var body2: Body = this.shape2.body; - - AdvancedPhysics.write('solvePositionConstraints'); - - var m1_inv = body1.massInverted; - var i1_inv = body1.inertiaInverted; - var m2_inv = body2.massInverted; - var i2_inv = body2.inertiaInverted; - var sum_m_inv = m1_inv + m2_inv; - - var max_penetration = 0; - - for (var i = 0; i < this.contacts.length; i++) - { - AdvancedPhysics.write('------------- solvePositionConstraints ' + i); - - var con:Contact = this.contacts[i]; - var n:Phaser.Vec2 = con.normal; - - var r1 = new Phaser.Vec2; - var r2 = new Phaser.Vec2; - - // Transformed r1, r2 - Phaser.Vec2Utils.rotate(con.r1_local, body1.angle, r1); - Phaser.Vec2Utils.rotate(con.r2_local, body2.angle, r2); - - AdvancedPhysics.write('r1_local.x = ' + con.r1_local.x + ' r1_local.y = ' + con.r1_local.y + ' angle: ' + body1.angle); - AdvancedPhysics.write('r1 rotated: r1.x = ' + r1.x + ' r1.y = ' + r1.y); - AdvancedPhysics.write('r2_local.x = ' + con.r2_local.x + ' r2_local.y = ' + con.r2_local.y + ' angle: ' + body2.angle); - AdvancedPhysics.write('r2 rotated: r2.x = ' + r2.x + ' r2.y = ' + r2.y); - - // Contact points (corrected) - var p1 = new Phaser.Vec2; - var p2 = new Phaser.Vec2; - - Phaser.Vec2Utils.add(body1.position, r1, p1); - Phaser.Vec2Utils.add(body2.position, r2, p2); - - AdvancedPhysics.write('body1.pos.x=' + body1.position.x + ' y=' + body1.position.y); - AdvancedPhysics.write('body2.pos.x=' + body2.position.x + ' y=' + body2.position.y); - - // Corrected delta vector - var dp = new Phaser.Vec2; - Phaser.Vec2Utils.subtract(p2, p1, dp); - - // Position constraint - var c = Phaser.Vec2Utils.dot(dp, n) + con.depth; - - var correction = this.clamp(AdvancedPhysics.CONTACT_SOLVER_BAUMGARTE * (c + AdvancedPhysics.CONTACT_SOLVER_COLLISION_SLOP), -AdvancedPhysics.CONTACT_SOLVER_MAX_LINEAR_CORRECTION, 0); - - if (correction == 0) - { - continue; - } - - // We don't need max_penetration less than or equal slop - max_penetration = Math.max(max_penetration, -c); - - // Compute lambda for position constraint - // Solve (J * invM * JT) * lambda = -C / dt - var sn1 = Phaser.Vec2Utils.cross(r1, n); - var sn2 = Phaser.Vec2Utils.cross(r2, n); - - var em_inv = sum_m_inv + body1.inertiaInverted * sn1 * sn1 + body2.inertiaInverted * sn2 * sn2; - - var lambda_dt = em_inv == 0 ? 0 : -correction / em_inv; - - // Apply correction impulses - var impulse_dt = new Phaser.Vec2; - Phaser.Vec2Utils.scale(n, lambda_dt, impulse_dt); - - body1.position.multiplyAddByScalar(impulse_dt, -m1_inv); - body1.angle -= sn1 * lambda_dt * i1_inv; - - body2.position.multiplyAddByScalar(impulse_dt, m2_inv); - body2.angle += sn2 * lambda_dt * i2_inv; - - AdvancedPhysics.write('body1.pos.x=' + body1.position.x + ' y=' + body1.position.y); - AdvancedPhysics.write('body2.pos.x=' + body2.position.x + ' y=' + body2.position.y); - } - - AdvancedPhysics.write('max_penetration: ' + max_penetration); - - return max_penetration <= AdvancedPhysics.CONTACT_SOLVER_COLLISION_SLOP * 3; - - } - - public clamp(v, min, max) { - return v < min ? min : (v > max ? max : v); - } - - } - -} diff --git a/wip/physics/Manager.js b/wip/physics/Manager.js deleted file mode 100644 index 517e40c6..00000000 --- a/wip/physics/Manager.js +++ /dev/null @@ -1,67 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /** - * Phaser - Physics Manager - * - * The Physics Manager is responsible for looking after, creating and colliding - * all of the physics bodies and joints in the world. - */ - (function (Physics) { - var Manager = (function () { - function Manager(game) { - this.game = game; - } - Manager.clear = function clear() { - //Manager.debug.textContent = ""; - Manager.log = []; - }; - Manager.write = function write(s) { - //Manager.debug.textContent += s + "\n"; - }; - Manager.writeAll = function writeAll() { - for(var i = 0; i < Manager.log.length; i++) { - //Manager.debug.textContent += Manager.log[i]; - } - }; - Manager.log = []; - Manager.dump = function dump(phase, body) { - /* - var s = "\n\nPhase: " + phase + "\n"; - s += "Position: " + body.position.toString() + "\n"; - s += "Velocity: " + body.velocity.toString() + "\n"; - s += "Angle: " + body.angle + "\n"; - s += "Force: " + body.force.toString() + "\n"; - s += "Torque: " + body.torque + "\n"; - s += "Bounds: " + body.bounds.toString() + "\n"; - s += "Shape ***\n"; - s += "Vert 0: " + body.shapes[0].verts[0].toString() + "\n"; - s += "Vert 1: " + body.shapes[0].verts[1].toString() + "\n"; - s += "Vert 2: " + body.shapes[0].verts[2].toString() + "\n"; - s += "Vert 3: " + body.shapes[0].verts[3].toString() + "\n"; - s += "TVert 0: " + body.shapes[0].tverts[0].toString() + "\n"; - s += "TVert 1: " + body.shapes[0].tverts[1].toString() + "\n"; - s += "TVert 2: " + body.shapes[0].tverts[2].toString() + "\n"; - s += "TVert 3: " + body.shapes[0].tverts[3].toString() + "\n"; - s += "Plane 0: " + body.shapes[0].planes[0].normal.toString() + "\n"; - s += "Plane 1: " + body.shapes[0].planes[1].normal.toString() + "\n"; - s += "Plane 2: " + body.shapes[0].planes[2].normal.toString() + "\n"; - s += "Plane 3: " + body.shapes[0].planes[3].normal.toString() + "\n"; - s += "TPlane 0: " + body.shapes[0].tplanes[0].normal.toString() + "\n"; - s += "TPlane 1: " + body.shapes[0].tplanes[1].normal.toString() + "\n"; - s += "TPlane 2: " + body.shapes[0].tplanes[2].normal.toString() + "\n"; - s += "TPlane 3: " + body.shapes[0].tplanes[3].normal.toString() + "\n"; - - Manager.log.push(s); - */ - }; - Manager.prototype.update = function () { - }; - return Manager; - })(); - Physics.Manager = Manager; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Manager.ts b/wip/physics/Manager.ts deleted file mode 100644 index 519e3cd8..00000000 --- a/wip/physics/Manager.ts +++ /dev/null @@ -1,86 +0,0 @@ -/// -/// -/// - -/** -* Phaser - Physics Manager -* -* The Physics Manager is responsible for looking after, creating and colliding -* all of the physics bodies and joints in the world. -*/ - -module Phaser.Physics { - - export class Manager { - - constructor(game: Game) { - this.game = game; - } - - /** - * Local reference to Game. - */ - public game: Game; - - public static debug: HTMLTextAreaElement; - - public static clear() { - //Manager.debug.textContent = ""; - Manager.log = []; - } - - public static write(s: string) { - //Manager.debug.textContent += s + "\n"; - } - - public static writeAll() { - - for (var i = 0; i < Manager.log.length; i++) - { - //Manager.debug.textContent += Manager.log[i]; - } - - } - - public static log = []; - - public static dump(phase: string, body: Body) { - - /* - var s = "\n\nPhase: " + phase + "\n"; - s += "Position: " + body.position.toString() + "\n"; - s += "Velocity: " + body.velocity.toString() + "\n"; - s += "Angle: " + body.angle + "\n"; - s += "Force: " + body.force.toString() + "\n"; - s += "Torque: " + body.torque + "\n"; - s += "Bounds: " + body.bounds.toString() + "\n"; - s += "Shape ***\n"; - s += "Vert 0: " + body.shapes[0].verts[0].toString() + "\n"; - s += "Vert 1: " + body.shapes[0].verts[1].toString() + "\n"; - s += "Vert 2: " + body.shapes[0].verts[2].toString() + "\n"; - s += "Vert 3: " + body.shapes[0].verts[3].toString() + "\n"; - s += "TVert 0: " + body.shapes[0].tverts[0].toString() + "\n"; - s += "TVert 1: " + body.shapes[0].tverts[1].toString() + "\n"; - s += "TVert 2: " + body.shapes[0].tverts[2].toString() + "\n"; - s += "TVert 3: " + body.shapes[0].tverts[3].toString() + "\n"; - s += "Plane 0: " + body.shapes[0].planes[0].normal.toString() + "\n"; - s += "Plane 1: " + body.shapes[0].planes[1].normal.toString() + "\n"; - s += "Plane 2: " + body.shapes[0].planes[2].normal.toString() + "\n"; - s += "Plane 3: " + body.shapes[0].planes[3].normal.toString() + "\n"; - s += "TPlane 0: " + body.shapes[0].tplanes[0].normal.toString() + "\n"; - s += "TPlane 1: " + body.shapes[0].tplanes[1].normal.toString() + "\n"; - s += "TPlane 2: " + body.shapes[0].tplanes[2].normal.toString() + "\n"; - s += "TPlane 3: " + body.shapes[0].tplanes[3].normal.toString() + "\n"; - - Manager.log.push(s); - */ - - } - - public update() { - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/Plane.js b/wip/physics/Plane.js deleted file mode 100644 index 3e73d78b..00000000 --- a/wip/physics/Plane.js +++ /dev/null @@ -1,23 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Plane - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Plane = (function () { - function Plane(normal, d) { - this.normal = normal; - this.d = d; - } - return Plane; - })(); - Physics.Plane = Plane; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Plane.ts b/wip/physics/Plane.ts deleted file mode 100644 index f8fd4836..00000000 --- a/wip/physics/Plane.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Plane -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Plane { - - constructor(normal: Phaser.Vec2, d: number) { - - this.normal = normal; - this.d = d; - - } - - public normal: Phaser.Vec2; - public d: number; - - } - -} diff --git a/wip/physics/Space.js b/wip/physics/Space.js deleted file mode 100644 index 0021e9e8..00000000 --- a/wip/physics/Space.js +++ /dev/null @@ -1,500 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Space - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Space = (function () { - function Space(manager) { - this.postSolve = null; - this.stepCount = 0; - this._manager = manager; - this.bodies = []; - this.bodyHash = { - }; - this.joints = []; - this.jointHash = { - }; - this.numContacts = 0; - this.contactSolvers = []; - this.gravity = this._manager.gravity; - this.damping = 0; - this._linTolSqr = Space.SLEEP_LINEAR_TOLERANCE * Space.SLEEP_LINEAR_TOLERANCE; - this._angTolSqr = Space.SLEEP_ANGULAR_TOLERANCE * Space.SLEEP_ANGULAR_TOLERANCE; - } - Space.TIME_TO_SLEEP = 0.5; - Space.SLEEP_LINEAR_TOLERANCE = 0.5; - Space.SLEEP_ANGULAR_TOLERANCE = 2 * 0.017453292519943294444444444444444; - Space.prototype.clear = function () { - Physics.AdvancedPhysics.shapeCounter = 0; - Physics.AdvancedPhysics.bodyCounter = 0; - Physics.AdvancedPhysics.jointCounter = 0; - for(var i = 0; i < this.bodies.length; i++) { - if(this.bodies[i]) { - this.removeBody(this.bodies[i]); - } - } - this.bodies = []; - this.bodyHash = { - }; - this.joints = []; - this.jointHash = { - }; - this.contactSolvers = []; - this.stepCount = 0; - }; - Space.prototype.addBody = function (body) { - if(this.bodyHash[body.id] != undefined) { - return; - } - var index = this.bodies.push(body) - 1; - this.bodyHash[body.id] = index; - body.awake(true); - body.space = this; - body.cacheData('addBody'); - }; - Space.prototype.removeBody = function (body) { - if(this.bodyHash[body.id] == undefined) { - return; - } - // Remove linked joints - for(var i = 0; i < body.joints.length; i++) { - if(body.joints[i]) { - this.removeJoint(body.joints[i]); - } - } - body.space = null; - var index = this.bodyHash[body.id]; - delete this.bodyHash[body.id]; - delete this.bodies[index]; - }; - Space.prototype.addJoint = function (joint) { - if(this.jointHash[joint.id] != undefined) { - return; - } - joint.body1.awake(true); - joint.body2.awake(true); - var index = this.joints.push(joint) - 1; - this.jointHash[joint.id] = index; - var index = joint.body1.joints.push(joint) - 1; - joint.body1.jointHash[joint.id] = index; - var index = joint.body2.joints.push(joint) - 1; - joint.body2.jointHash[joint.id] = index; - }; - Space.prototype.removeJoint = function (joint) { - if(this.jointHash[joint.id] == undefined) { - return; - } - joint.body1.awake(true); - joint.body2.awake(true); - var index = joint.body1.jointHash[joint.id]; - delete joint.body1.jointHash[joint.id]; - delete joint.body1.joints[index]; - var index = joint.body2.jointHash[joint.id]; - delete joint.body2.jointHash[joint.id]; - delete joint.body2.joints[index]; - var index = this.jointHash[joint.id]; - delete this.jointHash[joint.id]; - delete this.joints[index]; - }; - Space.prototype.findShapeByPoint = function (p, refShape) { - var firstShape; - for(var i = 0; i < this.bodies.length; i++) { - var body = this.bodies[i]; - if(!body) { - continue; - } - for(var j = 0; j < body.shapes.length; j++) { - var shape = body.shapes[j]; - if(shape.pointQuery(p)) { - if(!refShape) { - return shape; - } - if(!firstShape) { - firstShape = shape; - } - if(shape == refShape) { - refShape = null; - } - } - } - } - return firstShape; - }; - Space.prototype.findBodyByPoint = function (p, refBody) { - var firstBody; - for(var i = 0; i < this.bodies.length; i++) { - var body = this.bodies[i]; - if(!body) { - continue; - } - for(var j = 0; j < body.shapes.length; j++) { - var shape = body.shapes[j]; - if(shape.pointQuery(p)) { - if(!refBody) { - return shape.body; - } - if(!firstBody) { - firstBody = shape.body; - } - if(shape.body == refBody) { - refBody = null; - } - break; - } - } - } - return firstBody; - }; - Space.prototype.shapeById = function (id) { - var shape; - for(var i = 0; i < this.bodies.length; i++) { - var body = this.bodies[i]; - if(!body) { - continue; - } - for(var j = 0; j < body.shapes.length; j++) { - if(body.shapes[j].id == id) { - return body.shapes[j]; - } - } - } - return null; - }; - Space.prototype.jointById = function (id) { - var index = this.jointHash[id]; - if(index != undefined) { - return this.joints[index]; - } - return null; - }; - Space.prototype.findVertexByPoint = function (p, minDist, refVertexId) { - var firstVertexId = -1; - refVertexId = refVertexId || -1; - for(var i = 0; i < this.bodies.length; i++) { - var body = this.bodies[i]; - if(!body) { - continue; - } - for(var j = 0; j < body.shapes.length; j++) { - var shape = body.shapes[j]; - var index = shape.findVertexByPoint(p, minDist); - if(index != -1) { - var vertex = (shape.id << 16) | index; - if(refVertexId == -1) { - return vertex; - } - if(firstVertexId == -1) { - firstVertexId = vertex; - } - if(vertex == refVertexId) { - refVertexId = -1; - } - } - } - } - return firstVertexId; - }; - Space.prototype.findEdgeByPoint = function (p, minDist, refEdgeId) { - var firstEdgeId = -1; - refEdgeId = refEdgeId || -1; - for(var i = 0; i < this.bodies.length; i++) { - var body = this.bodies[i]; - if(!body) { - continue; - } - for(var j = 0; j < body.shapes.length; j++) { - var shape = body.shapes[j]; - if(shape.type != Physics.AdvancedPhysics.SHAPE_TYPE_POLY) { - continue; - } - var index = shape.findEdgeByPoint(p, minDist); - if(index != -1) { - var edge = (shape.id << 16) | index; - if(refEdgeId == -1) { - return edge; - } - if(firstEdgeId == -1) { - firstEdgeId = edge; - } - if(edge == refEdgeId) { - refEdgeId = -1; - } - } - } - } - return firstEdgeId; - }; - Space.prototype.findJointByPoint = function (p, minDist, refJointId) { - var firstJointId = -1; - var dsq = minDist * minDist; - refJointId = refJointId || -1; - for(var i = 0; i < this.joints.length; i++) { - var joint = this.joints[i]; - if(!joint) { - continue; - } - var jointId = -1; - if(Phaser.Vec2Utils.distanceSq(p, joint.getWorldAnchor1()) < dsq) { - jointId = (joint.id << 16 | 0); - } else if(Phaser.Vec2Utils.distanceSq(p, joint.getWorldAnchor2()) < dsq) { - jointId = (joint.id << 16 | 1); - } - if(jointId != -1) { - if(refJointId == -1) { - return jointId; - } - if(firstJointId == -1) { - firstJointId = jointId; - } - if(jointId == refJointId) { - refJointId = -1; - } - } - } - return firstJointId; - }; - Space.prototype.findContactSolver = function (shape1, shape2) { - Physics.Manager.write('findContactSolver. Length: ' + this._cl); - for(var i = 0; i < this._cl; i++) { - var contactSolver = this.contactSolvers[i]; - if(shape1 == contactSolver.shape1 && shape2 == contactSolver.shape2) { - return contactSolver; - } - } - return null; - }; - Space.prototype.genTemporalContactSolvers = function () { - Physics.Manager.write('genTemporalContactSolvers'); - this._cl = 0; - this.contactSolvers.length = 0; - this.numContacts = 0; - for(var body1Index = 0; body1Index < this._bl; body1Index++) { - if(!this.bodies[body1Index]) { - continue; - } - this.bodies[body1Index].stepCount = this.stepCount; - for(var body2Index = 0; body2Index < this._bl; body2Index++) { - if(this.bodies[body1Index].inContact(this.bodies[body2Index]) == false) { - continue; - } - Physics.Manager.write('body1 and body2 intersect'); - for(var i = 0; i < this.bodies[body1Index].shapesLength; i++) { - for(var j = 0; j < this.bodies[body2Index].shapesLength; j++) { - this._shape1 = this.bodies[body1Index].shapes[i]; - this._shape2 = this.bodies[body2Index].shapes[j]; - var contactArr = []; - if(!Physics.AdvancedPhysics.collision.collide(this._shape1, this._shape2, contactArr)) { - continue; - } - if(this._shape1.type > this._shape2.type) { - var temp = this._shape1; - this._shape1 = this._shape2; - this._shape2 = temp; - } - this.numContacts += contactArr.length; - // Result stored in this._contactSolver (see what we can do about generating some re-usable solvers) - var contactSolver = this.findContactSolver(this._shape1, this._shape2); - Physics.Manager.write('findContactSolver result: ' + contactSolver); - if(contactSolver) { - contactSolver.update(contactArr); - this.contactSolvers.push(contactSolver); - } else { - Physics.Manager.write('awake both bodies'); - this.bodies[body1Index].awake(true); - this.bodies[body2Index].awake(true); - var newContactSolver = new Physics.ContactSolver(this._shape1, this._shape2); - newContactSolver.contacts = contactArr; - newContactSolver.elasticity = Math.max(this._shape1.elasticity, this._shape2.elasticity); - newContactSolver.friction = Math.sqrt(this._shape1.friction * this._shape2.friction); - this.contactSolvers.push(newContactSolver); - Physics.Manager.write('new contact solver'); - } - } - } - } - } - this._cl = this.contactSolvers.length; - }; - Space.prototype.initSolver = function (warmStarting) { - Physics.Manager.write('initSolver'); - Physics.Manager.write('contactSolvers.length: ' + this._cl); - // Initialize contact solvers - for(var c = 0; c < this._cl; c++) { - this.contactSolvers[c].initSolver(this._deltaInv); - // Warm starting (apply cached impulse) - if(warmStarting) { - this.contactSolvers[c].warmStart(); - } - } - // Initialize joint solver - for(var j = 0; j < this.joints.length; j++) { - if(this.joints[j]) { - this.joints[j].initSolver(this._delta, warmStarting); - } - } - // Warm starting (apply cached impulse) - /* - if (warmStarting) - { - for (var c = 0; c < this._cl; c++) - { - this.contactSolvers[c].warmStart(); - } - } - */ - }; - Space.prototype.velocitySolver = function (iterations) { - Physics.Manager.write('velocitySolver, iterations: ' + iterations + ' csa len: ' + this._cl); - for(var i = 0; i < iterations; i++) { - for(var j = 0; j < this._jl; j++) { - if(this.joints[j]) { - this.joints[j].solveVelocityConstraints(); - } - } - for(var c = 0; c < this._cl; c++) { - this.contactSolvers[c].solveVelocityConstraints(); - } - } - }; - Space.prototype.positionSolver = function (iterations) { - this._positionSolved = false; - for(var i = 0; i < iterations; i++) { - this._contactsOk = true; - this._jointsOk = true; - for(var c = 0; c < this._cl; c++) { - this._contactsOk = this.contactSolvers[c].solvePositionConstraints() && this._contactsOk; - } - for(var j = 0; j < this._jl; j++) { - if(this.joints[j]) { - this._jointsOk = this.joints[j].solvePositionConstraints() && this._jointsOk; - } - } - if(this._contactsOk && this._jointsOk) { - // exit early if the position errors are small - this._positionSolved = true; - break; - } - } - return this._positionSolved; - }; - Space.prototype.step = // Step through the physics simulation - function (dt, velocityIterations, positionIterations, warmStarting, allowSleep) { - Physics.Manager.clear(); - Physics.Manager.write('Space step ' + this.stepCount); - this._delta = dt; - this._deltaInv = 1 / dt; - this._bl = this.bodies.length; - this._jl = this.joints.length; - this.stepCount++; - // 1) Generate Contact Solvers (into the this.contactSolvers array) - this.genTemporalContactSolvers(); - Physics.Manager.dump("Contact Solvers", this.bodies[1]); - // 2) Initialize the Contact Solvers - this.initSolver(warmStarting); - Physics.Manager.dump("Init Solver", this.bodies[1]); - // 3) Intergrate velocity - for(var i = 0; i < this._bl; i++) { - if(this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) { - this.bodies[i].updateVelocity(this.gravity, this._delta, this.damping); - } - } - Physics.Manager.dump("Update Velocity", this.bodies[1]); - // 4) Awaken bodies via joints - for(var j = 0; i < this._jl; j++) { - if(!this.joints[j]) { - continue; - } - // combine - var awake1 = this.joints[j].body1.isAwake && !this.joints[j].body1.isStatic; - var awake2 = this.joints[j].body2.isAwake && !this.joints[j].body2.isStatic; - if(awake1 ^ awake2) { - if(!awake1) { - this.joints[j].body1.awake(true); - } - if(!awake2) { - this.joints[j].body2.awake(true); - } - } - } - // 5) Iterative velocity constraints solver - this.velocitySolver(velocityIterations); - Physics.Manager.dump("Velocity Solvers", this.bodies[1]); - // 6) Integrate position - for(var i = 0; i < this._bl; i++) { - if(this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) { - this.bodies[i].updatePosition(this._delta); - } - } - Physics.Manager.dump("Update Position", this.bodies[1]); - // 7) Process breakable joint - for(var i = 0; i < this._jl; i++) { - if(this.joints[i] && this.joints[i].breakable && (this.joints[i].getReactionForce(this._deltaInv).lengthSq() >= this.joints[i].maxForce * this.joints[i].maxForce)) { - this.removeJoint(this.joints[i]); - } - } - // 8) Iterative position constraints solver (result stored in this._positionSolved) - this.positionSolver(positionIterations); - Physics.Manager.dump("Position Solver", this.bodies[1]); - // 9) Sync the Transforms - for(var i = 0; i < this._bl; i++) { - if(this.bodies[i]) { - this.bodies[i].syncTransform(); - } - } - Physics.Manager.dump("Sync Transform", this.bodies[1]); - // 10) Post solve collision callback - if(this.postSolve) { - for(var i = 0; i < this._cl; i++) { - this.postSolve(this.contactSolvers[i]); - } - } - // 11) Cache Body Data - for(var i = 0; i < this._bl; i++) { - if(this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) { - this.bodies[i].cacheData('post solve collision callback'); - } - } - Physics.Manager.dump("Cache Data", this.bodies[1]); - Physics.Manager.writeAll(); - // 12) Process sleeping - if(allowSleep) { - this._minSleepTime = 999999; - for(var i = 0; i < this._bl; i++) { - if(!this.bodies[i] || this.bodies[i].isDynamic == false) { - continue; - } - if(this.bodies[i].angularVelocity * this.bodies[i].angularVelocity > this._angTolSqr || this.bodies[i].velocity.dot(this.bodies[i].velocity) > this._linTolSqr) { - this.bodies[i].sleepTime = 0; - this._minSleepTime = 0; - } else { - this.bodies[i].sleepTime += this._delta; - this._minSleepTime = Math.min(this._minSleepTime, this.bodies[i].sleepTime); - } - } - if(this._positionSolved && this._minSleepTime >= Space.TIME_TO_SLEEP) { - for(var i = 0; i < this._bl; i++) { - if(this.bodies[i]) { - this.bodies[i].awake(false); - } - } - } - } - }; - return Space; - })(); - Physics.Space = Space; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Space.ts b/wip/physics/Space.ts deleted file mode 100644 index 030ceb32..00000000 --- a/wip/physics/Space.ts +++ /dev/null @@ -1,823 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Space -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Space { - - constructor(manager: Phaser.Physics.AdvancedPhysics) { - - this._manager = manager; - - this.bodies = []; - this.bodyHash = {}; - - this.joints = []; - this.jointHash = {}; - - this.numContacts = 0; - this.contactSolvers = []; - - this.gravity = this._manager.gravity; - this.damping = 0; - - this._linTolSqr = Space.SLEEP_LINEAR_TOLERANCE * Space.SLEEP_LINEAR_TOLERANCE; - this._angTolSqr = Space.SLEEP_ANGULAR_TOLERANCE * Space.SLEEP_ANGULAR_TOLERANCE; - - } - - private _manager: Phaser.Physics.AdvancedPhysics; - - // Delta Timer - private _delta: number; - private _deltaInv: number; - - // Body array length - private _bl: number; - - // Joints array length - private _jl: number; - - // Contact Solvers array length - private _cl: number; - - private _linTolSqr: number; - private _angTolSqr: number; - - // Minimum sleep time (used in the sleep process solver) - private _minSleepTime: number; - - private _positionSolved: bool; - - private _shape1: IShape; - private _shape2: IShape; - private _contactsOk: bool; - private _jointsOk: bool; - - private bodyHash; - private jointHash; - - public static TIME_TO_SLEEP = 0.5; - public static SLEEP_LINEAR_TOLERANCE = 0.5; - public static SLEEP_ANGULAR_TOLERANCE = 2 * 0.017453292519943294444444444444444; - - public bodies: Body[]; - public joints: IJoint[]; - public numContacts: number; - public contactSolvers: ContactSolver[]; - public postSolve = null; - public gravity: Phaser.Vec2; - public damping: number; - public stepCount: number = 0; - - public clear() { - - AdvancedPhysics.shapeCounter = 0; - AdvancedPhysics.bodyCounter = 0; - AdvancedPhysics.jointCounter = 0; - - for (var i = 0; i < this.bodies.length; i++) - { - if (this.bodies[i]) - { - this.removeBody(this.bodies[i]); - } - } - - this.bodies = []; - this.bodyHash = {}; - - this.joints = []; - this.jointHash = {}; - - this.contactSolvers = []; - - this.stepCount = 0; - - } - - public addBody(body: Body) { - - if (this.bodyHash[body.id] != undefined) - { - return; - } - - var index = this.bodies.push(body) - 1; - this.bodyHash[body.id] = index; - - body.awake(true); - body.space = this; - body.cacheData('addBody'); - - } - - public removeBody(body: Body) { - - if (this.bodyHash[body.id] == undefined) - { - return; - } - - // Remove linked joints - for (var i = 0; i < body.joints.length; i++) - { - if (body.joints[i]) - { - this.removeJoint(body.joints[i]); - } - } - - body.space = null; - - var index = this.bodyHash[body.id]; - delete this.bodyHash[body.id]; - delete this.bodies[index]; - - } - - public addJoint(joint: IJoint) { - - if (this.jointHash[joint.id] != undefined) - { - return; - } - - joint.body1.awake(true); - joint.body2.awake(true); - - var index = this.joints.push(joint) - 1; - this.jointHash[joint.id] = index; - - var index = joint.body1.joints.push(joint) - 1; - joint.body1.jointHash[joint.id] = index; - - var index = joint.body2.joints.push(joint) - 1; - joint.body2.jointHash[joint.id] = index; - - } - - public removeJoint(joint: IJoint) { - - if (this.jointHash[joint.id] == undefined) - { - return; - } - - joint.body1.awake(true); - joint.body2.awake(true); - - var index = joint.body1.jointHash[joint.id]; - delete joint.body1.jointHash[joint.id]; - delete joint.body1.joints[index]; - - var index = joint.body2.jointHash[joint.id]; - delete joint.body2.jointHash[joint.id]; - delete joint.body2.joints[index]; - - var index = this.jointHash[joint.id]; - delete this.jointHash[joint.id]; - delete this.joints[index]; - - } - - public findShapeByPoint(p, refShape) { - - var firstShape; - - for (var i = 0; i < this.bodies.length; i++) - { - var body = this.bodies[i]; - - if (!body) - { - continue; - } - - for (var j = 0; j < body.shapes.length; j++) - { - var shape = body.shapes[j]; - - if (shape.pointQuery(p)) - { - if (!refShape) - { - return shape; - } - - if (!firstShape) - { - firstShape = shape; - } - - if (shape == refShape) - { - refShape = null; - } - } - } - } - - return firstShape; - } - - public findBodyByPoint(p, refBody: Body) { - - var firstBody; - - for (var i = 0; i < this.bodies.length; i++) - { - var body = this.bodies[i]; - - if (!body) - { - continue; - } - - for (var j = 0; j < body.shapes.length; j++) - { - var shape = body.shapes[j]; - - if (shape.pointQuery(p)) - { - if (!refBody) - { - return shape.body; - } - - if (!firstBody) - { - firstBody = shape.body; - } - - if (shape.body == refBody) - { - refBody = null; - } - - break; - } - } - } - - return firstBody; - - } - - public shapeById(id) { - - var shape; - - for (var i = 0; i < this.bodies.length; i++) - { - var body: Body = this.bodies[i]; - - if (!body) - { - continue; - } - - for (var j = 0; j < body.shapes.length; j++) - { - if (body.shapes[j].id == id) - { - return body.shapes[j]; - } - } - } - - return null; - } - - public jointById(id) { - - var index = this.jointHash[id]; - - if (index != undefined) - { - return this.joints[index]; - } - - return null; - } - - public findVertexByPoint(p, minDist, refVertexId) { - - var firstVertexId = -1; - - refVertexId = refVertexId || -1; - - for (var i = 0; i < this.bodies.length; i++) - { - var body = this.bodies[i]; - - if (!body) - { - continue; - } - - for (var j = 0; j < body.shapes.length; j++) - { - var shape = body.shapes[j]; - var index = shape.findVertexByPoint(p, minDist); - - if (index != -1) - { - var vertex = (shape.id << 16) | index; - - if (refVertexId == -1) - { - return vertex; - } - - if (firstVertexId == -1) - { - firstVertexId = vertex; - } - - if (vertex == refVertexId) - { - refVertexId = -1; - } - } - } - } - - return firstVertexId; - - } - - public findEdgeByPoint(p, minDist, refEdgeId) { - - var firstEdgeId = -1; - - refEdgeId = refEdgeId || -1; - - for (var i = 0; i < this.bodies.length; i++) - { - var body = this.bodies[i]; - - if (!body) - { - continue; - } - - for (var j = 0; j < body.shapes.length; j++) - { - var shape = body.shapes[j]; - - if (shape.type != AdvancedPhysics.SHAPE_TYPE_POLY) - { - continue; - } - - var index = shape.findEdgeByPoint(p, minDist); - - if (index != -1) - { - var edge = (shape.id << 16) | index; - - if (refEdgeId == -1) - { - return edge; - } - - if (firstEdgeId == -1) - { - firstEdgeId = edge; - } - - if (edge == refEdgeId) - { - refEdgeId = -1; - } - } - } - } - - return firstEdgeId; - } - - public findJointByPoint(p, minDist, refJointId) { - - var firstJointId = -1; - - var dsq = minDist * minDist; - - refJointId = refJointId || -1; - - for (var i = 0; i < this.joints.length; i++) - { - var joint = this.joints[i]; - - if (!joint) - { - continue; - } - - var jointId = -1; - - if (Phaser.Vec2Utils.distanceSq(p, joint.getWorldAnchor1()) < dsq) - { - jointId = (joint.id << 16 | 0); - } - else if (Phaser.Vec2Utils.distanceSq(p, joint.getWorldAnchor2()) < dsq) - { - jointId = (joint.id << 16 | 1); - } - - if (jointId != -1) - { - if (refJointId == -1) - { - return jointId; - } - - if (firstJointId == -1) - { - firstJointId = jointId; - } - - if (jointId == refJointId) - { - refJointId = -1; - } - } - } - - return firstJointId; - } - - private findContactSolver(shape1:IShape, shape2:IShape):ContactSolver { - - Manager.write('findContactSolver. Length: ' + this._cl); - - for (var i = 0; i < this._cl; i++) - { - var contactSolver: ContactSolver = this.contactSolvers[i]; - - if (shape1 == contactSolver.shape1 && shape2 == contactSolver.shape2) - { - return contactSolver; - } - } - - return null; - - } - - private genTemporalContactSolvers() { - - Manager.write('genTemporalContactSolvers'); - - this._cl = 0; - this.contactSolvers.length = 0; - this.numContacts = 0; - - for (var body1Index = 0; body1Index < this._bl; body1Index++) - { - if (!this.bodies[body1Index]) - { - continue; - } - - this.bodies[body1Index].stepCount = this.stepCount; - - for (var body2Index = 0; body2Index < this._bl; body2Index++) - { - if (this.bodies[body1Index].inContact(this.bodies[body2Index]) == false) - { - continue; - } - - Manager.write('body1 and body2 intersect'); - - for (var i = 0; i < this.bodies[body1Index].shapesLength; i++) - { - for (var j = 0; j < this.bodies[body2Index].shapesLength; j++) - { - this._shape1 = this.bodies[body1Index].shapes[i]; - this._shape2 = this.bodies[body2Index].shapes[j]; - - var contactArr = []; - - if (!AdvancedPhysics.collision.collide(this._shape1, this._shape2, contactArr)) - { - continue; - } - - if (this._shape1.type > this._shape2.type) - { - var temp = this._shape1; - this._shape1 = this._shape2; - this._shape2 = temp; - } - - this.numContacts += contactArr.length; - - // Result stored in this._contactSolver (see what we can do about generating some re-usable solvers) - var contactSolver: ContactSolver = this.findContactSolver(this._shape1, this._shape2); - - Manager.write('findContactSolver result: ' + contactSolver); - - if (contactSolver) - { - contactSolver.update(contactArr); - this.contactSolvers.push(contactSolver); - } - else - { - Manager.write('awake both bodies'); - - this.bodies[body1Index].awake(true); - this.bodies[body2Index].awake(true); - - var newContactSolver = new ContactSolver(this._shape1, this._shape2); - newContactSolver.contacts = contactArr; - newContactSolver.elasticity = Math.max(this._shape1.elasticity, this._shape2.elasticity); - newContactSolver.friction = Math.sqrt(this._shape1.friction * this._shape2.friction); - - this.contactSolvers.push(newContactSolver); - Manager.write('new contact solver'); - } - } - } - } - } - - this._cl = this.contactSolvers.length; - - } - - private initSolver(warmStarting) { - - Manager.write('initSolver'); - Manager.write('contactSolvers.length: ' + this._cl); - - // Initialize contact solvers - for (var c = 0; c < this._cl; c++) - { - this.contactSolvers[c].initSolver(this._deltaInv); - - // Warm starting (apply cached impulse) - if (warmStarting) - { - this.contactSolvers[c].warmStart(); - } - - } - - // Initialize joint solver - for (var j = 0; j < this.joints.length; j++) - { - if (this.joints[j]) - { - this.joints[j].initSolver(this._delta, warmStarting); - } - } - - // Warm starting (apply cached impulse) - /* - if (warmStarting) - { - for (var c = 0; c < this._cl; c++) - { - this.contactSolvers[c].warmStart(); - } - } - */ - - } - - private velocitySolver(iterations:number) { - - Manager.write('velocitySolver, iterations: ' + iterations + ' csa len: ' + this._cl); - - for (var i = 0; i < iterations; i++) - { - for (var j = 0; j < this._jl; j++) - { - if (this.joints[j]) - { - this.joints[j].solveVelocityConstraints(); - } - } - - for (var c = 0; c < this._cl; c++) - { - this.contactSolvers[c].solveVelocityConstraints(); - } - } - - } - - private positionSolver(iterations:number):bool { - - this._positionSolved = false; - - for (var i = 0; i < iterations; i++) - { - this._contactsOk = true; - this._jointsOk = true; - - for (var c = 0; c < this._cl; c++) - { - this._contactsOk = this.contactSolvers[c].solvePositionConstraints() && this._contactsOk; - } - - for (var j = 0; j < this._jl; j++) - { - if (this.joints[j]) - { - this._jointsOk = this.joints[j].solvePositionConstraints() && this._jointsOk; - } - } - - if (this._contactsOk && this._jointsOk) - { - // exit early if the position errors are small - this._positionSolved = true; - break; - } - } - - return this._positionSolved; - - } - - // Step through the physics simulation - public step(dt: number, velocityIterations: number, positionIterations: number, warmStarting: bool, allowSleep: bool) { - - Manager.clear(); - Manager.write('Space step ' + this.stepCount); - - this._delta = dt; - this._deltaInv = 1 / dt; - this._bl = this.bodies.length; - this._jl = this.joints.length; - - this.stepCount++; - - // 1) Generate Contact Solvers (into the this.contactSolvers array) - this.genTemporalContactSolvers(); - - Manager.dump("Contact Solvers", this.bodies[1]); - - // 2) Initialize the Contact Solvers - this.initSolver(warmStarting); - - Manager.dump("Init Solver", this.bodies[1]); - - // 3) Intergrate velocity - for (var i = 0; i < this._bl; i++) - { - if (this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) - { - this.bodies[i].updateVelocity(this.gravity, this._delta, this.damping); - } - } - - Manager.dump("Update Velocity", this.bodies[1]); - - // 4) Awaken bodies via joints - for (var j = 0; i < this._jl; j++) - { - if (!this.joints[j]) - { - continue; - } - - // combine - var awake1 = this.joints[j].body1.isAwake && !this.joints[j].body1.isStatic; - var awake2 = this.joints[j].body2.isAwake && !this.joints[j].body2.isStatic; - - if (awake1 ^ awake2) - { - if (!awake1) - { - this.joints[j].body1.awake(true); - } - - if (!awake2) - { - this.joints[j].body2.awake(true); - } - } - } - - // 5) Iterative velocity constraints solver - this.velocitySolver(velocityIterations); - - Manager.dump("Velocity Solvers", this.bodies[1]); - - // 6) Integrate position - for (var i = 0; i < this._bl; i++) - { - if (this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) - { - this.bodies[i].updatePosition(this._delta); - } - } - - Manager.dump("Update Position", this.bodies[1]); - - // 7) Process breakable joint - for (var i = 0; i < this._jl; i++) - { - if (this.joints[i] && this.joints[i].breakable && (this.joints[i].getReactionForce(this._deltaInv).lengthSq() >= this.joints[i].maxForce * this.joints[i].maxForce)) - { - this.removeJoint(this.joints[i]); - } - } - - // 8) Iterative position constraints solver (result stored in this._positionSolved) - this.positionSolver(positionIterations); - - Manager.dump("Position Solver", this.bodies[1]); - - // 9) Sync the Transforms - for (var i = 0; i < this._bl; i++) - { - if (this.bodies[i]) - { - this.bodies[i].syncTransform(); - } - } - - Manager.dump("Sync Transform", this.bodies[1]); - - // 10) Post solve collision callback - if (this.postSolve) - { - for (var i = 0; i < this._cl; i++) - { - this.postSolve(this.contactSolvers[i]); - } - } - - // 11) Cache Body Data - for (var i = 0; i < this._bl; i++) - { - if (this.bodies[i] && this.bodies[i].isDynamic && this.bodies[i].isAwake) - { - this.bodies[i].cacheData('post solve collision callback'); - } - } - - Manager.dump("Cache Data", this.bodies[1]); - - Manager.writeAll(); - - // 12) Process sleeping - if (allowSleep) - { - this._minSleepTime = 999999; - - for (var i = 0; i < this._bl; i++) - { - if (!this.bodies[i] || this.bodies[i].isDynamic == false) - { - continue; - } - - if (this.bodies[i].angularVelocity * this.bodies[i].angularVelocity > this._angTolSqr || this.bodies[i].velocity.dot(this.bodies[i].velocity) > this._linTolSqr) - { - this.bodies[i].sleepTime = 0; - this._minSleepTime = 0; - } - else - { - this.bodies[i].sleepTime += this._delta; - this._minSleepTime = Math.min(this._minSleepTime, this.bodies[i].sleepTime); - } - } - - if (this._positionSolved && this._minSleepTime >= Space.TIME_TO_SLEEP) - { - for (var i = 0; i < this._bl; i++) - { - if (this.bodies[i]) - { - this.bodies[i].awake(false); - } - } - } - } - } - - } - -} \ No newline at end of file diff --git a/wip/physics/Transform.js b/wip/physics/Transform.js deleted file mode 100644 index 98c0c8c0..00000000 --- a/wip/physics/Transform.js +++ /dev/null @@ -1,53 +0,0 @@ -/// -/// -/** -* Phaser - 2D Transform -* -* A 2D Transform -*/ -var Phaser; -(function (Phaser) { - var Transform = (function () { - /** - * Creates a new 2D Transform object. - * @class Transform - * @constructor - * @return {Transform} This object - **/ - function Transform(pos, angle) { - this.t = Phaser.Vec2Utils.clone(pos); - this.c = Math.cos(angle); - this.s = Math.sin(angle); - this.angle = angle; - } - Transform.prototype.toString = function () { - return 't=' + this.t.toString() + ' c=' + this.c + ' s=' + this.s + ' a=' + this.angle; - }; - Transform.prototype.setTo = function (pos, angle) { - this.t.copyFrom(pos); - this.c = Math.cos(angle); - this.s = Math.sin(angle); - return this; - }; - Transform.prototype.setRotation = function (angle) { - if(angle !== this.angle) { - this.c = Math.cos(angle); - this.s = Math.sin(angle); - this.angle = angle; - } - return this; - }; - Transform.prototype.setPosition = function (p) { - this.t.copyFrom(p); - return this; - }; - Transform.prototype.identity = function () { - this.t.setTo(0, 0); - this.c = 1; - this.s = 0; - return this; - }; - return Transform; - })(); - Phaser.Transform = Transform; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/Transform.ts b/wip/physics/Transform.ts deleted file mode 100644 index 6c451048..00000000 --- a/wip/physics/Transform.ts +++ /dev/null @@ -1,83 +0,0 @@ -/// -/// - -/** -* Phaser - 2D Transform -* -* A 2D Transform -*/ - -module Phaser { - - export class Transform { - - /** - * Creates a new 2D Transform object. - * @class Transform - * @constructor - * @return {Transform} This object - **/ - constructor(pos: Phaser.Vec2, angle: number) { - - this.t = Phaser.Vec2Utils.clone(pos); - this.c = Math.cos(angle); - this.s = Math.sin(angle); - this.angle = angle; - - } - - public t: Phaser.Vec2; - public c: number; - public s: number; - public angle: number; - - public toString() { - - return 't=' + this.t.toString() + ' c=' + this.c + ' s=' + this.s + ' a=' + this.angle; - - } - - public setTo(pos:Phaser.Vec2, angle:number) { - - this.t.copyFrom(pos); - this.c = Math.cos(angle); - this.s = Math.sin(angle); - - return this; - - } - - public setRotation(angle:number) { - - if (angle !== this.angle) - { - this.c = Math.cos(angle); - this.s = Math.sin(angle); - this.angle = angle; - } - - return this; - - } - - public setPosition(p:Phaser.Vec2) { - - this.t.copyFrom(p); - - return this; - - } - - public identity() { - - this.t.setTo(0, 0); - this.c = 1; - this.s = 0; - - return this; - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/TransformUtils.js b/wip/physics/TransformUtils.js deleted file mode 100644 index 818a4d2d..00000000 --- a/wip/physics/TransformUtils.js +++ /dev/null @@ -1,39 +0,0 @@ -/// -/// -/// -/** -* Phaser - TransformUtils -* -* A collection of methods useful for manipulating and performing operations on 2D Transforms. -* -*/ -var Phaser; -(function (Phaser) { - var TransformUtils = (function () { - function TransformUtils() { } - TransformUtils.rotate = function rotate(t, v, out) { - if (typeof out === "undefined") { out = new Phaser.Vec2(); } - //return new vec2(v.x * this.c - v.y * this.s, v.x * this.s + v.y * this.c); - return out.setTo(v.x * t.c - v.y * t.s, v.x * t.s + v.y * t.c); - }; - TransformUtils.unrotate = function unrotate(t, v, out) { - if (typeof out === "undefined") { out = new Phaser.Vec2(); } - //return new vec2(v.x * this.c + v.y * this.s, -v.x * this.s + v.y * this.c); - return out.setTo(v.x * t.c + v.y * t.s, -v.x * t.s + v.y * t.c); - }; - TransformUtils.transform = function transform(t, v, out) { - if (typeof out === "undefined") { out = new Phaser.Vec2(); } - //return new vec2(v.x * this.c - v.y * this.s + this.t.x, v.x * this.s + v.y * this.c + this.t.y); - return out.setTo(v.x * t.c - v.y * t.s + t.t.x, v.x * t.s + v.y * t.c + t.t.y); - }; - TransformUtils.untransform = function untransform(t, v, out) { - if (typeof out === "undefined") { out = new Phaser.Vec2(); } - var px = v.x - t.t.x; - var py = v.y - t.t.y; - //return new vec2(px * this.c + py * this.s, -px * this.s + py * this.c); - return out.setTo(px * t.c + py * t.s, -px * t.s + py * t.c); - }; - return TransformUtils; - })(); - Phaser.TransformUtils = TransformUtils; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/TransformUtils.ts b/wip/physics/TransformUtils.ts deleted file mode 100644 index 1f199209..00000000 --- a/wip/physics/TransformUtils.ts +++ /dev/null @@ -1,43 +0,0 @@ -/// -/// -/// - -/** -* Phaser - TransformUtils -* -* A collection of methods useful for manipulating and performing operations on 2D Transforms. -* -*/ - -module Phaser { - - export class TransformUtils { - - public static rotate(t: Transform, v:Phaser.Vec2, out?: Vec2 = new Vec2):Phaser.Vec2 { - //return new vec2(v.x * this.c - v.y * this.s, v.x * this.s + v.y * this.c); - return out.setTo(v.x * t.c - v.y * t.s, v.x * t.s + v.y * t.c); - } - - public static unrotate(t: Transform, v:Phaser.Vec2, out?: Vec2 = new Vec2):Phaser.Vec2 { - //return new vec2(v.x * this.c + v.y * this.s, -v.x * this.s + v.y * this.c); - return out.setTo(v.x * t.c + v.y * t.s, -v.x * t.s + v.y * t.c); - } - - public static transform(t: Transform, v:Phaser.Vec2, out?: Vec2 = new Vec2):Phaser.Vec2 { - //return new vec2(v.x * this.c - v.y * this.s + this.t.x, v.x * this.s + v.y * this.c + this.t.y); - return out.setTo(v.x * t.c - v.y * t.s + t.t.x, v.x * t.s + v.y * t.c + t.t.y); - } - - public static untransform(t: Transform, v:Phaser.Vec2, out?: Vec2 = new Vec2):Phaser.Vec2 { - - var px = v.x - t.t.x; - var py = v.y - t.t.y; - - //return new vec2(px * this.c + py * this.s, -px * this.s + py * this.c); - return out.setTo(px * t.c + py * t.s, -px * t.s + py * t.c); - - } - - } - -} \ No newline at end of file diff --git a/wip/physics/joints/IJoint.js b/wip/physics/joints/IJoint.js deleted file mode 100644 index 38c4f862..00000000 --- a/wip/physics/joints/IJoint.js +++ /dev/null @@ -1,3 +0,0 @@ -var Phaser; -(function (Phaser) { - })(Phaser || (Phaser = {})); diff --git a/wip/physics/joints/IJoint.js.map b/wip/physics/joints/IJoint.js.map deleted file mode 100644 index 715856b3..00000000 --- a/wip/physics/joints/IJoint.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IJoint.js","sources":["IJoint.ts"],"names":["Phaser"],"mappings":"AAYA,IAAO,MAAM;AA6BZ,CA7BD,UAAO,MAAM;IA6BbA,CAACA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/joints/IJoint.ts b/wip/physics/joints/IJoint.ts deleted file mode 100644 index cb940a12..00000000 --- a/wip/physics/joints/IJoint.ts +++ /dev/null @@ -1,43 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Joint -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export interface IJoint { - - id: number; - type: number; - - body1: Phaser.Physics.Body; - body2: Phaser.Physics.Body; - - collideConnected; // bool? - maxForce: number; - breakable: bool; - - anchor1: Phaser.Vec2; - anchor2: Phaser.Vec2; - - getWorldAnchor1(); - getWorldAnchor2(); - setWorldAnchor1(anchor1); - setWorldAnchor2(anchor2); - - initSolver(dt, warmStarting); - solveVelocityConstraints(); - solvePositionConstraints(); - getReactionForce(dt_inv); - - } - -} - diff --git a/wip/physics/joints/Joint.js b/wip/physics/joints/Joint.js deleted file mode 100644 index 8999f0e3..00000000 --- a/wip/physics/joints/Joint.js +++ /dev/null @@ -1,41 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Joint - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Joint = (function () { - function Joint(type, body1, body2, collideConnected) { - this.id = Physics.AdvancedPhysics.jointCounter++; - this.type = type; - this.body1 = body1; - this.body2 = body2; - this.collideConnected = collideConnected; - this.maxForce = 9999999999; - this.breakable = false; - } - Joint.prototype.getWorldAnchor1 = function () { - return this.body1.getWorldPoint(this.anchor1); - }; - Joint.prototype.getWorldAnchor2 = function () { - return this.body2.getWorldPoint(this.anchor2); - }; - Joint.prototype.setWorldAnchor1 = function (anchor1) { - this.anchor1 = this.body1.getLocalPoint(anchor1); - }; - Joint.prototype.setWorldAnchor2 = function (anchor2) { - this.anchor2 = this.body2.getLocalPoint(anchor2); - }; - return Joint; - })(); - Physics.Joint = Joint; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/joints/Joint.js.map b/wip/physics/joints/Joint.js.map deleted file mode 100644 index 90974efb..00000000 --- a/wip/physics/joints/Joint.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Joint.js","sources":["Joint.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Joint","Phaser.Physics.Joint.constructor","Phaser.Physics.Joint.getWorldAnchor1","Phaser.Physics.Joint.getWorldAnchor2","Phaser.Physics.Joint.setWorldAnchor1","Phaser.Physics.Joint.setWorldAnchor2"],"mappings":"AAYA,IAAO,MAAM;AAmDZ,CAnDD,UAAO,MAAM;IAZbA,2CAA2CA;IAC3CA,4CAA4CA;IAC5CA,gDAAgDA;IAChDA,sCAAsCA;IACtCA,mCAAmCA;IAEnCA;;;;MAIEA;KAEKA,UAAOA,OAAOA;QAEjBC;YAEIC,SAFSA,KAAKA,CAEFA,IAAYA,EAAEA,KAAyBA,EAAEA,KAAyBA,EAAEA,gBAAgBA;gBAE5FC,IAAIA,CAACA,EAAEA,GAAGA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,YAAYA,EAAEA;gBAC/CA,IAAIA,CAACA,IAAIA,GAAGA,IAAIA;gBAEhBA,IAAIA,CAACA,KAAKA,GAAGA,KAAKA;gBAClBA,IAAIA,CAACA,KAAKA,GAAGA,KAAKA;gBAElBA,IAAIA,CAACA,gBAAgBA,GAAGA,gBAAgBA;gBAExCA,IAAIA,CAACA,QAAQA,GAAGA,UAAUA;gBAC1BA,IAAIA,CAACA,SAASA,GAAGA,KAAKA;YAE1BA,CAACA;YAeDD,kCAAAA;gBACIE,OAAOA,IAAIA,CAACA,KAAKA,CAACA,aAAaA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA;YAClDA,CAACA;YAEDF,kCAAAA;gBACIG,OAAOA,IAAIA,CAACA,KAAKA,CAACA,aAAaA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA;YAClDA,CAACA;YAEDH,kCAAAA,UAAuBA,OAAOA;gBAC1BI,IAAIA,CAACA,OAAOA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,aAAaA,CAACA,OAAOA,CAACA;YACpDA,CAACA;YAEDJ,kCAAAA,UAAuBA,OAAOA;gBAC1BK,IAAIA,CAACA,OAAOA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,aAAaA,CAACA,OAAOA,CAACA;YACpDA,CAACA;YAELL;AAACA,QAADA,CAACA,IAAAD;QA9CDA,sBA8CCA,QAAAA;IAGLA,CAACA,2CAAAD;IAnDMA;AAmDNA,CAAAA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/joints/Joint.ts b/wip/physics/joints/Joint.ts deleted file mode 100644 index 48d8b277..00000000 --- a/wip/physics/joints/Joint.ts +++ /dev/null @@ -1,64 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Joint -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Joint { - - constructor(type: number, body1:Phaser.Physics.Body, body2:Phaser.Physics.Body, collideConnected) { - - this.id = AdvancedPhysics.jointCounter++; - this.type = type; - - this.body1 = body1; - this.body2 = body2; - - this.collideConnected = collideConnected; - - this.maxForce = 9999999999; - this.breakable = false; - - } - - public id: number; - public type: number; - - public body1: Phaser.Physics.Body; - public body2: Phaser.Physics.Body; - - public collideConnected; // bool? - public maxForce: number; - public breakable: bool; - - public anchor1: Phaser.Vec2; - public anchor2: Phaser.Vec2; - - public getWorldAnchor1() { - return this.body1.getWorldPoint(this.anchor1); - } - - public getWorldAnchor2() { - return this.body2.getWorldPoint(this.anchor2); - } - - public setWorldAnchor1(anchor1) { - this.anchor1 = this.body1.getLocalPoint(anchor1); - } - - public setWorldAnchor2(anchor2) { - this.anchor2 = this.body2.getLocalPoint(anchor2); - } - - } - - -} \ No newline at end of file diff --git a/wip/physics/shapes/Box.js b/wip/physics/shapes/Box.js deleted file mode 100644 index 892a27f2..00000000 --- a/wip/physics/shapes/Box.js +++ /dev/null @@ -1,59 +0,0 @@ -var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var Phaser; -(function (Phaser) { - (function (Physics) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shapes - Box - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Shapes) { - var Box = (function (_super) { - __extends(Box, _super); - // Give in pixels - function Box(x, y, width, height) { - console.log('Box px', x, y, width, height); - x = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x); - y = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y); - width = Phaser.Physics.AdvancedPhysics.pixelsToMeters(width); - height = Phaser.Physics.AdvancedPhysics.pixelsToMeters(height); - console.log('Box m', x, y, width, height); - var hw = width * 0.5; - var hh = height * 0.5; - console.log('Box hh', hw, hh); - _super.call(this, [ - { - x: -hw + x, - y: +hh + y - }, - { - x: -hw + x, - y: -hh + y - }, - { - x: +hw + x, - y: -hh + y - }, - { - x: +hw + x, - y: +hh + y - } - ]); - } - return Box; - })(Phaser.Physics.Shapes.Poly); - Shapes.Box = Box; - })(Physics.Shapes || (Physics.Shapes = {})); - var Shapes = Physics.Shapes; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Box.js.map b/wip/physics/shapes/Box.js.map deleted file mode 100644 index 1870ec11..00000000 --- a/wip/physics/shapes/Box.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Box.js","sources":["Box.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shapes","Phaser.Physics.Shapes.Box","Phaser.Physics.Shapes.Box.constructor"],"mappings":";;;;;AAYA,IAAO,MAAM;AAgCZ,CAhCD,UAAO,MAAM;KAANA,UAAOA,OAAOA;QAZrBC,2CAA2CA;QAC3CA,sCAAsCA;QACtCA,mCAAmCA;QACnCA,iCAAiCA;QACjCA,gCAAgCA;QAEhCA;;;;UAIEA;SAEKA,UAAeA,MAAMA;YAExBC;;gBAGIC,kBADkBA;gBAClBA,SAHSA,GAAGA,CAGAA,CAACA,EAAEA,CAACA,EAAEA,KAAKA,EAAEA,MAAMA;oBAE3BC,OAAOA,CAACA,GAAGA,CAACA,QAAQA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,KAAKA,EAAEA,MAAMA,CAACA;oBAE1CA,CAACA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,CAACA,CAACA;oBAC7BA,CAACA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,CAACA,CAACA;oBAC7BA,KAAKA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,KAAKA,CAACA;oBACrCA,MAAMA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,MAAMA,CAACA;oBAEvCA,OAAOA,CAACA,GAAGA,CAACA,OAAOA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,KAAKA,EAAEA,MAAMA,CAACA;oBAE5CA,IAAIA,EAAEA,GAAGA,KAAKA,GAAGA,GAAGA,CAACA;oBACrBA,IAAIA,EAAEA,GAAGA,MAAMA,GAAGA,GAAGA,CAACA;oBAEnBA,OAAOA,CAACA,GAAGA,CAACA,QAAQA,EAAEA,EAAEA,EAAEA,EAAEA,CAACA;oBAEhCA,8BAAMA;gBACCA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;iBAAEA;gBAC1BA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;iBAAEA;gBAC1BA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;iBAAEA;gBAC1BA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;oBAAEA,CAACA,EAAEA,CAACA,EAAEA,GAAGA,CAACA;iBAAEA;aAChCA,CAILA;gBAFGA,CAACA;gBAELD;AAACA,YAADA,CAACA,EA5BwBD,MAAMA,CAACA,OAAOA,CAACA,MAAMA,CAACA,IAAIA,EA4BlDA;YA5BDA,iBA4BCA,YAAAA;QAELA,CAACA,2CAAAD;QAhCMA;AAgCNA,IAADA,CAACA,2CAAAD;IAhCMA;AAgCNA,CAAAA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/shapes/Box.ts b/wip/physics/shapes/Box.ts deleted file mode 100644 index 90743c74..00000000 --- a/wip/physics/shapes/Box.ts +++ /dev/null @@ -1,45 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shapes - Box -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics.Shapes { - - export class Box extends Phaser.Physics.Shapes.Poly { - - // Give in pixels - constructor(x, y, width, height) { - - console.log('Box px', x, y, width, height); - - x = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x); - y = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y); - width = Phaser.Physics.AdvancedPhysics.pixelsToMeters(width); - height = Phaser.Physics.AdvancedPhysics.pixelsToMeters(height); - - console.log('Box m', x, y, width, height); - - var hw = width * 0.5; - var hh = height * 0.5; - - console.log('Box hh', hw, hh); - - super([ - { x: -hw + x, y: +hh + y }, - { x: -hw + x, y: -hh + y }, - { x: +hw + x, y: -hh + y }, - { x: +hw + x, y: +hh + y } - ]); - - } - - } - -} diff --git a/wip/physics/shapes/Circle.js b/wip/physics/shapes/Circle.js deleted file mode 100644 index df298613..00000000 --- a/wip/physics/shapes/Circle.js +++ /dev/null @@ -1,87 +0,0 @@ -var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var Phaser; -(function (Phaser) { - (function (Physics) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shape - Circle - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Shapes) { - var Circle = (function (_super) { - __extends(Circle, _super); - function Circle(radius, x, y) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - _super.call(this, Physics.AdvancedPhysics.SHAPE_TYPE_CIRCLE); - x = Physics.AdvancedPhysics.pixelsToMeters(x); - y = Physics.AdvancedPhysics.pixelsToMeters(y); - radius = Physics.AdvancedPhysics.pixelsToMeters(radius); - this.center = new Phaser.Vec2(x, y); - this.radius = radius; - this.tc = new Phaser.Vec2(); - this.finishVerts(); - } - Circle.prototype.finishVerts = function () { - this.radius = Math.abs(this.radius); - }; - Circle.prototype.duplicate = function () { - return new Circle(this.center.x, this.center.y, this.radius); - }; - Circle.prototype.recenter = function (c) { - this.center.subtract(c); - }; - Circle.prototype.transform = function (xf) { - Phaser.TransformUtils.transform(xf, this.center, this.center); - //this.center = xf.transform(this.center); - }; - Circle.prototype.untransform = function (xf) { - Phaser.TransformUtils.untransform(xf, this.center, this.center); - //this.center = xf.untransform(this.center); - }; - Circle.prototype.area = function () { - return Physics.AdvancedPhysics.areaForCircle(this.radius, 0); - }; - Circle.prototype.centroid = function () { - return Phaser.Vec2Utils.clone(this.center); - }; - Circle.prototype.inertia = function (mass) { - return Physics.AdvancedPhysics.inertiaForCircle(mass, this.center, this.radius, 0); - }; - Circle.prototype.cacheData = function (xf) { - Phaser.TransformUtils.transform(xf, this.center, this.tc); - //this.tc = xf.transform(this.center); - this.bounds.mins.setTo(this.tc.x - this.radius, this.tc.y - this.radius); - this.bounds.maxs.setTo(this.tc.x + this.radius, this.tc.y + this.radius); - }; - Circle.prototype.pointQuery = function (p) { - //return vec2.distsq(this.tc, p) < (this.r * this.r); - return Phaser.Vec2Utils.distanceSq(this.tc, p) < (this.radius * this.radius); - }; - Circle.prototype.findVertexByPoint = function (p, minDist) { - var dsq = minDist * minDist; - if(Phaser.Vec2Utils.distanceSq(this.tc, p) < dsq) { - return 0; - } - return -1; - }; - Circle.prototype.distanceOnPlane = function (n, d) { - Phaser.Vec2Utils.dot(n, this.tc) - this.radius - d; - }; - return Circle; - })(Phaser.Physics.Shape); - Shapes.Circle = Circle; - })(Physics.Shapes || (Physics.Shapes = {})); - var Shapes = Physics.Shapes; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Circle.js.map b/wip/physics/shapes/Circle.js.map deleted file mode 100644 index 46921cb2..00000000 --- a/wip/physics/shapes/Circle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Circle.js","sources":["Circle.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shapes","Phaser.Physics.Shapes.Circle","Phaser.Physics.Shapes.Circle.constructor","Phaser.Physics.Shapes.Circle.finishVerts","Phaser.Physics.Shapes.Circle.duplicate","Phaser.Physics.Shapes.Circle.recenter","Phaser.Physics.Shapes.Circle.transform","Phaser.Physics.Shapes.Circle.untransform","Phaser.Physics.Shapes.Circle.area","Phaser.Physics.Shapes.Circle.centroid","Phaser.Physics.Shapes.Circle.inertia","Phaser.Physics.Shapes.Circle.cacheData","Phaser.Physics.Shapes.Circle.pointQuery","Phaser.Physics.Shapes.Circle.findVertexByPoint","Phaser.Physics.Shapes.Circle.distanceOnPlane"],"mappings":"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"} \ No newline at end of file diff --git a/wip/physics/shapes/Circle.ts b/wip/physics/shapes/Circle.ts deleted file mode 100644 index 52a60fde..00000000 --- a/wip/physics/shapes/Circle.ts +++ /dev/null @@ -1,105 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shape - Circle -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics.Shapes { - - export class Circle extends Phaser.Physics.Shape implements IShape { - - constructor(radius: number, x?: number = 0, y?: number = 0) { - - super(AdvancedPhysics.SHAPE_TYPE_CIRCLE); - - x = AdvancedPhysics.pixelsToMeters(x); - y = AdvancedPhysics.pixelsToMeters(y); - radius = AdvancedPhysics.pixelsToMeters(radius); - - this.center = new Phaser.Vec2(x, y); - this.radius = radius; - this.tc = new Phaser.Vec2; - - this.finishVerts(); - - } - - public radius: number; - public center: Phaser.Vec2; - public tc: Phaser.Vec2; - - public finishVerts() { - this.radius = Math.abs(this.radius); - } - - public duplicate(): Circle { - return new Circle(this.center.x, this.center.y, this.radius); - } - - public recenter(c:Phaser.Vec2) { - this.center.subtract(c); - } - - public transform(xf: Transform) { - - Phaser.TransformUtils.transform(xf, this.center, this.center); - //this.center = xf.transform(this.center); - } - - public untransform(xf: Transform) { - Phaser.TransformUtils.untransform(xf, this.center, this.center); - //this.center = xf.untransform(this.center); - } - - public area(): number { - return AdvancedPhysics.areaForCircle(this.radius, 0); - } - - public centroid(): Phaser.Vec2 { - return Phaser.Vec2Utils.clone(this.center); - } - - public inertia(mass: number): number { - return AdvancedPhysics.inertiaForCircle(mass, this.center, this.radius, 0); - } - - public cacheData(xf: Transform) { - - Phaser.TransformUtils.transform(xf, this.center, this.tc); - //this.tc = xf.transform(this.center); - - this.bounds.mins.setTo(this.tc.x - this.radius, this.tc.y - this.radius); - this.bounds.maxs.setTo(this.tc.x + this.radius, this.tc.y + this.radius); - - } - - public pointQuery(p:Phaser.Vec2): bool { - //return vec2.distsq(this.tc, p) < (this.r * this.r); - return Phaser.Vec2Utils.distanceSq(this.tc, p) < (this.radius * this.radius); - } - - public findVertexByPoint(p:Phaser.Vec2, minDist: number): number { - - var dsq = minDist * minDist; - - if (Phaser.Vec2Utils.distanceSq(this.tc, p) < dsq) - { - return 0; - } - - return -1; - } - - public distanceOnPlane(n, d) { - Phaser.Vec2Utils.dot(n, this.tc) - this.radius - d; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/shapes/IShape.js b/wip/physics/shapes/IShape.js deleted file mode 100644 index 38c4f862..00000000 --- a/wip/physics/shapes/IShape.js +++ /dev/null @@ -1,3 +0,0 @@ -var Phaser; -(function (Phaser) { - })(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/IShape.js.map b/wip/physics/shapes/IShape.js.map deleted file mode 100644 index b957e623..00000000 --- a/wip/physics/shapes/IShape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IShape.js","sources":["IShape.ts"],"names":["Phaser"],"mappings":"AAaA,IAAO,MAAM;AAgCZ,CAhCD,UAAO,MAAM;IAgCbA,CAACA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/shapes/IShape.ts b/wip/physics/shapes/IShape.ts deleted file mode 100644 index 08085b74..00000000 --- a/wip/physics/shapes/IShape.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - IShape -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export interface IShape { - - id: number; - type: number; - - elasticity: number; - friction: number; - density: number; - - body: Body; - bounds: Bounds; - - area(): number; - centroid(): Phaser.Vec2; - inertia(mass: number): number; - cacheData(xf:Transform); - pointQuery(p: Phaser.Vec2): bool; - findEdgeByPoint(p: Phaser.Vec2, minDist: number): number; - findVertexByPoint(p: Phaser.Vec2, minDist: number): number; - - // The verts of the shape (in local coordinate space) - verts: Phaser.Vec2[]; - planes: Phaser.Physics.Plane[]; - // The translated verts (in world space) - tverts: Phaser.Vec2[]; - tplanes: Phaser.Physics.Plane[]; - convexity: bool; - - } - -} - diff --git a/wip/physics/shapes/Poly.js b/wip/physics/shapes/Poly.js deleted file mode 100644 index 95311d67..00000000 --- a/wip/physics/shapes/Poly.js +++ /dev/null @@ -1,206 +0,0 @@ -var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var Phaser; -(function (Phaser) { - (function (Physics) { - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shapes - Convex Polygon - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Shapes) { - var Poly = (function (_super) { - __extends(Poly, _super); - // Verts is an optional array of objects, the objects must have public x and y properties which will be used - // to seed this polygon (i.e. Vec2 objects, or just straight JS objects) and must wind COUNTER clockwise - function Poly(verts) { - _super.call(this, Physics.AdvancedPhysics.SHAPE_TYPE_POLY); - this.verts = []; - this.planes = []; - this.tverts = []; - this.tplanes = []; - if(verts) { - for(var i = 0; i < verts.length; i++) { - this.verts[i] = new Phaser.Vec2(verts[i].x, verts[i].y); - this.tverts[i] = this.verts[i]; - //this.tverts[i] = new Phaser.Vec2(verts[i].x, verts[i].y); - this.tplanes[i] = new Phaser.Physics.Plane(new Phaser.Vec2(), 0); - } - } - this.finishVerts(); - } - Poly.prototype.finishVerts = function () { - if(this.verts.length < 2) { - this.convexity = false; - this.planes = []; - return; - } - this.convexity = true; - this.tverts = []; - this.tplanes = []; - // Must be counter-clockwise verts - for(var i = 0; i < this.verts.length; i++) { - var a = this.verts[i]; - var b = this.verts[(i + 1) % this.verts.length]; - var n = Phaser.Vec2Utils.normalize(Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(a, b))); - this.planes[i] = new Phaser.Physics.Plane(n, Phaser.Vec2Utils.dot(n, a)); - this.tverts[i] = Phaser.Vec2Utils.clone(this.verts[i])// reference??? - ; - //this.tverts[i] = this.verts[i]; // reference??? - this.tplanes[i] = new Phaser.Physics.Plane(new Phaser.Vec2(), 0); - } - for(var i = 0; i < this.verts.length; i++) { - //var b = this.verts[(i + 2) % this.verts.length]; - //var n = this.planes[i].normal; - //var d = this.planes[i].d; - if(Phaser.Vec2Utils.dot(this.planes[i].normal, this.verts[(i + 2) % this.verts.length]) - this.planes[i].d > 0) { - this.convexity = false; - } - } - }; - Poly.prototype.duplicate = function () { - return new Phaser.Physics.Shapes.Poly(this.verts); - }; - Poly.prototype.recenter = function (c) { - for(var i = 0; i < this.verts.length; i++) { - this.verts[i].subtract(c); - } - }; - Poly.prototype.transform = function (xf) { - for(var i = 0; i < this.verts.length; i++) { - this.verts[i] = Phaser.TransformUtils.transform(xf, this.verts[i]); - //this.verts[i] = xf.transform(this.verts[i]); - } - }; - Poly.prototype.untransform = function (xf) { - for(var i = 0; i < this.verts.length; i++) { - this.verts[i] = Phaser.TransformUtils.untransform(xf, this.verts[i]); - //this.verts[i] = xf.untransform(this.verts[i]); - } - }; - Poly.prototype.area = function () { - return Physics.AdvancedPhysics.areaForPoly(this.verts); - }; - Poly.prototype.centroid = function () { - return Physics.AdvancedPhysics.centroidForPoly(this.verts); - }; - Poly.prototype.inertia = function (mass) { - return Physics.AdvancedPhysics.inertiaForPoly(mass, this.verts, new Phaser.Vec2()); - }; - Poly.prototype.cacheData = function (xf) { - this.bounds.clear(); - var numVerts = this.verts.length; - Physics.AdvancedPhysics.write('----------- Poly cacheData = ' + numVerts); - if(numVerts == 0) { - return; - } - for(var i = 0; i < numVerts; i++) { - this.tverts[i] = Phaser.TransformUtils.transform(xf, this.verts[i]); - //this.tverts[i] = xf.transform(this.verts[i]); - Physics.AdvancedPhysics.write('tvert' + i + ' = ' + this.tverts[i].toString()); - } - if(numVerts < 2) { - this.bounds.addPoint(this.tverts[0]); - return; - } - for(var i = 0; i < numVerts; i++) { - var a = this.tverts[i]; - var b = this.tverts[(i + 1) % numVerts]; - var n = Phaser.Vec2Utils.normalize(Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(a, b))); - Physics.AdvancedPhysics.write('a = ' + a.toString()); - Physics.AdvancedPhysics.write('b = ' + b.toString()); - Physics.AdvancedPhysics.write('n = ' + n.toString()); - this.tplanes[i].normal = n; - this.tplanes[i].d = Phaser.Vec2Utils.dot(n, a); - Physics.AdvancedPhysics.write('tplanes' + i + ' n = ' + this.tplanes[i].normal.toString()); - Physics.AdvancedPhysics.write('tplanes' + i + ' d = ' + this.tplanes[i].d.toString()); - this.bounds.addPoint(a); - } - }; - Poly.prototype.pointQuery = function (p) { - if(!this.bounds.containPoint(p)) { - return false; - } - return this.containPoint(p); - }; - Poly.prototype.findVertexByPoint = function (p, minDist) { - var dsq = minDist * minDist; - for(var i = 0; i < this.tverts.length; i++) { - if(Phaser.Vec2Utils.distanceSq(this.tverts[i], p) < dsq) { - return i; - } - } - return -1; - }; - Poly.prototype.findEdgeByPoint = function (p, minDist) { - var dsq = minDist * minDist; - var numVerts = this.tverts.length; - for(var i = 0; i < this.tverts.length; i++) { - var v1 = this.tverts[i]; - var v2 = this.tverts[(i + 1) % numVerts]; - var n = this.tplanes[i].normal; - var dtv1 = Phaser.Vec2Utils.cross(v1, n); - var dtv2 = Phaser.Vec2Utils.cross(v2, n); - var dt = Phaser.Vec2Utils.cross(p, n); - if(dt > dtv1) { - if(Phaser.Vec2Utils.distanceSq(v1, p) < dsq) { - return i; - } - } else if(dt < dtv2) { - if(Phaser.Vec2Utils.distanceSq(v2, p) < dsq) { - return i; - } - } else { - var dist = Phaser.Vec2Utils.dot(n, p) - Phaser.Vec2Utils.dot(n, v1); - if(dist * dist < dsq) { - return i; - } - } - } - return -1; - }; - Poly.prototype.distanceOnPlane = function (n, d) { - var min = 999999; - for(var i = 0; i < this.verts.length; i++) { - min = Math.min(min, Phaser.Vec2Utils.dot(n, this.tverts[i])); - } - return min - d; - }; - Poly.prototype.containPoint = function (p) { - for(var i = 0; i < this.verts.length; i++) { - var plane = this.tplanes[i]; - if(Phaser.Vec2Utils.dot(plane.normal, p) - plane.d > 0) { - return false; - } - } - return true; - }; - Poly.prototype.containPointPartial = function (p, n) { - for(var i = 0; i < this.verts.length; i++) { - var plane = this.tplanes[i]; - if(Phaser.Vec2Utils.dot(plane.normal, n) < 0.0001) { - continue; - } - if(Phaser.Vec2Utils.dot(plane.normal, p) - plane.d > 0) { - return false; - } - } - return true; - }; - return Poly; - })(Phaser.Physics.Shape); - Shapes.Poly = Poly; - })(Physics.Shapes || (Physics.Shapes = {})); - var Shapes = Physics.Shapes; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Poly.js.map b/wip/physics/shapes/Poly.js.map deleted file mode 100644 index 14f926d9..00000000 --- a/wip/physics/shapes/Poly.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Poly.js","sources":["Poly.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shapes","Phaser.Physics.Shapes.Poly","Phaser.Physics.Shapes.Poly.constructor","Phaser.Physics.Shapes.Poly.finishVerts","Phaser.Physics.Shapes.Poly.duplicate","Phaser.Physics.Shapes.Poly.recenter","Phaser.Physics.Shapes.Poly.transform","Phaser.Physics.Shapes.Poly.untransform","Phaser.Physics.Shapes.Poly.area","Phaser.Physics.Shapes.Poly.centroid","Phaser.Physics.Shapes.Poly.inertia","Phaser.Physics.Shapes.Poly.cacheData","Phaser.Physics.Shapes.Poly.pointQuery","Phaser.Physics.Shapes.Poly.findVertexByPoint","Phaser.Physics.Shapes.Poly.findEdgeByPoint","Phaser.Physics.Shapes.Poly.distanceOnPlane","Phaser.Physics.Shapes.Poly.containPoint","Phaser.Physics.Shapes.Poly.containPointPartial"],"mappings":"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"} \ No newline at end of file diff --git a/wip/physics/shapes/Poly.ts b/wip/physics/shapes/Poly.ts deleted file mode 100644 index 0119dc47..00000000 --- a/wip/physics/shapes/Poly.ts +++ /dev/null @@ -1,299 +0,0 @@ -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shapes - Convex Polygon -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics.Shapes { - - export class Poly extends Phaser.Physics.Shape implements IShape { - - // Verts is an optional array of objects, the objects must have public x and y properties which will be used - // to seed this polygon (i.e. Vec2 objects, or just straight JS objects) and must wind COUNTER clockwise - constructor(verts?) { - - super(AdvancedPhysics.SHAPE_TYPE_POLY); - - this.verts = []; - this.planes = []; - this.tverts = []; - this.tplanes = []; - - if (verts) - { - for (var i = 0; i < verts.length; i++) - { - this.verts[i] = new Phaser.Vec2(verts[i].x, verts[i].y); - this.tverts[i] = this.verts[i]; - //this.tverts[i] = new Phaser.Vec2(verts[i].x, verts[i].y); - this.tplanes[i] = new Phaser.Physics.Plane(new Phaser.Vec2, 0); - } - } - - this.finishVerts(); - - } - - - public finishVerts() { - - if (this.verts.length < 2) - { - this.convexity = false; - this.planes = []; - return; - } - - this.convexity = true; - this.tverts = []; - this.tplanes = []; - - // Must be counter-clockwise verts - for (var i = 0; i < this.verts.length; i++) - { - var a = this.verts[i]; - var b = this.verts[(i + 1) % this.verts.length]; - var n = Phaser.Vec2Utils.normalize(Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(a, b))); - - this.planes[i] = new Phaser.Physics.Plane(n, Phaser.Vec2Utils.dot(n, a)); - - this.tverts[i] = Phaser.Vec2Utils.clone(this.verts[i]); // reference??? - //this.tverts[i] = this.verts[i]; // reference??? - - this.tplanes[i] = new Phaser.Physics.Plane(new Phaser.Vec2, 0); - } - - for (var i = 0; i < this.verts.length; i++) - { - //var b = this.verts[(i + 2) % this.verts.length]; - //var n = this.planes[i].normal; - //var d = this.planes[i].d; - - if (Phaser.Vec2Utils.dot(this.planes[i].normal, this.verts[(i + 2) % this.verts.length]) - this.planes[i].d > 0) - { - this.convexity = false; - } - } - - } - - public duplicate() { - return new Phaser.Physics.Shapes.Poly(this.verts); - } - - public recenter(c) { - - for (var i = 0; i < this.verts.length; i++) - { - this.verts[i].subtract(c); - } - - } - - public transform(xf:Phaser.Transform) { - - for (var i = 0; i < this.verts.length; i++) - { - this.verts[i] = Phaser.TransformUtils.transform(xf, this.verts[i]); - //this.verts[i] = xf.transform(this.verts[i]); - } - } - - public untransform(xf:Phaser.Transform) { - - for (var i = 0; i < this.verts.length; i++) - { - this.verts[i] = Phaser.TransformUtils.untransform(xf, this.verts[i]); - //this.verts[i] = xf.untransform(this.verts[i]); - } - - } - - public area(): number { - return AdvancedPhysics.areaForPoly(this.verts); - } - - public centroid(): Phaser.Vec2 { - return AdvancedPhysics.centroidForPoly(this.verts); - } - - public inertia(mass: number): number { - return AdvancedPhysics.inertiaForPoly(mass, this.verts, new Phaser.Vec2); - } - - public cacheData(xf:Transform) { - - this.bounds.clear(); - - var numVerts = this.verts.length; - - AdvancedPhysics.write('----------- Poly cacheData = ' + numVerts); - - if (numVerts == 0) - { - return; - } - - for (var i = 0; i < numVerts; i++) - { - this.tverts[i] = Phaser.TransformUtils.transform(xf, this.verts[i]); - //this.tverts[i] = xf.transform(this.verts[i]); - AdvancedPhysics.write('tvert' + i + ' = ' + this.tverts[i].toString()); - } - - if (numVerts < 2) - { - this.bounds.addPoint(this.tverts[0]); - return; - } - - for (var i = 0; i < numVerts; i++) - { - var a = this.tverts[i]; - var b = this.tverts[(i + 1) % numVerts]; - var n = Phaser.Vec2Utils.normalize(Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(a, b))); - - AdvancedPhysics.write('a = ' + a.toString()); - AdvancedPhysics.write('b = ' + b.toString()); - AdvancedPhysics.write('n = ' + n.toString()); - - this.tplanes[i].normal = n; - this.tplanes[i].d = Phaser.Vec2Utils.dot(n, a); - - AdvancedPhysics.write('tplanes' + i + ' n = ' + this.tplanes[i].normal.toString()); - AdvancedPhysics.write('tplanes' + i + ' d = ' + this.tplanes[i].d.toString()); - - this.bounds.addPoint(a); - - } - - } - - public pointQuery(p: Phaser.Vec2): bool { - - if (!this.bounds.containPoint(p)) - { - return false; - } - - return this.containPoint(p); - } - - public findVertexByPoint(p:Phaser.Vec2, minDist: number): number { - - var dsq = minDist * minDist; - - for (var i = 0; i < this.tverts.length; i++) - { - if (Phaser.Vec2Utils.distanceSq(this.tverts[i], p) < dsq) - { - return i; - } - } - - return -1; - } - - public findEdgeByPoint(p: Phaser.Vec2, minDist: number): number { - - var dsq = minDist * minDist; - var numVerts = this.tverts.length; - - for (var i = 0; i < this.tverts.length; i++) - { - var v1 = this.tverts[i]; - var v2 = this.tverts[(i + 1) % numVerts]; - var n = this.tplanes[i].normal; - - var dtv1 = Phaser.Vec2Utils.cross(v1, n); - var dtv2 = Phaser.Vec2Utils.cross(v2, n); - var dt = Phaser.Vec2Utils.cross(p, n); - - if (dt > dtv1) - { - if (Phaser.Vec2Utils.distanceSq(v1, p) < dsq) - { - return i; - } - } - else if (dt < dtv2) - { - if (Phaser.Vec2Utils.distanceSq(v2, p) < dsq) - { - return i; - } - } - else - { - var dist = Phaser.Vec2Utils.dot(n, p) - Phaser.Vec2Utils.dot(n, v1); - - if (dist * dist < dsq) - { - return i; - } - } - } - - return -1; - - } - - public distanceOnPlane(n: Phaser.Vec2, d:number) { - - var min: number = 999999; - - for (var i = 0; i < this.verts.length; i++) - { - min = Math.min(min, Phaser.Vec2Utils.dot(n, this.tverts[i])); - } - - return min - d; - - } - - public containPoint(p: Phaser.Vec2) { - - for (var i = 0; i < this.verts.length; i++) - { - var plane = this.tplanes[i]; - - if (Phaser.Vec2Utils.dot(plane.normal, p) - plane.d > 0) - { - return false; - } - } - - return true; - - } - - public containPointPartial(p, n) { - - for (var i = 0; i < this.verts.length; i++) - { - var plane = this.tplanes[i]; - - if (Phaser.Vec2Utils.dot(plane.normal, n) < 0.0001) - { - continue; - } - - if (Phaser.Vec2Utils.dot(plane.normal, p) - plane.d > 0) - { - return false; - } - } - - return true; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/shapes/Segment.js b/wip/physics/shapes/Segment.js deleted file mode 100644 index 678f8047..00000000 --- a/wip/physics/shapes/Segment.js +++ /dev/null @@ -1,141 +0,0 @@ -var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var Phaser; -(function (Phaser) { - (function (Physics) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shapes - Segment - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Shapes) { - var Segment = (function (_super) { - __extends(Segment, _super); - function Segment(a, b, radius) { - _super.call(this, Physics.AdvancedPhysics.SHAPE_TYPE_SEGMENT); - this.a = a.duplicate(); - this.b = b.duplicate(); - this.radius = radius; - this.normal = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(b, a)); - this.normal.normalize(); - this.ta = new Phaser.Vec2(); - this.tb = new Phaser.Vec2(); - this.tn = new Phaser.Vec2(); - this.finishVerts(); - } - Segment.prototype.finishVerts = function () { - this.normal = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(this.b, this.a)); - this.normal.normalize(); - this.radius = Math.abs(this.radius); - }; - Segment.prototype.duplicate = function () { - return new Phaser.Physics.Shapes.Segment(this.a, this.b, this.radius); - }; - Segment.prototype.recenter = function (c) { - this.a.subtract(c); - this.b.subtract(c); - }; - Segment.prototype.transform = function (xf) { - Phaser.TransformUtils.transform(xf, this.a, this.a); - Phaser.TransformUtils.transform(xf, this.b, this.b); - //this.a = xf.transform(this.a); - //this.b = xf.transform(this.b); - }; - Segment.prototype.untransform = function (xf) { - Phaser.TransformUtils.untransform(xf, this.a, this.a); - Phaser.TransformUtils.untransform(xf, this.b, this.b); - //this.a = xf.untransform(this.a); - //this.b = xf.untransform(this.b); - }; - Segment.prototype.area = function () { - return Physics.AdvancedPhysics.areaForSegment(this.a, this.b, this.radius); - }; - Segment.prototype.centroid = function () { - return Physics.AdvancedPhysics.centroidForSegment(this.a, this.b); - }; - Segment.prototype.inertia = function (mass) { - return Physics.AdvancedPhysics.inertiaForSegment(mass, this.a, this.b); - }; - Segment.prototype.cacheData = function (xf) { - Phaser.TransformUtils.transform(xf, this.a, this.ta); - Phaser.TransformUtils.transform(xf, this.b, this.tb); - //this.ta = xf.transform(this.a); - //this.tb = xf.transform(this.b); - this.tn = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(this.tb, this.ta)).normalize(); - var l; - var r; - var t; - var b; - if(this.ta.x < this.tb.x) { - l = this.ta.x; - r = this.tb.x; - } else { - l = this.tb.x; - r = this.ta.x; - } - if(this.ta.y < this.tb.y) { - b = this.ta.y; - t = this.tb.y; - } else { - b = this.tb.y; - t = this.ta.y; - } - this.bounds.mins.setTo(l - this.radius, b - this.radius); - this.bounds.maxs.setTo(r + this.radius, t + this.radius); - }; - Segment.prototype.pointQuery = function (p) { - if(!this.bounds.containPoint(p)) { - return false; - } - var dn = Phaser.Vec2Utils.dot(this.tn, p) - Phaser.Vec2Utils.dot(this.ta, this.tn); - var dist = Math.abs(dn); - if(dist > this.radius) { - return false; - } - var dt = Phaser.Vec2Utils.cross(p, this.tn); - var dta = Phaser.Vec2Utils.cross(this.ta, this.tn); - var dtb = Phaser.Vec2Utils.cross(this.tb, this.tn); - if(dt <= dta) { - if(dt < dta - this.radius) { - return false; - } - return Phaser.Vec2Utils.distanceSq(this.ta, p) < (this.radius * this.radius); - } else if(dt > dtb) { - if(dt > dtb + this.radius) { - return false; - } - return Phaser.Vec2Utils.distanceSq(this.tb, p) < (this.radius * this.radius); - } - return true; - }; - Segment.prototype.findVertexByPoint = function (p, minDist) { - var dsq = minDist * minDist; - if(Phaser.Vec2Utils.distanceSq(this.ta, p) < dsq) { - return 0; - } - if(Phaser.Vec2Utils.distanceSq(this.tb, p) < dsq) { - return 1; - } - return -1; - }; - Segment.prototype.distanceOnPlane = function (n, d) { - var a = Phaser.Vec2Utils.dot(n, this.ta) - this.radius; - var b = Phaser.Vec2Utils.dot(n, this.tb) - this.radius; - return Math.min(a, b) - d; - }; - return Segment; - })(Phaser.Physics.Shape); - Shapes.Segment = Segment; - })(Physics.Shapes || (Physics.Shapes = {})); - var Shapes = Physics.Shapes; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Segment.js.map b/wip/physics/shapes/Segment.js.map deleted file mode 100644 index d7f8512a..00000000 --- a/wip/physics/shapes/Segment.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Segment.js","sources":["Segment.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shapes","Phaser.Physics.Shapes.Segment","Phaser.Physics.Shapes.Segment.constructor","Phaser.Physics.Shapes.Segment.finishVerts","Phaser.Physics.Shapes.Segment.duplicate","Phaser.Physics.Shapes.Segment.recenter","Phaser.Physics.Shapes.Segment.transform","Phaser.Physics.Shapes.Segment.untransform","Phaser.Physics.Shapes.Segment.area","Phaser.Physics.Shapes.Segment.centroid","Phaser.Physics.Shapes.Segment.inertia","Phaser.Physics.Shapes.Segment.cacheData","Phaser.Physics.Shapes.Segment.pointQuery","Phaser.Physics.Shapes.Segment.findVertexByPoint","Phaser.Physics.Shapes.Segment.distanceOnPlane"],"mappings":"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"} \ No newline at end of file diff --git a/wip/physics/shapes/Segment.ts b/wip/physics/shapes/Segment.ts deleted file mode 100644 index 7416c03b..00000000 --- a/wip/physics/shapes/Segment.ts +++ /dev/null @@ -1,204 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shapes - Segment -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics.Shapes { - - export class Segment extends Phaser.Physics.Shape implements IShape { - - constructor(a, b, radius: number) { - - super(AdvancedPhysics.SHAPE_TYPE_SEGMENT); - - this.a = a.duplicate(); - this.b = b.duplicate(); - this.radius = radius; - - this.normal = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(b, a)); - this.normal.normalize(); - - this.ta = new Phaser.Vec2; - this.tb = new Phaser.Vec2; - this.tn = new Phaser.Vec2; - - this.finishVerts(); - - } - - public a: Phaser.Vec2; - public b: Phaser.Vec2; - public radius: number; - - public normal: Phaser.Vec2; - public ta: Phaser.Vec2; - public tb: Phaser.Vec2; - public tn: Phaser.Vec2; - - public finishVerts() { - - this.normal = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(this.b, this.a)); - this.normal.normalize(); - - this.radius = Math.abs(this.radius); - - } - - public duplicate() { - return new Phaser.Physics.Shapes.Segment(this.a, this.b, this.radius); - } - - public recenter(c) { - this.a.subtract(c); - this.b.subtract(c); - } - - public transform(xf:Transform) { - - Phaser.TransformUtils.transform(xf, this.a, this.a); - Phaser.TransformUtils.transform(xf, this.b, this.b); - - //this.a = xf.transform(this.a); - //this.b = xf.transform(this.b); - - } - - public untransform(xf:Transform) { - - Phaser.TransformUtils.untransform(xf, this.a, this.a); - Phaser.TransformUtils.untransform(xf, this.b, this.b); - - //this.a = xf.untransform(this.a); - //this.b = xf.untransform(this.b); - - } - - public area(): number { - return AdvancedPhysics.areaForSegment(this.a, this.b, this.radius); - } - - public centroid(): Phaser.Vec2 { - return AdvancedPhysics.centroidForSegment(this.a, this.b); - } - - public inertia(mass: number): number { - return AdvancedPhysics.inertiaForSegment(mass, this.a, this.b); - } - - public cacheData(xf:Transform) { - - Phaser.TransformUtils.transform(xf, this.a, this.ta); - Phaser.TransformUtils.transform(xf, this.b, this.tb); - - //this.ta = xf.transform(this.a); - //this.tb = xf.transform(this.b); - - this.tn = Phaser.Vec2Utils.perp(Phaser.Vec2Utils.subtract(this.tb, this.ta)).normalize(); - - var l; - var r; - var t; - var b; - - if (this.ta.x < this.tb.x) - { - l = this.ta.x; - r = this.tb.x; - } - else - { - l = this.tb.x; - r = this.ta.x; - } - - if (this.ta.y < this.tb.y) - { - b = this.ta.y; - t = this.tb.y; - } else - { - b = this.tb.y; - t = this.ta.y; - } - - this.bounds.mins.setTo(l - this.radius, b - this.radius); - this.bounds.maxs.setTo(r + this.radius, t + this.radius); - - } - - public pointQuery(p: Phaser.Vec2): bool { - - if (!this.bounds.containPoint(p)) - { - return false; - } - - var dn = Phaser.Vec2Utils.dot(this.tn, p) - Phaser.Vec2Utils.dot(this.ta, this.tn); - var dist = Math.abs(dn); - - if (dist > this.radius) - { - return false; - } - - var dt = Phaser.Vec2Utils.cross(p, this.tn); - var dta = Phaser.Vec2Utils.cross(this.ta, this.tn); - var dtb = Phaser.Vec2Utils.cross(this.tb, this.tn); - - if (dt <= dta) - { - if (dt < dta - this.radius) - { - return false; - } - - return Phaser.Vec2Utils.distanceSq(this.ta, p) < (this.radius * this.radius); - } - else if (dt > dtb) - { - if (dt > dtb + this.radius) - { - return false; - } - - return Phaser.Vec2Utils.distanceSq(this.tb, p) < (this.radius * this.radius); - } - - return true; - } - - public findVertexByPoint(p:Phaser.Vec2, minDist: number): number { - - var dsq = minDist * minDist; - - if (Phaser.Vec2Utils.distanceSq(this.ta, p) < dsq) - { - return 0; - } - - if (Phaser.Vec2Utils.distanceSq(this.tb, p) < dsq) - { - return 1; - } - - return -1; - } - - public distanceOnPlane(n, d) { - - var a = Phaser.Vec2Utils.dot(n, this.ta) - this.radius; - var b = Phaser.Vec2Utils.dot(n, this.tb) - this.radius; - - return Math.min(a, b) - d; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/shapes/Shape.js b/wip/physics/shapes/Shape.js deleted file mode 100644 index 12786dac..00000000 --- a/wip/physics/shapes/Shape.js +++ /dev/null @@ -1,33 +0,0 @@ -var Phaser; -(function (Phaser) { - /// - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shape - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Physics) { - var Shape = (function () { - function Shape(type) { - this.id = Physics.AdvancedPhysics.shapeCounter++; - this.type = type; - this.elasticity = 0.0; - this.friction = 1.0; - this.density = 1; - this.bounds = new Physics.Bounds(); - } - Shape.prototype.findEdgeByPoint = // Over-ridden by ShapePoly - function (p, minDist) { - return -1; - }; - return Shape; - })(); - Physics.Shape = Shape; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Shape.js.map b/wip/physics/shapes/Shape.js.map deleted file mode 100644 index eef9473d..00000000 --- a/wip/physics/shapes/Shape.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Shape.js","sources":["Shape.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shape","Phaser.Physics.Shape.constructor","Phaser.Physics.Shape.findEdgeByPoint"],"mappings":"AAaA,IAAO,MAAM;AAgDZ,CAhDD,UAAO,MAAM;IAbbA,2CAA2CA;IAC3CA,gDAAgDA;IAChDA,sCAAsCA;IACtCA,mCAAmCA;IACnCA,qCAAqCA;IACrCA,kCAAkCA;IAElCA;;;;MAIEA;KAEKA,UAAOA,OAAOA;QAEjBC;YAEIC,SAFSA,KAAKA,CAEFA,IAAYA;gBAEpBC,IAAIA,CAACA,EAAEA,GAAGA,MAAMA,CAACA,OAAOA,CAACA,OAAOA,CAACA,YAAYA,EAAEA;gBAC/CA,IAAIA,CAACA,IAAIA,GAAGA,IAAIA;gBAEhBA,IAAIA,CAACA,UAAUA,GAAGA,GAAGA;gBACrBA,IAAIA,CAACA,QAAQA,GAAGA,GAAGA;gBACnBA,IAAIA,CAACA,OAAOA,GAAGA,CAACA;gBAEhBA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,MAAMA,EAAAA;YAE5BA,CAACA;YA2BDD,kCADAA,4BAA4BA;YAC5BA,UAAuBA,CAAcA,EAAEA,OAAeA;gBAClDE,OAAOA,CAACA,CAACA,CAACA;YACdA,CAACA;YAELF;AAACA,QAADA,CAACA,IAAAD;QA5CDA,sBA4CCA,QAAAA;IAELA,CAACA,2CAAAD;IAhDMA;AAgDNA,CAAAA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/shapes/Shape.ts b/wip/physics/shapes/Shape.ts deleted file mode 100644 index edac5aa2..00000000 --- a/wip/physics/shapes/Shape.ts +++ /dev/null @@ -1,62 +0,0 @@ -/// -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shape -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics { - - export class Shape { - - constructor(type: number) { - - this.id = AdvancedPhysics.shapeCounter++; - this.type = type; - - this.elasticity = 0.0; - this.friction = 1.0; - this.density = 1; - - this.bounds = new Bounds; - - } - - public id: number; - public type: number; - public body: Body; - - public verts: Phaser.Vec2[]; - public planes: Phaser.Physics.Plane[]; - - public tverts: Phaser.Vec2[]; - public tplanes: Phaser.Physics.Plane[]; - - public convexity: bool; - - // Coefficient of restitution (elasticity) - public elasticity: number; - - // Frictional coefficient - public friction: number; - - // Mass density - public density: number; - - // Axis-aligned bounding box - public bounds: Bounds; - - // Over-ridden by ShapePoly - public findEdgeByPoint(p: Phaser.Vec2, minDist: number): number { - return -1; - } - - } - -} \ No newline at end of file diff --git a/wip/physics/shapes/Triangle.js b/wip/physics/shapes/Triangle.js deleted file mode 100644 index 2c8aea16..00000000 --- a/wip/physics/shapes/Triangle.js +++ /dev/null @@ -1,51 +0,0 @@ -var __extends = this.__extends || function (d, b) { - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var Phaser; -(function (Phaser) { - (function (Physics) { - /// - /// - /// - /// - /// - /** - * Phaser - Advanced Physics - Shapes - Triangle - * - * Based on the work Ju Hyung Lee started in JS PhyRus. - */ - (function (Shapes) { - var Triangle = (function (_super) { - __extends(Triangle, _super); - function Triangle(x1, y1, x2, y2, x3, y3) { - x1 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x1); - y1 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y1); - x2 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x2); - y2 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y2); - x3 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x3); - y3 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y3); - _super.call(this, [ - { - x: x1, - y: y1 - }, - { - x: x2, - y: y2 - }, - { - x: x3, - y: y3 - } - ]); - } - return Triangle; - })(Phaser.Physics.Shapes.Poly); - Shapes.Triangle = Triangle; - })(Physics.Shapes || (Physics.Shapes = {})); - var Shapes = Physics.Shapes; - })(Phaser.Physics || (Phaser.Physics = {})); - var Physics = Phaser.Physics; -})(Phaser || (Phaser = {})); diff --git a/wip/physics/shapes/Triangle.js.map b/wip/physics/shapes/Triangle.js.map deleted file mode 100644 index c1b54ffa..00000000 --- a/wip/physics/shapes/Triangle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Triangle.js","sources":["Triangle.ts"],"names":["Phaser","Phaser.Physics","Phaser.Physics.Shapes","Phaser.Physics.Shapes.Triangle","Phaser.Physics.Shapes.Triangle.constructor"],"mappings":";;;;;AAYA,IAAO,MAAM;AAmBZ,CAnBD,UAAO,MAAM;KAANA,UAAOA,OAAOA;QAZrBC,2CAA2CA;QAC3CA,sCAAsCA;QACtCA,mCAAmCA;QACnCA,iCAAiCA;QACjCA,gCAAgCA;QAEhCA;;;;UAIEA;SAEKA,UAAeA,MAAMA;YAExBC;;gBAEIC,SAFSA,QAAQA,CAELA,EAAUA,EAAEA,EAAUA,EAAEA,EAAUA,EAAEA,EAAUA,EAAEA,EAAUA,EAAEA,EAAUA;oBAE9EC,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAC/BA,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAC/BA,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAC/BA,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAC/BA,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAC/BA,EAAEA,GAAGA,eAAOA,CAACA,cAAcA,CAACA,EAAEA,CAACA;oBAE/BA,8BAAMA;gBAACA;oBAAEA,CAACA,EAAEA,EAAEA;oBAAEA,CAACA,EAAEA,EAAEA;iBAAEA;gBAAEA;oBAAEA,CAACA,EAAEA,EAAEA;oBAAEA,CAACA,EAAEA,EAAEA;iBAAEA;gBAAEA;oBAAEA,CAACA,EAAEA,EAAEA;oBAAEA,CAACA,EAAEA,EAAEA;iBAAEA;aAACA,CAInEA;gBAFGA,CAACA;gBAELD;AAACA,YAADA,CAACA,EAf6BD,MAAMA,CAACA,OAAOA,CAACA,MAAMA,CAACA,IAAIA,EAevDA;YAfDA,2BAeCA,YAAAA;QAELA,CAACA,2CAAAD;QAnBMA;AAmBNA,IAADA,CAACA,2CAAAD;IAnBMA;AAmBNA,CAAAA,2BAAA"} \ No newline at end of file diff --git a/wip/physics/shapes/Triangle.ts b/wip/physics/shapes/Triangle.ts deleted file mode 100644 index 03842876..00000000 --- a/wip/physics/shapes/Triangle.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -/// -/// -/// -/// - -/** -* Phaser - Advanced Physics - Shapes - Triangle -* -* Based on the work Ju Hyung Lee started in JS PhyRus. -*/ - -module Phaser.Physics.Shapes { - - export class Triangle extends Phaser.Physics.Shapes.Poly { - - constructor(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number) { - - x1 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x1); - y1 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y1); - x2 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x2); - y2 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y2); - x3 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(x3); - y3 = Phaser.Physics.AdvancedPhysics.pixelsToMeters(y3); - - super([{ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }]); - - } - - } - -}