From 64d57b8e057ab1f628d858f7e9e93dd83d2ad387 Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Thu, 18 Apr 2013 15:48:06 +0100 Subject: [PATCH] Refactoring of the codebase finished. All classes updated. Ready for final push to 1.0 release. --- Docs/phaser_balls.png | Bin 0 -> 27368 bytes Docs/phaser_cams.png | Bin 0 -> 50046 bytes Docs/phaser_particles.png | Bin 0 -> 180185 bytes Docs/phaser_tilemap.png | Bin 0 -> 67283 bytes Phaser/{Animations.ts => AnimationManager.ts} | 2 +- Phaser/Basic.ts | 8 +- Phaser/{Cameras.ts => CameraManager.ts} | 2 +- Phaser/Game.ts | 4 +- Phaser/GameMath.ts | 4 +- Phaser/Group.ts | 10 +- Phaser/Phaser.csproj | 309 +- Phaser/World.ts | 4 +- Phaser/gameobjects/Emitter.ts | 10 +- Phaser/gameobjects/GameObject.ts | 33 +- Phaser/gameobjects/GeomSprite.ts | 6 +- Phaser/gameobjects/Sprite.ts | 8 +- Phaser/system/Camera.ts | 4 +- Phaser/system/Tile.ts | 8 +- Phaser/system/input/Input.ts | 1 + Tests/cameras/camera alpha.js | 2 +- Tests/cameras/camera alpha.ts | 2 +- Tests/cameras/camera bounds.js | 2 +- Tests/cameras/camera bounds.ts | 2 +- Tests/cameras/camera position.js | 2 +- Tests/cameras/camera position.ts | 2 +- Tests/cameras/camera rotation.js | 2 +- Tests/cameras/camera rotation.ts | 2 +- Tests/cameras/camera scale.js | 2 +- Tests/cameras/camera scale.ts | 2 +- Tests/cameras/camera shadow.js | 2 +- Tests/cameras/camera shadow.ts | 2 +- Tests/cameras/camera texture.js | 2 +- Tests/cameras/camera texture.ts | 2 +- Tests/cameras/fade fx.js | 2 +- Tests/cameras/fade fx.ts | 2 +- Tests/cameras/flash fx.js | 2 +- Tests/cameras/flash fx.ts | 2 +- Tests/cameras/focus on.js | 2 +- Tests/cameras/focus on.ts | 2 +- Tests/cameras/follow deadzone.js | 2 +- Tests/cameras/follow deadzone.ts | 2 +- Tests/cameras/follow sprite.js | 2 +- Tests/cameras/follow sprite.ts | 2 +- Tests/cameras/follow topdown.js | 2 +- Tests/cameras/follow topdown.ts | 2 +- Tests/cameras/multicam1.js | 2 +- Tests/cameras/multicam1.ts | 2 +- Tests/cameras/scroll factor.js | 2 +- Tests/cameras/scroll factor.ts | 2 +- Tests/cameras/shake fx.js | 2 +- Tests/cameras/shake fx.ts | 2 +- Tests/collision/collide sprites.js | 2 +- Tests/collision/collide sprites.ts | 2 +- Tests/collision/falling balls.js | 2 +- Tests/collision/falling balls.ts | 2 +- Tests/geometry/circle.js | 2 +- Tests/geometry/circle.ts | 2 +- Tests/geometry/line.js | 2 +- Tests/geometry/line.ts | 2 +- Tests/geometry/point.js | 2 +- Tests/geometry/point.ts | 2 +- Tests/geometry/rect vs rect.js | 2 +- Tests/geometry/rect vs rect.ts | 2 +- Tests/groups/basic group.js | 2 +- Tests/groups/basic group.ts | 2 +- Tests/input/mouse scale.js | 2 +- Tests/input/mouse scale.ts | 2 +- Tests/mini games/formula 1.js | 2 +- Tests/mini games/formula 1.ts | 2 +- Tests/misc/multi game.js | 2 +- Tests/misc/multi game.ts | 2 +- Tests/particles/basic emitter.js | 2 +- Tests/particles/basic emitter.ts | 2 +- Tests/particles/graphic emitter.js | 2 +- Tests/particles/graphic emitter.ts | 2 +- Tests/particles/multiple streams.js | 2 +- Tests/particles/multiple streams.ts | 2 +- Tests/particles/when particles collide.js | 2 +- Tests/particles/when particles collide.ts | 2 +- Tests/phaser.js | 3048 +++++++++-------- Tests/sprites/animate by framename.js | 2 +- Tests/sprites/animate by framename.ts | 2 +- Tests/sprites/animation 1.js | 2 +- Tests/sprites/animation 1.ts | 2 +- Tests/sprites/dynamic texture 1.js | 2 +- Tests/sprites/dynamic texture 1.ts | 2 +- Tests/sprites/dynamic texture 2.js | 2 +- Tests/sprites/dynamic texture 2.ts | 2 +- Tests/sprites/mark of the bunny.js | 2 +- Tests/sprites/mark of the bunny.ts | 2 +- Tests/sprites/rotation.js | 2 +- Tests/sprites/rotation.ts | 2 +- Tests/sprites/texture atlas 2.js | 2 +- Tests/sprites/texture atlas 2.ts | 2 +- Tests/sprites/texture atlas 3.js | 2 +- Tests/sprites/texture atlas 3.ts | 2 +- Tests/sprites/texture atlas 4.js | 2 +- Tests/sprites/texture atlas 4.ts | 2 +- Tests/sprites/texture atlas.js | 2 +- Tests/sprites/texture atlas.ts | 2 +- Tests/sprites/velocity.js | 2 +- Tests/sprites/velocity.ts | 2 +- Tests/tilemap/basic tilemap.js | 2 +- Tests/tilemap/basic tilemap.ts | 2 +- Tests/tweens/bounce.js | 2 +- Tests/tweens/bounce.ts | 2 +- Tests/tweens/elastic.js | 2 +- Tests/tweens/elastic.ts | 2 +- build/phaser.js | 3048 +++++++++-------- 109 files changed, 3458 insertions(+), 3227 deletions(-) create mode 100644 Docs/phaser_balls.png create mode 100644 Docs/phaser_cams.png create mode 100644 Docs/phaser_particles.png create mode 100644 Docs/phaser_tilemap.png rename Phaser/{Animations.ts => AnimationManager.ts} (99%) rename Phaser/{Cameras.ts => CameraManager.ts} (98%) diff --git a/Docs/phaser_balls.png b/Docs/phaser_balls.png new file mode 100644 index 0000000000000000000000000000000000000000..94295b25c6986b686116c1b3c4b8fb4b68e6e0f5 GIT binary patch literal 27368 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

RC`8f%Ch;(+{Gu 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 K4e3;;;Qs+qZ(iO2 literal 0 HcmV?d00001 diff --git a/Docs/phaser_cams.png b/Docs/phaser_cams.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcad77189ef856a7d93a6e5da9d9d48bd06111c GIT binary patch literal 50046 zcmeFad03Oz`Zfw>x3on;ix7|@S}Q0B6cHH$#1;YF3W$KH45>s#K}F^v3DG(*1QL}Z z%2)*%m53-aNmW7wG!YQPm}mkL#txnuiYIXQ(ja&lkn|N1N7CmE5yo(BGq58LbXvs@WPdl>l3 zzXE=8{z*=*9H%5c^d<23Z%*$x5GE(5{8;v%JUO`Nu$sPGKinvbX zTCG33;=7-}8MfWFM*iobZ!Xb?SHyDG&(K$v8{RA3Q2X)$zcSL-*H_fjU(g#qk3W@) zJ<`n+Qbjpgr#IKA>@4VWqS%D_=I+u|eoYZyi=kQ+dK%Esc3oCRHJXasYv?M6h+N15NrF|?|23~y`SlmF?wFoO6lHcv@ZgUuA*1v z>8WNX%C?aI2;wmF`?YsVct4?RTa~tBd9t$ zaf0)41#ji`ZUOG&qkGX+JyrjBksQ+HnYV(Rp;v}Ompr3lBJGxBg3*45h%O_Fikr6w zygirVNtczj8x~Lg?qCZDAg6Yjm_!|j-uC|>%R2O~Dv6|K(HZ{D)(`R`mp+-3sD_eG zU`mPPRKrKj{c9UJIr?STuBwwL$cJNGypN7bf?wxI125{I>iC@B7R4`?lwG1XUB(Ju>PC)Gre_^LL)}1H-E5XKY&1_6q2<8^9N| zf={OWYp+LFI>fodA#uAWg4LIFEAE`pJ-`=19iL1IIE7=WiUV};Fpw9V`cpW86=525fIy|=xM=nFwNP-mDZJ^5T@{eq51hwoFK3vS=;3V(Kr-7E5fib!fbmfC$ znKLdv4Dp5K8l9YDn9f(x4+5e;C*t8b@cM@rX-QL?VyTMMvIlJ9PE~V2UTu1h^8~oT z9F7;tq?RL@_=<77xTP~!dk-M?MTrj(G4F8{ZZX7fET|>?@r;xOjqcg1Ri;WZ&#R7H zMY}{FZQhr>qE_$2!Mlg?l(8kD;b?0E+A2FwrnJBoSj~ zS^2ZnIYX8=1tzKdr2aUsq&j+)^iZGYJZ^vz?7-JyBv14b-FUo!zS#!_r9Rx(@(!|m zY_U5vsDSN@6}*nm_2l%LYc2S^`wl4lHzf0$)%#Y_l9@ejgfO>dm+xq;Mfy$wivQLV z7rg17#Gd4~VMC)moXDNI2`!#z^)y4MdKwShKSMk+7u-Ms%zl;!%=NI`mH;^vkkOM}+F|FS8seRNtq0NY!p~Iq^p+ZH3qca!l%XRVN z7Cvo2*9tdrJYGH6`60i{@P90_01HKA)*MwFTI$Q^<~BV53wQP>p>yK;?{rQQrAAP! zmaaflt0uLXuk{}7j+2rOyde1f2G19q!!XxN{frcBCNWvDPdSN!;A%XFcPRHr#3o{&aJ=}$GTZyMYD7NM^mlTB&axNN z#A;7UjJ*d15$0hW?d@S47v*6r+UD^RJ#c;Hy$jIpd>HM+(pSG6n$KkFz>t}7;dIIJ zvA%;Os4H>eW#9~h@n9lMu)5~K!X|hph*IXJK$uBwurQSB0D=&FmcMuMpxw4WKa<)rQFu5*3_>|R;Ug%JCB$nTV`}G9fg;@5{%x+Uf z7FOFTom&-mJR5bOse##=Ye`N&C%KXh{K&D;Z@(ZqRd9=~j z^R)#%x`0BZ4ras~T7Q-J2sMgqKq(V%0A|>y^@sda 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%0Do5OjKc5W7a05VIXR8-pTb*rOo^DrdboS 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 * - * @param ObjectClass The class type you want to recycle (e.g. FlxBasic, EvilRobot, etc). Do NOT "new" the class in the parameter! + * @param ObjectClass The class type you want to recycle (e.g. Basic, EvilRobot, etc). Do NOT "new" the class in the parameter! * * @return A reference to the object that was created. Don't forget to cast it back to the Class you want (e.g. myObject = myGroup.recycle(myObjectClass) as myObjectClass;). */ @@ -382,7 +382,7 @@ module Phaser { * Call this function to sort the group according to a particular value and order. * For example, to sort game objects for Zelda-style overlaps you might call * myGroup.sort("y",Group.ASCENDING) at the bottom of your - * FlxState.update() override. To sort all existing objects after + * State.update() override. To sort all existing objects after * a big explosion or bomb attack, you might call myGroup.sort("exists",Group.DESCENDING). * * @param Index The string name of the member variable you want to sort on. Default value is "y". @@ -696,7 +696,7 @@ module Phaser { } /** - * Remove all instances of Basic subclass (FlxBasic, FlxBlock, etc) from the list. + * Remove all instances of Basic subclass (Basic, Block, etc) from the list. * WARNING: does not destroy() or kill() any of these objects! */ public clear() { diff --git a/Phaser/Phaser.csproj b/Phaser/Phaser.csproj index 4e589267..305314ad 100644 --- a/Phaser/Phaser.csproj +++ b/Phaser/Phaser.csproj @@ -1,4 +1,4 @@ - + Debug @@ -55,70 +55,253 @@ ../build/phaser.js - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + AnimationManager.ts + + + Collision.ts + + + DynamicTexture.ts + + + Game.ts + + + GameMath.ts + + + Emitter.ts + + + GameObject.ts + + + GeomSprite.ts + + + Particle.ts + + + Sprite.ts + + + Tilemap.ts + + + Circle.ts + + + IntersectResult.ts + + + Line.ts + + + Point.ts + + + Rectangle.ts + + + Animation.ts + + + AnimationLoader.ts + + + Frame.ts + + + FrameData.ts + + + Camera.ts + + + Device.ts + + + LinkedList.ts + + + QuadTree.ts + + + RandomDataGenerator.ts + + + RequestAnimationFrame.ts + + + StageScaleMode.ts + + + Tile.ts + + + TilemapBuffer.ts + + + Tween.ts + + + + + + + + + + + + + Back.ts + + + Bounce.ts + + + Circular.ts + + + Cubic.ts + + + Elastic.ts + + + Exponential.ts + + + Linear.ts + + + Quadratic.ts + + + Quartic.ts + + + Quintic.ts + + + Sinusoidal.ts + + + Finger.ts + + + Input.ts + + + Keyboard.ts + + + Mouse.ts + + + Touch.ts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Group.ts + + + Loader.ts + + + Motion.ts + + + Phaser.ts + + + Signal.ts + + + SignalBinding.ts + + + Sound.ts + + + Stage.ts + + + State.ts + + + Time.ts + + + TweenManager.ts + + + World.ts + + + + + + + + + + + + + + + + + + + + Basic.ts + + + Cache.ts + + + CameraManager.ts + + + + diff --git a/Phaser/World.ts b/Phaser/World.ts index 281a8896..cbf66ebf 100644 --- a/Phaser/World.ts +++ b/Phaser/World.ts @@ -12,7 +12,7 @@ module Phaser { this._game = game; - this._cameras = new Cameras(this._game, 0, 0, width, height); + this._cameras = new CameraManager(this._game, 0, 0, width, height); this._game.camera = this._cameras.current; @@ -25,7 +25,7 @@ module Phaser { } private _game: Game; - private _cameras: Cameras; + private _cameras: CameraManager; public group: Group; public bounds: Rectangle; diff --git a/Phaser/gameobjects/Emitter.ts b/Phaser/gameobjects/Emitter.ts index 5920c50c..fd9bc3dc 100644 --- a/Phaser/gameobjects/Emitter.ts +++ b/Phaser/gameobjects/Emitter.ts @@ -24,7 +24,7 @@ module Phaser { export class Emitter extends Group { /** - * Creates a new FlxEmitter object at a specific position. + * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * * @param X The X position of the emitter. @@ -176,13 +176,13 @@ module Phaser { /** * This function generates a new array of particle sprites to attach to the emitter. * - * @param Graphics If you opted to not pre-configure an array of FlxSprite objects, you can simply pass in a particle image or sprite sheet. + * @param Graphics If you opted to not pre-configure an array of Sprite objects, you can simply pass in a particle image or sprite sheet. * @param Quantity The number of particles to generate when using the "create from image" option. * @param BakedRotations How many frames of baked rotation to use (boosts performance). Set to zero to not use baked rotations. * @param Multiple Whether the image in the Graphics param is a single particle or a bunch of particles (if it's a bunch, they need to be square!). * @param Collide Whether the particles should be flagged as not 'dead' (non-colliding particles are higher performance). 0 means no collisions, 0-1 controls scale of particle's bounding box. * - * @return This FlxEmitter instance (nice for chaining stuff together, if you're into that). + * @return This Emitter instance (nice for chaining stuff together, if you're into that). */ public makeParticles(Graphics, Quantity: number = 50, BakedRotations: number = 16, Multiple: bool = false, Collide: number = 0.8): Emitter { @@ -447,9 +447,9 @@ module Phaser { } /** - * Change the emitter's midpoint to match the midpoint of a FlxObject. + * Change the emitter's midpoint to match the midpoint of a Object. * - * @param Object The FlxObject that you want to sync up with. + * @param Object The Object that you want to sync up with. */ public at(Object) { Object.getMidpoint(this._point); diff --git a/Phaser/gameobjects/GameObject.ts b/Phaser/gameobjects/GameObject.ts index 6a176501..abe94f80 100644 --- a/Phaser/gameobjects/GameObject.ts +++ b/Phaser/gameobjects/GameObject.ts @@ -1,5 +1,6 @@ /// /// +/// /** * Phaser @@ -80,6 +81,15 @@ module Phaser { public allowCollisions: number; public last: Point; + // Input + public inputEnabled: bool = false; + private _inputOver: bool = false; + + public onInputOver: Phaser.Signal; + public onInputOut: Phaser.Signal; + public onInputDown: Phaser.Signal; + public onInputUp: Phaser.Signal; + public preUpdate() { // flicker time @@ -99,9 +109,20 @@ module Phaser { this.updateMotion(); } + if (this.inputEnabled) + { + this.updateInput(); + } + this.wasTouching = this.touching; this.touching = Collision.NONE; + } + + private updateInput() { + + + } private updateMotion() { @@ -129,8 +150,8 @@ module Phaser { } /** - * Checks to see if some GameObject overlaps this GameObject or FlxGroup. - * If the group has a LOT of things in it, it might be faster to use FlxG.overlaps(). + * Checks to see if some GameObject overlaps this GameObject or Group. + * If the group has a LOT of things in it, it might be faster to use G.overlaps(). * WARNING: Currently tilemaps do NOT support screen space overlap checks! * * @param ObjectOrGroup The object or group being tested. @@ -160,7 +181,7 @@ module Phaser { } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. @@ -190,7 +211,7 @@ module Phaser { } /** - * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or FlxGroup? + * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or Group? * This is distinct from overlapsPoint(), which just checks that ponumber, rather than taking the object's size numbero account. * WARNING: Currently tilemaps do NOT support screen space overlap checks! * @@ -223,13 +244,13 @@ module Phaser { } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. //However, since this is overlapsAt(), we also have to invent the appropriate position for the tilemap. //So we calculate the offset between the player and the requested position, and subtract that from the tilemap. - var tilemap: FlxTilemap = ObjectOrGroup; + var tilemap: Tilemap = ObjectOrGroup; return tilemap.overlapsAt(tilemap.x - (X - this.x), tilemap.y - (Y - this.y), this, InScreenSpace, Camera); } */ diff --git a/Phaser/gameobjects/GeomSprite.ts b/Phaser/gameobjects/GeomSprite.ts index 4abd43e8..3842b969 100644 --- a/Phaser/gameobjects/GeomSprite.ts +++ b/Phaser/gameobjects/GeomSprite.ts @@ -217,7 +217,7 @@ module Phaser { this._dy -= (camera.worldView.y * this.scrollFactor.y); } - // Rotation (misleading?) + // Rotation (could be misleading as it doesn't work re: collision) if (this.angle !== 0) { this._game.stage.context.save(); @@ -235,8 +235,8 @@ module Phaser { this._game.stage.saveCanvasValues(); // Debug - this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; - this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); + //this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); this._game.stage.context.lineWidth = this.lineWidth; this._game.stage.context.strokeStyle = this.lineColor; diff --git a/Phaser/gameobjects/Sprite.ts b/Phaser/gameobjects/Sprite.ts index 7dae0726..309b9998 100644 --- a/Phaser/gameobjects/Sprite.ts +++ b/Phaser/gameobjects/Sprite.ts @@ -1,4 +1,5 @@ /// +/// /// /** @@ -15,7 +16,7 @@ module Phaser { this._texture = null; - this.animations = new Animations(this._game, this); + this.animations = new AnimationManager(this._game, this); if (key !== null) { @@ -34,7 +35,7 @@ module Phaser { private _context: CanvasRenderingContext2D; private _dynamicTexture: bool = false; - public animations: Animations; + public animations: AnimationManager; // local rendering related temp vars to help avoid gc spikes private _sx: number = 0; @@ -189,7 +190,8 @@ module Phaser { if (this.angle !== 0) { this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + //this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); this._game.stage.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); diff --git a/Phaser/system/Camera.ts b/Phaser/system/Camera.ts index 08b1ae1e..4908d746 100644 --- a/Phaser/system/Camera.ts +++ b/Phaser/system/Camera.ts @@ -1,5 +1,5 @@ -/// /// +/// /** * Phaser @@ -281,7 +281,7 @@ module Phaser { this.bounds.setTo(X, Y, Width, Height); //if(UpdateWorld) - // FlxG.worldBounds.copyFrom(bounds); + // G.worldBounds.copyFrom(bounds); this.update(); } diff --git a/Phaser/system/Tile.ts b/Phaser/system/Tile.ts index f1ed3794..d509f4b6 100644 --- a/Phaser/system/Tile.ts +++ b/Phaser/system/Tile.ts @@ -18,7 +18,7 @@ module Phaser { export class Tile extends GameObject { /** - * Instantiate this new tile object. This is usually called from FlxTilemap.loadMap(). + * Instantiate this new tile object. This is usually called from Tilemap.loadMap(). * * @param Tilemap A reference to the tilemap object creating the tile. * @param Index The actual core map data index for this tile type. @@ -47,8 +47,8 @@ module Phaser { /** * This function is called whenever an object hits a tile of this type. - * This function should take the form myFunction(Tile:FlxTile,Object:FlxObject). - * Defaults to null, set through FlxTilemap.setTileProperties(). + * This function should take the form myFunction(Tile:Tile,Object:Object). + * Defaults to null, set through Tilemap.setTileProperties(). */ public callback; @@ -56,7 +56,7 @@ module Phaser { * Each tile can store its own filter class for their callback functions. * That is, the callback will only be triggered if an object with a class * type matching the filter touched it. - * Defaults to null, set through FlxTilemap.setTileProperties(). + * Defaults to null, set through Tilemap.setTileProperties(). */ public filter; diff --git a/Phaser/system/input/Input.ts b/Phaser/system/input/Input.ts index 97dc0c4a..979e8128 100644 --- a/Phaser/system/input/Input.ts +++ b/Phaser/system/input/Input.ts @@ -1,4 +1,5 @@ /// +/// /** * Phaser diff --git a/Tests/cameras/camera alpha.js b/Tests/cameras/camera alpha.js index d6d0c4c9..c233a13d 100644 --- a/Tests/cameras/camera alpha.js +++ b/Tests/cameras/camera alpha.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera alpha.ts b/Tests/cameras/camera alpha.ts index 991f7e8b..f2e778dc 100644 --- a/Tests/cameras/camera alpha.ts +++ b/Tests/cameras/camera alpha.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera bounds.js b/Tests/cameras/camera bounds.js index 8df24139..c4f2a11a 100644 --- a/Tests/cameras/camera bounds.js +++ b/Tests/cameras/camera bounds.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera bounds.ts b/Tests/cameras/camera bounds.ts index c230bbda..86156586 100644 --- a/Tests/cameras/camera bounds.ts +++ b/Tests/cameras/camera bounds.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera position.js b/Tests/cameras/camera position.js index c29b2442..f67e2cf3 100644 --- a/Tests/cameras/camera position.js +++ b/Tests/cameras/camera position.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera position.ts b/Tests/cameras/camera position.ts index 4c96e38f..28071bc7 100644 --- a/Tests/cameras/camera position.ts +++ b/Tests/cameras/camera position.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera rotation.js b/Tests/cameras/camera rotation.js index cee7d428..f9adc46b 100644 --- a/Tests/cameras/camera rotation.js +++ b/Tests/cameras/camera rotation.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera rotation.ts b/Tests/cameras/camera rotation.ts index 3d589f1c..1192829c 100644 --- a/Tests/cameras/camera rotation.ts +++ b/Tests/cameras/camera rotation.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera scale.js b/Tests/cameras/camera scale.js index 294e7c88..965bfc67 100644 --- a/Tests/cameras/camera scale.js +++ b/Tests/cameras/camera scale.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera scale.ts b/Tests/cameras/camera scale.ts index 4a6e98f1..b7f34e0d 100644 --- a/Tests/cameras/camera scale.ts +++ b/Tests/cameras/camera scale.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera shadow.js b/Tests/cameras/camera shadow.js index 68068824..8e9d2831 100644 --- a/Tests/cameras/camera shadow.js +++ b/Tests/cameras/camera shadow.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera shadow.ts b/Tests/cameras/camera shadow.ts index 7c2a2efb..835a3262 100644 --- a/Tests/cameras/camera shadow.ts +++ b/Tests/cameras/camera shadow.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/camera texture.js b/Tests/cameras/camera texture.js index 0670f0b3..75e0c5ae 100644 --- a/Tests/cameras/camera texture.js +++ b/Tests/cameras/camera texture.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/camera texture.ts b/Tests/cameras/camera texture.ts index 3fd5be13..5ecd5a37 100644 --- a/Tests/cameras/camera texture.ts +++ b/Tests/cameras/camera texture.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/fade fx.js b/Tests/cameras/fade fx.js index e46468c1..57a724f9 100644 --- a/Tests/cameras/fade fx.js +++ b/Tests/cameras/fade fx.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/fade fx.ts b/Tests/cameras/fade fx.ts index ad8820e6..450cbdf1 100644 --- a/Tests/cameras/fade fx.ts +++ b/Tests/cameras/fade fx.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/flash fx.js b/Tests/cameras/flash fx.js index fdc2b2e4..1dd3888e 100644 --- a/Tests/cameras/flash fx.js +++ b/Tests/cameras/flash fx.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/flash fx.ts b/Tests/cameras/flash fx.ts index 85872c42..62efa791 100644 --- a/Tests/cameras/flash fx.ts +++ b/Tests/cameras/flash fx.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/focus on.js b/Tests/cameras/focus on.js index 946cb70a..c6ca1757 100644 --- a/Tests/cameras/focus on.js +++ b/Tests/cameras/focus on.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/focus on.ts b/Tests/cameras/focus on.ts index c832758a..36e40b2b 100644 --- a/Tests/cameras/focus on.ts +++ b/Tests/cameras/focus on.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/follow deadzone.js b/Tests/cameras/follow deadzone.js index 3a25394d..d521a47f 100644 --- a/Tests/cameras/follow deadzone.js +++ b/Tests/cameras/follow deadzone.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/follow deadzone.ts b/Tests/cameras/follow deadzone.ts index 1fcb09de..dcbec480 100644 --- a/Tests/cameras/follow deadzone.ts +++ b/Tests/cameras/follow deadzone.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/follow sprite.js b/Tests/cameras/follow sprite.js index 84d49648..786116b4 100644 --- a/Tests/cameras/follow sprite.js +++ b/Tests/cameras/follow sprite.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/follow sprite.ts b/Tests/cameras/follow sprite.ts index 7879dddf..44dcedb9 100644 --- a/Tests/cameras/follow sprite.ts +++ b/Tests/cameras/follow sprite.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/follow topdown.js b/Tests/cameras/follow topdown.js index 9a81772c..dcee55b4 100644 --- a/Tests/cameras/follow topdown.js +++ b/Tests/cameras/follow topdown.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/follow topdown.ts b/Tests/cameras/follow topdown.ts index 35343425..6b965e63 100644 --- a/Tests/cameras/follow topdown.ts +++ b/Tests/cameras/follow topdown.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/multicam1.js b/Tests/cameras/multicam1.js index 8d43cc3a..d574a6ab 100644 --- a/Tests/cameras/multicam1.js +++ b/Tests/cameras/multicam1.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/multicam1.ts b/Tests/cameras/multicam1.ts index a746007d..8aba9d61 100644 --- a/Tests/cameras/multicam1.ts +++ b/Tests/cameras/multicam1.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/scroll factor.js b/Tests/cameras/scroll factor.js index edf98a9e..3f57be57 100644 --- a/Tests/cameras/scroll factor.js +++ b/Tests/cameras/scroll factor.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/scroll factor.ts b/Tests/cameras/scroll factor.ts index 7214e6f6..accf2c0a 100644 --- a/Tests/cameras/scroll factor.ts +++ b/Tests/cameras/scroll factor.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/cameras/shake fx.js b/Tests/cameras/shake fx.js index 1ef6fb50..8589d49c 100644 --- a/Tests/cameras/shake fx.js +++ b/Tests/cameras/shake fx.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/cameras/shake fx.ts b/Tests/cameras/shake fx.ts index 46a05577..fababf07 100644 --- a/Tests/cameras/shake fx.ts +++ b/Tests/cameras/shake fx.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/collision/collide sprites.js b/Tests/collision/collide sprites.js index 1cc9f9e9..9505f28e 100644 --- a/Tests/collision/collide sprites.js +++ b/Tests/collision/collide sprites.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/collision/collide sprites.ts b/Tests/collision/collide sprites.ts index 16026290..f14ed214 100644 --- a/Tests/collision/collide sprites.ts +++ b/Tests/collision/collide sprites.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/collision/falling balls.js b/Tests/collision/falling balls.js index 1f9858a5..785fe100 100644 --- a/Tests/collision/falling balls.js +++ b/Tests/collision/falling balls.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/collision/falling balls.ts b/Tests/collision/falling balls.ts index 48026fa3..8298b4b8 100644 --- a/Tests/collision/falling balls.ts +++ b/Tests/collision/falling balls.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/geometry/circle.js b/Tests/geometry/circle.js index 13768314..45541740 100644 --- a/Tests/geometry/circle.js +++ b/Tests/geometry/circle.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, null, create, update); var circle; diff --git a/Tests/geometry/circle.ts b/Tests/geometry/circle.ts index 5cd5701c..b0d62e20 100644 --- a/Tests/geometry/circle.ts +++ b/Tests/geometry/circle.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/geometry/line.js b/Tests/geometry/line.js index 45cec9b2..6d7399bd 100644 --- a/Tests/geometry/line.js +++ b/Tests/geometry/line.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, null, create, update); var line; diff --git a/Tests/geometry/line.ts b/Tests/geometry/line.ts index 4f60012d..c56ebe46 100644 --- a/Tests/geometry/line.ts +++ b/Tests/geometry/line.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/geometry/point.js b/Tests/geometry/point.js index b8534204..db451559 100644 --- a/Tests/geometry/point.js +++ b/Tests/geometry/point.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, null, create, update); var floor; diff --git a/Tests/geometry/point.ts b/Tests/geometry/point.ts index 666bdbd7..3146b332 100644 --- a/Tests/geometry/point.ts +++ b/Tests/geometry/point.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/geometry/rect vs rect.js b/Tests/geometry/rect vs rect.js index c55ae659..749d18a6 100644 --- a/Tests/geometry/rect vs rect.js +++ b/Tests/geometry/rect vs rect.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, null, create, update); var box1; diff --git a/Tests/geometry/rect vs rect.ts b/Tests/geometry/rect vs rect.ts index d6611db0..f7f19d20 100644 --- a/Tests/geometry/rect vs rect.ts +++ b/Tests/geometry/rect vs rect.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/groups/basic group.js b/Tests/groups/basic group.js index 688727fe..1a69cf9e 100644 --- a/Tests/groups/basic group.js +++ b/Tests/groups/basic group.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/groups/basic group.ts b/Tests/groups/basic group.ts index 8be97e40..82865f52 100644 --- a/Tests/groups/basic group.ts +++ b/Tests/groups/basic group.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/input/mouse scale.js b/Tests/input/mouse scale.js index c3f485f3..2fe33f0d 100644 --- a/Tests/input/mouse scale.js +++ b/Tests/input/mouse scale.js @@ -1,4 +1,4 @@ -/// +/// (function () { // Here we create a quite tiny game (320x240 in size) var myGame = new Phaser.Game(this, 'game', 320, 240, init, create, update); diff --git a/Tests/input/mouse scale.ts b/Tests/input/mouse scale.ts index fd71278c..920d3b1b 100644 --- a/Tests/input/mouse scale.ts +++ b/Tests/input/mouse scale.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/mini games/formula 1.js b/Tests/mini games/formula 1.js index 1dea87ec..656b572e 100644 --- a/Tests/mini games/formula 1.js +++ b/Tests/mini games/formula 1.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 840, 400, init, create, update); function init() { diff --git a/Tests/mini games/formula 1.ts b/Tests/mini games/formula 1.ts index 4185b42b..7b19ccb8 100644 --- a/Tests/mini games/formula 1.ts +++ b/Tests/mini games/formula 1.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/misc/multi game.js b/Tests/misc/multi game.js index 43835baa..3e36a306 100644 --- a/Tests/misc/multi game.js +++ b/Tests/misc/multi game.js @@ -1,4 +1,4 @@ -/// +/// (function () { // Let's test having 2 totally separate games embedded on the same page var myGame = new Phaser.Game(this, 'game', 400, 400, init, create, update); diff --git a/Tests/misc/multi game.ts b/Tests/misc/multi game.ts index ad47c6b2..39ac2867 100644 --- a/Tests/misc/multi game.ts +++ b/Tests/misc/multi game.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/particles/basic emitter.js b/Tests/particles/basic emitter.js index e1beeb3c..ca536376 100644 --- a/Tests/particles/basic emitter.js +++ b/Tests/particles/basic emitter.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, null, create); var emitter; diff --git a/Tests/particles/basic emitter.ts b/Tests/particles/basic emitter.ts index 7ebb42b7..960c609a 100644 --- a/Tests/particles/basic emitter.ts +++ b/Tests/particles/basic emitter.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/particles/graphic emitter.js b/Tests/particles/graphic emitter.js index 3a3ae968..d3d7ab5d 100644 --- a/Tests/particles/graphic emitter.js +++ b/Tests/particles/graphic emitter.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); var emitter; diff --git a/Tests/particles/graphic emitter.ts b/Tests/particles/graphic emitter.ts index 861fe51a..02c5e22d 100644 --- a/Tests/particles/graphic emitter.ts +++ b/Tests/particles/graphic emitter.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/particles/multiple streams.js b/Tests/particles/multiple streams.js index f70d0a40..07510e7d 100644 --- a/Tests/particles/multiple streams.js +++ b/Tests/particles/multiple streams.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); var emitter1; diff --git a/Tests/particles/multiple streams.ts b/Tests/particles/multiple streams.ts index e265baa5..bdadb044 100644 --- a/Tests/particles/multiple streams.ts +++ b/Tests/particles/multiple streams.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/particles/when particles collide.js b/Tests/particles/when particles collide.js index f46d1c58..f1868cbf 100644 --- a/Tests/particles/when particles collide.js +++ b/Tests/particles/when particles collide.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); var leftEmitter; diff --git a/Tests/particles/when particles collide.ts b/Tests/particles/when particles collide.ts index d7fd7d63..51b4ad4e 100644 --- a/Tests/particles/when particles collide.ts +++ b/Tests/particles/when particles collide.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/phaser.js b/Tests/phaser.js index 1ddb5002..c6d155bc 100644 --- a/Tests/phaser.js +++ b/Tests/phaser.js @@ -1,21 +1,3 @@ -/** -* Phaser -* -* v0.9 - April 18th 2013 -* -* A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. -* -* Richard Davey (@photonstorm) -* Adam Saltsman (@ADAMATOMIC) (original Flixel code) -* -* "If you want your children to be intelligent, read them fairy tales." -* "If you want them to be more intelligent, read them more fairy tales." -* -- Albert Einstein -*/ -var Phaser; -(function (Phaser) { - Phaser.VERSION = 'Phaser version 0.9'; -})(Phaser || (Phaser = {})); /// /** * This is a useful "generic" object. @@ -86,7 +68,7 @@ var Phaser; }; Basic.prototype.revive = /** * Handy for bringing game objects "back to life". Just sets alive and exists back to true. - * In practice, this is most often called by FlxObject.reset(). + * In practice, this is most often called by Object.reset(). */ function () { this.alive = true; @@ -102,129 +84,390 @@ var Phaser; })(); Phaser.Basic = Basic; })(Phaser || (Phaser = {})); -/// +/// +/* +* SignalBinding +* +* @desc An object that represents a binding between a Signal and a listener function. +* Released under the MIT license +* http://millermedeiros.github.com/js-signals/ +* +* @version 1. - 7th March 2013 +* +* @author Richard Davey, TypeScript conversion +* @author Miller Medeiros, JS Signals +* +*/ /** * Phaser */ var Phaser; (function (Phaser) { - var Cache = (function () { - function Cache(game) { - this._game = game; - this._canvases = { - }; - this._images = { - }; - this._sounds = { - }; - this._text = { - }; + var SignalBinding = (function () { + /** + * Object that represents a binding between a Signal and a listener function. + *
- This is an internal constructor and shouldn't be called by regular users. + *
- inspired by Joa Ebert AS3 SignalBinding and Robert Penner's Slot classes. + * @author Miller Medeiros + * @constructor + * @internal + * @name SignalBinding + * @param {Signal} signal Reference to Signal object that listener is currently bound to. + * @param {Function} listener Handler function bound to the signal. + * @param {boolean} isOnce If binding should be executed just once. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. (default = 0). + */ + function SignalBinding(signal, listener, isOnce, listenerContext, priority) { + if (typeof priority === "undefined") { priority = 0; } + /** + * If binding is active and should be executed. + * @type boolean + */ + this.active = true; + /** + * Default parameters passed to listener during `Signal.dispatch` and `SignalBinding.execute`. (curried parameters) + * @type Array|null + */ + this.params = null; + this._listener = listener; + this._isOnce = isOnce; + this.context = listenerContext; + this._signal = signal; + this.priority = priority || 0; } - Cache.prototype.addCanvas = function (key, canvas, context) { - this._canvases[key] = { - canvas: canvas, - context: context - }; - }; - Cache.prototype.addSpriteSheet = function (key, url, data, frameWidth, frameHeight, frameMax) { - this._images[key] = { - url: url, - data: data, - spriteSheet: true, - frameWidth: frameWidth, - frameHeight: frameHeight - }; - this._images[key].frameData = Phaser.AnimationLoader.parseSpriteSheet(this._game, key, frameWidth, frameHeight, frameMax); - }; - Cache.prototype.addTextureAtlas = function (key, url, data, jsonData) { - this._images[key] = { - url: url, - data: data, - spriteSheet: true - }; - this._images[key].frameData = Phaser.AnimationLoader.parseJSONData(this._game, jsonData); - }; - Cache.prototype.addImage = function (key, url, data) { - this._images[key] = { - url: url, - data: data, - spriteSheet: false - }; - }; - Cache.prototype.addSound = function (key, url, data) { - this._sounds[key] = { - url: url, - data: data, - decoded: false - }; - }; - Cache.prototype.decodedSound = function (key, data) { - this._sounds[key].data = data; - this._sounds[key].decoded = true; - }; - Cache.prototype.addText = function (key, url, data) { - this._text[key] = { - url: url, - data: data - }; - }; - Cache.prototype.getCanvas = function (key) { - if(this._canvases[key]) { - return this._canvases[key].canvas; + SignalBinding.prototype.execute = /** + * Call listener passing arbitrary parameters. + *

If binding was added using `Signal.addOnce()` it will be automatically removed from signal dispatch queue, this method is used internally for the signal dispatch.

+ * @param {Array} [paramsArr] Array of parameters that should be passed to the listener + * @return {*} Value returned by the listener. + */ + function (paramsArr) { + var handlerReturn; + var params; + if(this.active && !!this._listener) { + params = this.params ? this.params.concat(paramsArr) : paramsArr; + handlerReturn = this._listener.apply(this.context, params); + if(this._isOnce) { + this.detach(); + } } - return null; + return handlerReturn; }; - Cache.prototype.getImage = function (key) { - if(this._images[key]) { - return this._images[key].data; - } - return null; + SignalBinding.prototype.detach = /** + * Detach binding from signal. + * - alias to: mySignal.remove(myBinding.getListener()); + * @return {Function|null} Handler function bound to the signal or `null` if binding was previously detached. + */ + function () { + return this.isBound() ? this._signal.remove(this._listener, this.context) : null; }; - Cache.prototype.getFrameData = function (key) { - if(this._images[key] && this._images[key].spriteSheet == true) { - return this._images[key].frameData; - } - return null; + SignalBinding.prototype.isBound = /** + * @return {Boolean} `true` if binding is still bound to the signal and have a listener. + */ + function () { + return (!!this._signal && !!this._listener); }; - Cache.prototype.getSound = function (key) { - if(this._sounds[key]) { - return this._sounds[key].data; - } - return null; + SignalBinding.prototype.isOnce = /** + * @return {boolean} If SignalBinding will only be executed once. + */ + function () { + return this._isOnce; }; - Cache.prototype.isSoundDecoded = function (key) { - if(this._sounds[key]) { - return this._sounds[key].decoded; - } + SignalBinding.prototype.getListener = /** + * @return {Function} Handler function bound to the signal. + */ + function () { + return this._listener; }; - Cache.prototype.isSpriteSheet = function (key) { - if(this._images[key]) { - return this._images[key].spriteSheet; - } + SignalBinding.prototype.getSignal = /** + * @return {Signal} Signal that listener is currently bound to. + */ + function () { + return this._signal; }; - Cache.prototype.getText = function (key) { - if(this._text[key]) { - return this._text[key].data; - } - return null; + SignalBinding.prototype._destroy = /** + * Delete instance properties + * @private + */ + function () { + delete this._signal; + delete this._listener; + delete this.context; }; - Cache.prototype.destroy = function () { - for(var item in this._canvases) { - delete this._canvases[item['key']]; - } - for(var item in this._images) { - delete this._images[item['key']]; - } - for(var item in this._sounds) { - delete this._sounds[item['key']]; - } - for(var item in this._text) { - delete this._text[item['key']]; - } + SignalBinding.prototype.toString = /** + * @return {string} String representation of the object. + */ + function () { + return '[SignalBinding isOnce:' + this._isOnce + ', isBound:' + this.isBound() + ', active:' + this.active + ']'; }; - return Cache; + return SignalBinding; })(); - Phaser.Cache = Cache; + Phaser.SignalBinding = SignalBinding; +})(Phaser || (Phaser = {})); +/// +/* +* Signal +* +* @desc A TypeScript conversion of JS Signals by Miller Medeiros +* Released under the MIT license +* http://millermedeiros.github.com/js-signals/ +* +* @version 1. - 7th March 2013 +* +* @author Richard Davey, TypeScript conversion +* @author Miller Medeiros, JS Signals +* +*/ +/** +* Custom event broadcaster +*
- inspired by Robert Penner's AS3 Signals. +* @name Signal +* @author Miller Medeiros +* @constructor +*/ +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Signal = (function () { + function Signal() { + /** + * + * @property _bindings + * @type Array + * @private + */ + this._bindings = []; + /** + * + * @property _prevParams + * @type Any + * @private + */ + this._prevParams = null; + /** + * If Signal should keep record of previously dispatched parameters and + * automatically execute listener during `add()`/`addOnce()` if Signal was + * already dispatched before. + * @type boolean + */ + this.memorize = false; + /** + * @type boolean + * @private + */ + this._shouldPropagate = true; + /** + * If Signal is active and should broadcast events. + *

IMPORTANT: Setting this property during a dispatch will only affect the next dispatch, if you want to stop the propagation of a signal use `halt()` instead.

+ * @type boolean + */ + this.active = true; + } + Signal.VERSION = '1.0.0'; + Signal.prototype.validateListener = /** + * + * @method validateListener + * @param {Any} listener + * @param {Any} fnName + */ + function (listener, fnName) { + if(typeof listener !== 'function') { + throw new Error('listener is a required param of {fn}() and should be a Function.'.replace('{fn}', fnName)); + } + }; + Signal.prototype._registerListener = /** + * @param {Function} listener + * @param {boolean} isOnce + * @param {Object} [listenerContext] + * @param {Number} [priority] + * @return {SignalBinding} + * @private + */ + function (listener, isOnce, listenerContext, priority) { + var prevIndex = this._indexOfListener(listener, listenerContext); + var binding; + if(prevIndex !== -1) { + binding = this._bindings[prevIndex]; + if(binding.isOnce() !== isOnce) { + throw new Error('You cannot add' + (isOnce ? '' : 'Once') + '() then add' + (!isOnce ? '' : 'Once') + '() the same listener without removing the relationship first.'); + } + } else { + binding = new Phaser.SignalBinding(this, listener, isOnce, listenerContext, priority); + this._addBinding(binding); + } + if(this.memorize && this._prevParams) { + binding.execute(this._prevParams); + } + return binding; + }; + Signal.prototype._addBinding = /** + * + * @method _addBinding + * @param {SignalBinding} binding + * @private + */ + function (binding) { + //simplified insertion sort + var n = this._bindings.length; + do { + --n; + }while(this._bindings[n] && binding.priority <= this._bindings[n].priority); + this._bindings.splice(n + 1, 0, binding); + }; + Signal.prototype._indexOfListener = /** + * + * @method _indexOfListener + * @param {Function} listener + * @return {number} + * @private + */ + function (listener, context) { + var n = this._bindings.length; + var cur; + while(n--) { + cur = this._bindings[n]; + if(cur.getListener() === listener && cur.context === context) { + return n; + } + } + return -1; + }; + Signal.prototype.has = /** + * Check if listener was attached to Signal. + * @param {Function} listener + * @param {Object} [context] + * @return {boolean} if Signal has the specified listener. + */ + function (listener, context) { + if (typeof context === "undefined") { context = null; } + return this._indexOfListener(listener, context) !== -1; + }; + Signal.prototype.add = /** + * Add a listener to the signal. + * @param {Function} listener Signal handler function. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) + * @return {SignalBinding} An Object representing the binding between the Signal and listener. + */ + function (listener, listenerContext, priority) { + if (typeof listenerContext === "undefined") { listenerContext = null; } + if (typeof priority === "undefined") { priority = 0; } + this.validateListener(listener, 'add'); + return this._registerListener(listener, false, listenerContext, priority); + }; + Signal.prototype.addOnce = /** + * Add listener to the signal that should be removed after first execution (will be executed only once). + * @param {Function} listener Signal handler function. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) + * @return {SignalBinding} An Object representing the binding between the Signal and listener. + */ + function (listener, listenerContext, priority) { + if (typeof listenerContext === "undefined") { listenerContext = null; } + if (typeof priority === "undefined") { priority = 0; } + this.validateListener(listener, 'addOnce'); + return this._registerListener(listener, true, listenerContext, priority); + }; + Signal.prototype.remove = /** + * Remove a single listener from the dispatch queue. + * @param {Function} listener Handler function that should be removed. + * @param {Object} [context] Execution context (since you can add the same handler multiple times if executing in a different context). + * @return {Function} Listener handler function. + */ + function (listener, context) { + if (typeof context === "undefined") { context = null; } + this.validateListener(listener, 'remove'); + var i = this._indexOfListener(listener, context); + if(i !== -1) { + this._bindings[i]._destroy()//no reason to a SignalBinding exist if it isn't attached to a signal + ; + this._bindings.splice(i, 1); + } + return listener; + }; + Signal.prototype.removeAll = /** + * Remove all listeners from the Signal. + */ + function () { + var n = this._bindings.length; + while(n--) { + this._bindings[n]._destroy(); + } + this._bindings.length = 0; + }; + Signal.prototype.getNumListeners = /** + * @return {number} Number of listeners attached to the Signal. + */ + function () { + return this._bindings.length; + }; + Signal.prototype.halt = /** + * Stop propagation of the event, blocking the dispatch to next listeners on the queue. + *

IMPORTANT: should be called only during signal dispatch, calling it before/after dispatch won't affect signal broadcast.

+ * @see Signal.prototype.disable + */ + function () { + this._shouldPropagate = false; + }; + Signal.prototype.dispatch = /** + * Dispatch/Broadcast Signal to all listeners added to the queue. + * @param {...*} [params] Parameters that should be passed to each handler. + */ + function () { + var paramsArr = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + paramsArr[_i] = arguments[_i + 0]; + } + if(!this.active) { + return; + } + var n = this._bindings.length; + var bindings; + if(this.memorize) { + this._prevParams = paramsArr; + } + if(!n) { + //should come after memorize + return; + } + bindings = this._bindings.slice(0)//clone array in case add/remove items during dispatch + ; + this._shouldPropagate = true//in case `halt` was called before dispatch or during the previous dispatch. + ; + //execute all callbacks until end of the list or until a callback returns `false` or stops propagation + //reverse loop since listeners with higher priority will be added at the end of the list + do { + n--; + }while(bindings[n] && this._shouldPropagate && bindings[n].execute(paramsArr) !== false); + }; + Signal.prototype.forget = /** + * Forget memorized arguments. + * @see Signal.memorize + */ + function () { + this._prevParams = null; + }; + Signal.prototype.dispose = /** + * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object). + *

IMPORTANT: calling any method on the signal instance after calling dispose will throw errors.

+ */ + function () { + this.removeAll(); + delete this._bindings; + delete this._prevParams; + }; + Signal.prototype.toString = /** + * @return {string} String representation of the object. + */ + function () { + return '[Signal active:' + this.active + ' numListeners:' + this.getNumListeners() + ']'; + }; + return Signal; + })(); + Phaser.Signal = Signal; })(Phaser || (Phaser = {})); var __extends = this.__extends || function (d, b) { function __() { this.constructor = d; } @@ -233,6 +476,7 @@ var __extends = this.__extends || function (d, b) { }; /// /// +/// /** * Phaser */ @@ -249,6 +493,9 @@ var Phaser; this._angle = 0; this.z = 0; this.moves = true; + // Input + this.inputEnabled = false; + this._inputOver = false; this.bounds = new Phaser.Rectangle(x, y, width, height); this.exists = true; this.active = true; @@ -289,9 +536,14 @@ var Phaser; if(this.moves) { this.updateMotion(); } + if(this.inputEnabled) { + this.updateInput(); + } this.wasTouching = this.touching; this.touching = Phaser.Collision.NONE; }; + GameObject.prototype.updateInput = function () { + }; GameObject.prototype.updateMotion = function () { var delta; var velocityDelta; @@ -311,8 +563,8 @@ var Phaser; this.bounds.y += delta; }; GameObject.prototype.overlaps = /** - * Checks to see if some GameObject overlaps this GameObject or FlxGroup. - * If the group has a LOT of things in it, it might be faster to use FlxG.overlaps(). + * Checks to see if some GameObject overlaps this GameObject or Group. + * If the group has a LOT of things in it, it might be faster to use G.overlaps(). * WARNING: Currently tilemaps do NOT support screen space overlap checks! * * @param ObjectOrGroup The object or group being tested. @@ -336,7 +588,7 @@ var Phaser; return results; } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. @@ -355,7 +607,7 @@ var Phaser; return (objectScreenPos.x + ObjectOrGroup.width > this._point.x) && (objectScreenPos.x < this._point.x + this.width) && (objectScreenPos.y + ObjectOrGroup.height > this._point.y) && (objectScreenPos.y < this._point.y + this.height); }; GameObject.prototype.overlapsAt = /** - * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or FlxGroup? + * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or Group? * This is distinct from overlapsPoint(), which just checks that ponumber, rather than taking the object's size numbero account. * WARNING: Currently tilemaps do NOT support screen space overlap checks! * @@ -383,13 +635,13 @@ var Phaser; return results; } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. //However, since this is overlapsAt(), we also have to invent the appropriate position for the tilemap. //So we calculate the offset between the player and the requested position, and subtract that from the tilemap. - var tilemap: FlxTilemap = ObjectOrGroup; + var tilemap: Tilemap = ObjectOrGroup; return tilemap.overlapsAt(tilemap.x - (X - this.x), tilemap.y - (Y - this.y), this, InScreenSpace, Camera); } */ @@ -620,6 +872,7 @@ var Phaser; Phaser.GameObject = GameObject; })(Phaser || (Phaser = {})); /// +/// /// /** * Phaser @@ -644,7 +897,7 @@ var Phaser; this._dw = 0; this._dh = 0; this._texture = null; - this.animations = new Phaser.Animations(this._game, this); + this.animations = new Phaser.AnimationManager(this._game, this); if(key !== null) { this.loadGraphic(key); } else { @@ -756,7 +1009,8 @@ var Phaser; // Rotation if(this.angle !== 0) { this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + //this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); this._game.stage.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); @@ -822,8 +1076,535 @@ var Phaser; })(Phaser.GameObject); Phaser.Sprite = Sprite; })(Phaser || (Phaser = {})); -/// +/// +/** +* Animation +* +* @desc Loads Sprite Sheets and Texture Atlas formats into a unified FrameData object +* +* @version 1.0 - 22nd March 2013 +* @author Richard Davey +*/ +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Animation = (function () { + function Animation(game, parent, frameData, name, frames, delay, looped) { + this._game = game; + this._parent = parent; + this._frames = frames; + this._frameData = frameData; + this.name = name; + this.delay = 1000 / delay; + this.looped = looped; + this.isFinished = false; + this.isPlaying = false; + } + Object.defineProperty(Animation.prototype, "frameTotal", { + get: function () { + return this._frames.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "frame", { + get: function () { + return this._frameIndex; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrame(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = value; + } + }, + enumerable: true, + configurable: true + }); + Animation.prototype.play = function (frameRate, loop) { + if (typeof frameRate === "undefined") { frameRate = null; } + if(frameRate !== null) { + this.delay = 1000 / frameRate; + } + if(loop !== undefined) { + this.looped = loop; + } + 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]); + }; + Animation.prototype.onComplete = function () { + this.isPlaying = false; + this.isFinished = true; + // callback + }; + Animation.prototype.stop = function () { + this.isPlaying = false; + this.isFinished = true; + }; + Animation.prototype.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]); + } else { + this.onComplete(); + } + } else { + this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); + } + this._timeLastFrame = this._game.time.now; + this._timeNextFrame = this._game.time.now + this.delay; + return true; + } + return false; + }; + Animation.prototype.destroy = function () { + this._game = null; + this._parent = null; + this._frames = null; + this._frameData = null; + this.currentFrame = null; + this.isPlaying = false; + }; + return Animation; + })(); + Phaser.Animation = Animation; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var AnimationLoader = (function () { + function AnimationLoader() { } + AnimationLoader.parseSpriteSheet = function parseSpriteSheet(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; + 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) { + return null; + } + // Let's create some frames then + var data = new Phaser.FrameData(); + var x = 0; + var y = 0; + for(var i = 0; i < total; i++) { + data.addFrame(new Phaser.Frame(x, y, frameWidth, frameHeight, '')); + x += frameWidth; + if(x === width) { + x = 0; + y += frameHeight; + } + } + return data; + }; + AnimationLoader.parseJSONData = function parseJSONData(game, json) { + // Let's create some frames then + var data = new Phaser.FrameData(); + // By this stage frames is a fully parsed array + var frames = json; + var newFrame; + for(var i = 0; i < frames.length; i++) { + newFrame = data.addFrame(new Phaser.Frame(frames[i].frame.x, frames[i].frame.y, frames[i].frame.w, frames[i].frame.h, frames[i].filename)); + 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); + } + return data; + }; + return AnimationLoader; + })(); + Phaser.AnimationLoader = AnimationLoader; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Frame = (function () { + function Frame(x, y, width, height, name) { + // Useful for Texture Atlas files (is set to the filename value) + this.name = ''; + // Rotated? (not yet implemented) + this.rotated = false; + // Either cw or ccw, rotation is always 90 degrees + this.rotationDirection = 'cw'; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.name = name; + this.rotated = false; + this.trimmed = false; + } + Frame.prototype.setRotation = function (rotated, rotationDirection) { + // Not yet supported + }; + Frame.prototype.setTrim = function (trimmed, actualWidth, actualHeight, destX, destY, destWidth, destHeight) { + this.trimmed = trimmed; + this.sourceSizeW = actualWidth; + this.sourceSizeH = actualHeight; + this.spriteSourceSizeX = destX; + this.spriteSourceSizeY = destY; + this.spriteSourceSizeW = destWidth; + this.spriteSourceSizeH = destHeight; + }; + return Frame; + })(); + Phaser.Frame = Frame; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var FrameData = (function () { + function FrameData() { + this._frames = []; + this._frameNames = []; + } + Object.defineProperty(FrameData.prototype, "total", { + get: function () { + return this._frames.length; + }, + enumerable: true, + configurable: true + }); + FrameData.prototype.addFrame = function (frame) { + frame.index = this._frames.length; + this._frames.push(frame); + if(frame.name !== '') { + this._frameNames[frame.name] = frame.index; + } + return frame; + }; + FrameData.prototype.getFrame = function (index) { + if(this._frames[index]) { + return this._frames[index]; + } + return null; + }; + FrameData.prototype.getFrameByName = function (name) { + if(this._frameNames[name] >= 0) { + return this._frames[this._frameNames[name]]; + } + return null; + }; + FrameData.prototype.checkFrameName = function (name) { + if(this._frameNames[name] >= 0) { + return true; + } + return false; + }; + FrameData.prototype.getFrameRange = function (start, end, output) { + if (typeof output === "undefined") { output = []; } + for(var i = start; i <= end; i++) { + output.push(this._frames[i]); + } + return output; + }; + FrameData.prototype.getFrameIndexes = function (output) { + if (typeof output === "undefined") { output = []; } + output.length = 0; + for(var i = 0; i < this._frames.length; i++) { + output.push(i); + } + return output; + }; + FrameData.prototype.getFrameIndexesByName = function (input) { + var output = []; + for(var i = 0; i < input.length; i++) { + if(this.getFrameByName(input[i])) { + output.push(this.getFrameByName(input[i]).index); + } + } + return output; + }; + FrameData.prototype.getAllFrames = function () { + return this._frames; + }; + FrameData.prototype.getFrames = function (range) { + var output = []; + for(var i = 0; i < range.length; i++) { + output.push(this._frames[i]); + } + return output; + }; + return FrameData; + })(); + Phaser.FrameData = FrameData; +})(Phaser || (Phaser = {})); +/// +/// +/// +/// +/// +/// +var Phaser; +(function (Phaser) { + var AnimationManager = (function () { + function AnimationManager(game, parent) { + this._frameData = null; + this.currentFrame = null; + this._game = game; + this._parent = parent; + this._anims = { + }; + } + AnimationManager.prototype.loadFrameData = function (frameData) { + this._frameData = frameData; + this.frame = 0; + }; + AnimationManager.prototype.add = function (name, frames, frameRate, loop, useNumericIndex) { + if (typeof frames === "undefined") { frames = null; } + if (typeof frameRate === "undefined") { frameRate = 60; } + if (typeof loop === "undefined") { loop = false; } + if (typeof useNumericIndex === "undefined") { useNumericIndex = true; } + if(this._frameData == null) { + return; + } + if(frames == null) { + frames = this._frameData.getFrameIndexes(); + } else { + if(this.validateFrames(frames, useNumericIndex) == false) { + return; + } + } + if(useNumericIndex == false) { + frames = this._frameData.getFrameIndexesByName(frames); + } + this._anims[name] = new Phaser.Animation(this._game, this._parent, this._frameData, name, frames, frameRate, loop); + this.currentAnim = this._anims[name]; + }; + AnimationManager.prototype.validateFrames = function (frames, useNumericIndex) { + for(var i = 0; i < frames.length; i++) { + if(useNumericIndex == true) { + if(frames[i] > this._frameData.total) { + return false; + } + } else { + if(this._frameData.checkFrameName(frames[i]) == false) { + return false; + } + } + } + return true; + }; + AnimationManager.prototype.play = function (name, frameRate, loop) { + if (typeof frameRate === "undefined") { frameRate = null; } + if(this._anims[name]) { + this.currentAnim = this._anims[name]; + this.currentAnim.play(frameRate, loop); + } + }; + AnimationManager.prototype.stop = function (name) { + if(this._anims[name]) { + this.currentAnim = this._anims[name]; + this.currentAnim.stop(); + } + }; + AnimationManager.prototype.update = function () { + if(this.currentAnim && this.currentAnim.update() == true) { + this.currentFrame = this.currentAnim.currentFrame; + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + } + }; + Object.defineProperty(AnimationManager.prototype, "frameData", { + get: function () { + return this._frameData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frameTotal", { + get: function () { + return this._frameData.total; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frame", { + get: function () { + return this._frameIndex; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrame(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = value; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frameName", { + get: function () { + return this.currentFrame.name; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrameByName(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = this.currentFrame.index; + } + }, + enumerable: true, + configurable: true + }); + return AnimationManager; + })(); + Phaser.AnimationManager = AnimationManager; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Cache = (function () { + function Cache(game) { + this._game = game; + this._canvases = { + }; + this._images = { + }; + this._sounds = { + }; + this._text = { + }; + } + Cache.prototype.addCanvas = function (key, canvas, context) { + this._canvases[key] = { + canvas: canvas, + context: context + }; + }; + Cache.prototype.addSpriteSheet = function (key, url, data, frameWidth, frameHeight, frameMax) { + this._images[key] = { + url: url, + data: data, + spriteSheet: true, + frameWidth: frameWidth, + frameHeight: frameHeight + }; + this._images[key].frameData = Phaser.AnimationLoader.parseSpriteSheet(this._game, key, frameWidth, frameHeight, frameMax); + }; + Cache.prototype.addTextureAtlas = function (key, url, data, jsonData) { + this._images[key] = { + url: url, + data: data, + spriteSheet: true + }; + this._images[key].frameData = Phaser.AnimationLoader.parseJSONData(this._game, jsonData); + }; + Cache.prototype.addImage = function (key, url, data) { + this._images[key] = { + url: url, + data: data, + spriteSheet: false + }; + }; + Cache.prototype.addSound = function (key, url, data) { + this._sounds[key] = { + url: url, + data: data, + decoded: false + }; + }; + Cache.prototype.decodedSound = function (key, data) { + this._sounds[key].data = data; + this._sounds[key].decoded = true; + }; + Cache.prototype.addText = function (key, url, data) { + this._text[key] = { + url: url, + data: data + }; + }; + Cache.prototype.getCanvas = function (key) { + if(this._canvases[key]) { + return this._canvases[key].canvas; + } + return null; + }; + Cache.prototype.getImage = function (key) { + if(this._images[key]) { + return this._images[key].data; + } + return null; + }; + Cache.prototype.getFrameData = function (key) { + if(this._images[key] && this._images[key].spriteSheet == true) { + return this._images[key].frameData; + } + return null; + }; + Cache.prototype.getSound = function (key) { + if(this._sounds[key]) { + return this._sounds[key].data; + } + return null; + }; + Cache.prototype.isSoundDecoded = function (key) { + if(this._sounds[key]) { + return this._sounds[key].decoded; + } + }; + Cache.prototype.isSpriteSheet = function (key) { + if(this._images[key]) { + return this._images[key].spriteSheet; + } + }; + Cache.prototype.getText = function (key) { + if(this._text[key]) { + return this._text[key].data; + } + return null; + }; + Cache.prototype.destroy = function () { + for(var item in this._canvases) { + delete this._canvases[item['key']]; + } + for(var item in this._images) { + delete this._images[item['key']]; + } + for(var item in this._sounds) { + delete this._sounds[item['key']]; + } + for(var item in this._text) { + delete this._text[item['key']]; + } + }; + return Cache; + })(); + Phaser.Cache = Cache; +})(Phaser || (Phaser = {})); /// +/// /** * Phaser */ @@ -1048,7 +1829,7 @@ var Phaser; } this.bounds.setTo(X, Y, Width, Height); //if(UpdateWorld) - // FlxG.worldBounds.copyFrom(bounds); + // G.worldBounds.copyFrom(bounds); this.update(); }; Camera.prototype.update = function () { @@ -1350,31 +2131,31 @@ var Phaser; */ var Phaser; (function (Phaser) { - var Cameras = (function () { - function Cameras(game, x, y, width, height) { + var CameraManager = (function () { + function CameraManager(game, x, y, width, height) { this._game = game; this._cameras = []; this.current = this.addCamera(x, y, width, height); } - Cameras.prototype.getAll = function () { + CameraManager.prototype.getAll = function () { return this._cameras; }; - Cameras.prototype.update = function () { + CameraManager.prototype.update = function () { this._cameras.forEach(function (camera) { return camera.update(); }); }; - Cameras.prototype.render = function () { + CameraManager.prototype.render = function () { this._cameras.forEach(function (camera) { return camera.render(); }); }; - Cameras.prototype.addCamera = function (x, y, width, height) { + CameraManager.prototype.addCamera = function (x, y, width, height) { var newCam = new Phaser.Camera(this._game, this._cameras.length, x, y, width, height); this._cameras.push(newCam); return newCam; }; - Cameras.prototype.removeCamera = function (id) { + CameraManager.prototype.removeCamera = function (id) { if(this._cameras[id]) { if(this.current === this._cameras[id]) { this.current = null; @@ -1385,13 +2166,13 @@ var Phaser; return false; } }; - Cameras.prototype.destroy = function () { + CameraManager.prototype.destroy = function () { this._cameras.length = 0; this.current = this.addCamera(0, 0, this._game.stage.width, this._game.stage.height); }; - return Cameras; + return CameraManager; })(); - Phaser.Cameras = Cameras; + Phaser.CameraManager = CameraManager; })(Phaser || (Phaser = {})); /// /** @@ -4892,8 +5673,8 @@ var Phaser; GameMath.prototype.getRandom = /** * Fetch a random entry from the given array. * Will return null if random selection is missing, or array has no entries. - * FlxG.getRandom() is deterministic and safe for use with replays/recordings. - * HOWEVER, FlxU.getRandom() is NOT deterministic and unsafe for use with replays/recordings. + * G.getRandom() is deterministic and safe for use with replays/recordings. + * HOWEVER, U.getRandom() is NOT deterministic and unsafe for use with replays/recordings. * * @param Objects An array of objects. * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. @@ -5105,7 +5886,7 @@ var Phaser; configurable: true }); Group.prototype.add = /** - * Adds a new Basic subclass (Basic, FlxBasic, Enemy, etc) to the group. + * Adds a new Basic subclass (Basic, Basic, Enemy, etc) to the group. * Group will try to replace a null member of the array first. * Failing that, Group will add it to the end of the member array, * assuming there is room for it, and doubling the size of the array if necessary. @@ -5172,7 +5953,7 @@ var Phaser; * and no object class was provided, it will return null * instead of a valid object!

* - * @param ObjectClass The class type you want to recycle (e.g. FlxBasic, EvilRobot, etc). Do NOT "new" the class in the parameter! + * @param ObjectClass The class type you want to recycle (e.g. Basic, EvilRobot, etc). Do NOT "new" the class in the parameter! * * @return A reference to the object that was created. Don't forget to cast it back to the Class you want (e.g. myObject = myGroup.recycle(myObjectClass) as myObjectClass;). */ @@ -5245,7 +6026,7 @@ var Phaser; * Call this function to sort the group according to a particular value and order. * For example, to sort game objects for Zelda-style overlaps you might call * myGroup.sort("y",Group.ASCENDING) at the bottom of your - * FlxState.update() override. To sort all existing objects after + * State.update() override. To sort all existing objects after * a big explosion or bomb attack, you might call myGroup.sort("exists",Group.DESCENDING). * * @param Index The string name of the member variable you want to sort on. Default value is "y". @@ -5468,7 +6249,7 @@ var Phaser; return this._game.math.getRandom(this.members, StartIndex, Length); }; Group.prototype.clear = /** - * Remove all instances of Basic subclass (FlxBasic, FlxBlock, etc) from the list. + * Remove all instances of Basic subclass (Basic, Block, etc) from the list. * WARNING: does not destroy() or kill() any of these objects! */ function () { @@ -6114,391 +6895,6 @@ var Phaser; })(); Phaser.Motion = Motion; })(Phaser || (Phaser = {})); -/// -/* -* SignalBinding -* -* @desc An object that represents a binding between a Signal and a listener function. -* Released under the MIT license -* http://millermedeiros.github.com/js-signals/ -* -* @version 1. - 7th March 2013 -* -* @author Richard Davey, TypeScript conversion -* @author Miller Medeiros, JS Signals -* -*/ -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var SignalBinding = (function () { - /** - * Object that represents a binding between a Signal and a listener function. - *
- This is an internal constructor and shouldn't be called by regular users. - *
- inspired by Joa Ebert AS3 SignalBinding and Robert Penner's Slot classes. - * @author Miller Medeiros - * @constructor - * @internal - * @name SignalBinding - * @param {Signal} signal Reference to Signal object that listener is currently bound to. - * @param {Function} listener Handler function bound to the signal. - * @param {boolean} isOnce If binding should be executed just once. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. (default = 0). - */ - function SignalBinding(signal, listener, isOnce, listenerContext, priority) { - if (typeof priority === "undefined") { priority = 0; } - /** - * If binding is active and should be executed. - * @type boolean - */ - this.active = true; - /** - * Default parameters passed to listener during `Signal.dispatch` and `SignalBinding.execute`. (curried parameters) - * @type Array|null - */ - this.params = null; - this._listener = listener; - this._isOnce = isOnce; - this.context = listenerContext; - this._signal = signal; - this.priority = priority || 0; - } - SignalBinding.prototype.execute = /** - * Call listener passing arbitrary parameters. - *

If binding was added using `Signal.addOnce()` it will be automatically removed from signal dispatch queue, this method is used internally for the signal dispatch.

- * @param {Array} [paramsArr] Array of parameters that should be passed to the listener - * @return {*} Value returned by the listener. - */ - function (paramsArr) { - var handlerReturn; - var params; - if(this.active && !!this._listener) { - params = this.params ? this.params.concat(paramsArr) : paramsArr; - handlerReturn = this._listener.apply(this.context, params); - if(this._isOnce) { - this.detach(); - } - } - return handlerReturn; - }; - SignalBinding.prototype.detach = /** - * Detach binding from signal. - * - alias to: mySignal.remove(myBinding.getListener()); - * @return {Function|null} Handler function bound to the signal or `null` if binding was previously detached. - */ - function () { - return this.isBound() ? this._signal.remove(this._listener, this.context) : null; - }; - SignalBinding.prototype.isBound = /** - * @return {Boolean} `true` if binding is still bound to the signal and have a listener. - */ - function () { - return (!!this._signal && !!this._listener); - }; - SignalBinding.prototype.isOnce = /** - * @return {boolean} If SignalBinding will only be executed once. - */ - function () { - return this._isOnce; - }; - SignalBinding.prototype.getListener = /** - * @return {Function} Handler function bound to the signal. - */ - function () { - return this._listener; - }; - SignalBinding.prototype.getSignal = /** - * @return {Signal} Signal that listener is currently bound to. - */ - function () { - return this._signal; - }; - SignalBinding.prototype._destroy = /** - * Delete instance properties - * @private - */ - function () { - delete this._signal; - delete this._listener; - delete this.context; - }; - SignalBinding.prototype.toString = /** - * @return {string} String representation of the object. - */ - function () { - return '[SignalBinding isOnce:' + this._isOnce + ', isBound:' + this.isBound() + ', active:' + this.active + ']'; - }; - return SignalBinding; - })(); - Phaser.SignalBinding = SignalBinding; -})(Phaser || (Phaser = {})); -/// -/* -* Signal -* -* @desc A TypeScript conversion of JS Signals by Miller Medeiros -* Released under the MIT license -* http://millermedeiros.github.com/js-signals/ -* -* @version 1. - 7th March 2013 -* -* @author Richard Davey, TypeScript conversion -* @author Miller Medeiros, JS Signals -* -*/ -/** -* Custom event broadcaster -*
- inspired by Robert Penner's AS3 Signals. -* @name Signal -* @author Miller Medeiros -* @constructor -*/ -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var Signal = (function () { - function Signal() { - /** - * - * @property _bindings - * @type Array - * @private - */ - this._bindings = []; - /** - * - * @property _prevParams - * @type Any - * @private - */ - this._prevParams = null; - /** - * If Signal should keep record of previously dispatched parameters and - * automatically execute listener during `add()`/`addOnce()` if Signal was - * already dispatched before. - * @type boolean - */ - this.memorize = false; - /** - * @type boolean - * @private - */ - this._shouldPropagate = true; - /** - * If Signal is active and should broadcast events. - *

IMPORTANT: Setting this property during a dispatch will only affect the next dispatch, if you want to stop the propagation of a signal use `halt()` instead.

- * @type boolean - */ - this.active = true; - } - Signal.VERSION = '1.0.0'; - Signal.prototype.validateListener = /** - * - * @method validateListener - * @param {Any} listener - * @param {Any} fnName - */ - function (listener, fnName) { - if(typeof listener !== 'function') { - throw new Error('listener is a required param of {fn}() and should be a Function.'.replace('{fn}', fnName)); - } - }; - Signal.prototype._registerListener = /** - * @param {Function} listener - * @param {boolean} isOnce - * @param {Object} [listenerContext] - * @param {Number} [priority] - * @return {SignalBinding} - * @private - */ - function (listener, isOnce, listenerContext, priority) { - var prevIndex = this._indexOfListener(listener, listenerContext); - var binding; - if(prevIndex !== -1) { - binding = this._bindings[prevIndex]; - if(binding.isOnce() !== isOnce) { - throw new Error('You cannot add' + (isOnce ? '' : 'Once') + '() then add' + (!isOnce ? '' : 'Once') + '() the same listener without removing the relationship first.'); - } - } else { - binding = new Phaser.SignalBinding(this, listener, isOnce, listenerContext, priority); - this._addBinding(binding); - } - if(this.memorize && this._prevParams) { - binding.execute(this._prevParams); - } - return binding; - }; - Signal.prototype._addBinding = /** - * - * @method _addBinding - * @param {SignalBinding} binding - * @private - */ - function (binding) { - //simplified insertion sort - var n = this._bindings.length; - do { - --n; - }while(this._bindings[n] && binding.priority <= this._bindings[n].priority); - this._bindings.splice(n + 1, 0, binding); - }; - Signal.prototype._indexOfListener = /** - * - * @method _indexOfListener - * @param {Function} listener - * @return {number} - * @private - */ - function (listener, context) { - var n = this._bindings.length; - var cur; - while(n--) { - cur = this._bindings[n]; - if(cur.getListener() === listener && cur.context === context) { - return n; - } - } - return -1; - }; - Signal.prototype.has = /** - * Check if listener was attached to Signal. - * @param {Function} listener - * @param {Object} [context] - * @return {boolean} if Signal has the specified listener. - */ - function (listener, context) { - if (typeof context === "undefined") { context = null; } - return this._indexOfListener(listener, context) !== -1; - }; - Signal.prototype.add = /** - * Add a listener to the signal. - * @param {Function} listener Signal handler function. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) - * @return {SignalBinding} An Object representing the binding between the Signal and listener. - */ - function (listener, listenerContext, priority) { - if (typeof listenerContext === "undefined") { listenerContext = null; } - if (typeof priority === "undefined") { priority = 0; } - this.validateListener(listener, 'add'); - return this._registerListener(listener, false, listenerContext, priority); - }; - Signal.prototype.addOnce = /** - * Add listener to the signal that should be removed after first execution (will be executed only once). - * @param {Function} listener Signal handler function. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) - * @return {SignalBinding} An Object representing the binding between the Signal and listener. - */ - function (listener, listenerContext, priority) { - if (typeof listenerContext === "undefined") { listenerContext = null; } - if (typeof priority === "undefined") { priority = 0; } - this.validateListener(listener, 'addOnce'); - return this._registerListener(listener, true, listenerContext, priority); - }; - Signal.prototype.remove = /** - * Remove a single listener from the dispatch queue. - * @param {Function} listener Handler function that should be removed. - * @param {Object} [context] Execution context (since you can add the same handler multiple times if executing in a different context). - * @return {Function} Listener handler function. - */ - function (listener, context) { - if (typeof context === "undefined") { context = null; } - this.validateListener(listener, 'remove'); - var i = this._indexOfListener(listener, context); - if(i !== -1) { - this._bindings[i]._destroy()//no reason to a SignalBinding exist if it isn't attached to a signal - ; - this._bindings.splice(i, 1); - } - return listener; - }; - Signal.prototype.removeAll = /** - * Remove all listeners from the Signal. - */ - function () { - var n = this._bindings.length; - while(n--) { - this._bindings[n]._destroy(); - } - this._bindings.length = 0; - }; - Signal.prototype.getNumListeners = /** - * @return {number} Number of listeners attached to the Signal. - */ - function () { - return this._bindings.length; - }; - Signal.prototype.halt = /** - * Stop propagation of the event, blocking the dispatch to next listeners on the queue. - *

IMPORTANT: should be called only during signal dispatch, calling it before/after dispatch won't affect signal broadcast.

- * @see Signal.prototype.disable - */ - function () { - this._shouldPropagate = false; - }; - Signal.prototype.dispatch = /** - * Dispatch/Broadcast Signal to all listeners added to the queue. - * @param {...*} [params] Parameters that should be passed to each handler. - */ - function () { - var paramsArr = []; - for (var _i = 0; _i < (arguments.length - 0); _i++) { - paramsArr[_i] = arguments[_i + 0]; - } - if(!this.active) { - return; - } - var n = this._bindings.length; - var bindings; - if(this.memorize) { - this._prevParams = paramsArr; - } - if(!n) { - //should come after memorize - return; - } - bindings = this._bindings.slice(0)//clone array in case add/remove items during dispatch - ; - this._shouldPropagate = true//in case `halt` was called before dispatch or during the previous dispatch. - ; - //execute all callbacks until end of the list or until a callback returns `false` or stops propagation - //reverse loop since listeners with higher priority will be added at the end of the list - do { - n--; - }while(bindings[n] && this._shouldPropagate && bindings[n].execute(paramsArr) !== false); - }; - Signal.prototype.forget = /** - * Forget memorized arguments. - * @see Signal.memorize - */ - function () { - this._prevParams = null; - }; - Signal.prototype.dispose = /** - * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object). - *

IMPORTANT: calling any method on the signal instance after calling dispose will throw errors.

- */ - function () { - this.removeAll(); - delete this._bindings; - delete this._prevParams; - }; - Signal.prototype.toString = /** - * @return {string} String representation of the object. - */ - function () { - return '[Signal active:' + this.active + ' numListeners:' + this.getNumListeners() + ']'; - }; - return Signal; - })(); - Phaser.Signal = Signal; -})(Phaser || (Phaser = {})); /// /** * Phaser @@ -6655,6 +7051,24 @@ var Phaser; })(); Phaser.Sound = Sound; })(Phaser || (Phaser = {})); +/** +* Phaser +* +* v0.9 - April 18th 2013 +* +* A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. +* +* Richard Davey (@photonstorm) +* Adam Saltsman (@ADAMATOMIC) (original Flixel code) +* +* "If you want your children to be intelligent, read them fairy tales." +* "If you want them to be more intelligent, read them more fairy tales." +* -- Albert Einstein +*/ +var Phaser; +(function (Phaser) { + Phaser.VERSION = 'Phaser version 0.9'; +})(Phaser || (Phaser = {})); /// /* * Based on code from Viewporter v2.0 @@ -7066,588 +7480,6 @@ var Phaser; })(); Phaser.Time = Time; })(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Back = (function () { - function Back() { } - Back.In = function In(k) { - var s = 1.70158; - return k * k * ((s + 1) * k - s); - }; - Back.Out = function Out(k) { - var s = 1.70158; - return --k * k * ((s + 1) * k + s) + 1; - }; - Back.InOut = function InOut(k) { - var s = 1.70158 * 1.525; - if((k *= 2) < 1) { - return 0.5 * (k * k * ((s + 1) * k - s)); - } - return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); - }; - return Back; - })(); - Easing.Back = Back; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Bounce = (function () { - function Bounce() { } - Bounce.In = function In(k) { - return 1 - Phaser.Easing.Bounce.Out(1 - k); - }; - Bounce.Out = function Out(k) { - if(k < (1 / 2.75)) { - return 7.5625 * k * k; - } else if(k < (2 / 2.75)) { - return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; - } else if(k < (2.5 / 2.75)) { - return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; - } else { - return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; - } - }; - Bounce.InOut = function InOut(k) { - if(k < 0.5) { - return Phaser.Easing.Bounce.In(k * 2) * 0.5; - } - return Phaser.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; - }; - return Bounce; - })(); - Easing.Bounce = Bounce; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Circular = (function () { - function Circular() { } - Circular.In = function In(k) { - return 1 - Math.sqrt(1 - k * k); - }; - Circular.Out = function Out(k) { - return Math.sqrt(1 - (--k * k)); - }; - Circular.InOut = function InOut(k) { - if((k *= 2) < 1) { - return -0.5 * (Math.sqrt(1 - k * k) - 1); - } - return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); - }; - return Circular; - })(); - Easing.Circular = Circular; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Cubic = (function () { - function Cubic() { } - Cubic.In = function In(k) { - return k * k * k; - }; - Cubic.Out = function Out(k) { - return --k * k * k + 1; - }; - Cubic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k; - } - return 0.5 * ((k -= 2) * k * k + 2); - }; - return Cubic; - })(); - Easing.Cubic = Cubic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Elastic = (function () { - function Elastic() { } - Elastic.In = function In(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); - }; - Elastic.Out = function Out(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); - }; - Elastic.InOut = function InOut(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - if((k *= 2) < 1) { - return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; - }; - return Elastic; - })(); - Easing.Elastic = Elastic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Exponential = (function () { - function Exponential() { } - Exponential.In = function In(k) { - return k === 0 ? 0 : Math.pow(1024, k - 1); - }; - Exponential.Out = function Out(k) { - return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); - }; - Exponential.InOut = function InOut(k) { - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if((k *= 2) < 1) { - return 0.5 * Math.pow(1024, k - 1); - } - return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); - }; - return Exponential; - })(); - Easing.Exponential = Exponential; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Linear = (function () { - function Linear() { } - Linear.None = function None(k) { - return k; - }; - return Linear; - })(); - Easing.Linear = Linear; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quadratic = (function () { - function Quadratic() { } - Quadratic.In = function In(k) { - return k * k; - }; - Quadratic.Out = function Out(k) { - return k * (2 - k); - }; - Quadratic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k; - } - return -0.5 * (--k * (k - 2) - 1); - }; - return Quadratic; - })(); - Easing.Quadratic = Quadratic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quartic = (function () { - function Quartic() { } - Quartic.In = function In(k) { - return k * k * k * k; - }; - Quartic.Out = function Out(k) { - return 1 - (--k * k * k * k); - }; - Quartic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k * k; - } - return -0.5 * ((k -= 2) * k * k * k - 2); - }; - return Quartic; - })(); - Easing.Quartic = Quartic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quintic = (function () { - function Quintic() { } - Quintic.In = function In(k) { - return k * k * k * k * k; - }; - Quintic.Out = function Out(k) { - return --k * k * k * k * k + 1; - }; - Quintic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k * k * k; - } - return 0.5 * ((k -= 2) * k * k * k * k + 2); - }; - return Quintic; - })(); - Easing.Quintic = Quintic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Sinusoidal = (function () { - function Sinusoidal() { } - Sinusoidal.In = function In(k) { - return 1 - Math.cos(k * Math.PI / 2); - }; - Sinusoidal.Out = function Out(k) { - return Math.sin(k * Math.PI / 2); - }; - Sinusoidal.InOut = function InOut(k) { - return 0.5 * (1 - Math.cos(Math.PI * k)); - }; - return Sinusoidal; - })(); - Easing.Sinusoidal = Sinusoidal; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/** -* Phaser - Tween -* -* @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) converted to TypeScript and integrated into Phaser -* -* @version 1.0 - 11th January 2013 -* -* @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list -*/ -var Phaser; -(function (Phaser) { - var Tween = (function () { - function Tween(object, game) { - this._object = null; - this._pausedTime = 0; - this._valuesStart = { - }; - this._valuesEnd = { - }; - this._duration = 1000; - this._delayTime = 0; - this._startTime = null; - this._chainedTweens = []; - this._object = object; - this._game = game; - this._manager = this._game.tweens; - this._interpolationFunction = this._game.math.linearInterpolation; - this._easingFunction = Phaser.Easing.Linear.None; - this.onStart = new Phaser.Signal(); - this.onUpdate = new Phaser.Signal(); - this.onComplete = new Phaser.Signal(); - } - Tween.prototype.to = function (properties, duration, ease, autoStart) { - if (typeof duration === "undefined") { duration = 1000; } - if (typeof ease === "undefined") { ease = null; } - if (typeof autoStart === "undefined") { autoStart = false; } - this._duration = duration; - // If properties isn't an object this will fail, sanity check it here somehow? - this._valuesEnd = properties; - if(ease !== null) { - this._easingFunction = ease; - } - if(autoStart === true) { - return this.start(); - } else { - return this; - } - }; - Tween.prototype.start = function () { - if(this._game === null || this._object === null) { - return; - } - this._manager.add(this); - this.onStart.dispatch(this._object); - this._startTime = this._game.time.now + this._delayTime; - for(var property in this._valuesEnd) { - // This prevents the interpolation of null values or of non-existing properties - if(this._object[property] === null || !(property in this._object)) { - throw Error('Phaser.Tween interpolation of null value of non-existing property'); - continue; - } - // check if an Array was provided as property value - if(this._valuesEnd[property] instanceof Array) { - if(this._valuesEnd[property].length === 0) { - continue; - } - // create a local copy of the Array with the start value at the front - this._valuesEnd[property] = [ - this._object[property] - ].concat(this._valuesEnd[property]); - } - this._valuesStart[property] = this._object[property]; - } - return this; - }; - Tween.prototype.stop = function () { - if(this._manager !== null) { - this._manager.remove(this); - } - return this; - }; - Object.defineProperty(Tween.prototype, "parent", { - set: function (value) { - this._game = value; - this._manager = this._game.tweens; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "delay", { - get: function () { - return this._delayTime; - }, - set: function (amount) { - this._delayTime = amount; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "easing", { - get: function () { - return this._easingFunction; - }, - set: function (easing) { - this._easingFunction = easing; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "interpolation", { - get: function () { - return this._interpolationFunction; - }, - set: function (interpolation) { - this._interpolationFunction = interpolation; - }, - enumerable: true, - configurable: true - }); - Tween.prototype.chain = function (tween) { - this._chainedTweens.push(tween); - return this; - }; - Tween.prototype.update = function (time) { - if(this._game.paused == true) { - if(this._pausedTime == 0) { - this._pausedTime = time; - } - } else { - // Ok we aren't paused, but was there some time gained? - if(this._pausedTime > 0) { - this._startTime += (time - this._pausedTime); - this._pausedTime = 0; - } - } - if(time < this._startTime) { - return true; - } - var elapsed = (time - this._startTime) / this._duration; - elapsed = elapsed > 1 ? 1 : elapsed; - var value = this._easingFunction(elapsed); - for(var property in this._valuesStart) { - // Add checks for object, array, numeric up front - if(this._valuesEnd[property] instanceof Array) { - this._object[property] = this._interpolationFunction(this._valuesEnd[property], value); - } else { - this._object[property] = this._valuesStart[property] + (this._valuesEnd[property] - this._valuesStart[property]) * value; - } - } - this.onUpdate.dispatch(this._object, value); - if(elapsed == 1) { - this.onComplete.dispatch(this._object); - for(var i = 0; i < this._chainedTweens.length; i++) { - this._chainedTweens[i].start(); - } - return false; - } - return true; - }; - return Tween; - })(); - Phaser.Tween = Tween; -})(Phaser || (Phaser = {})); /// /// /** @@ -7728,7 +7560,7 @@ var Phaser; var World = (function () { function World(game, width, height) { this._game = game; - this._cameras = new Phaser.Cameras(this._game, 0, 0, width, height); + this._cameras = new Phaser.CameraManager(this._game, 0, 0, width, height); this._game.camera = this._cameras.current; this.group = new Phaser.Group(this._game, 0); this.bounds = new Phaser.Rectangle(0, 0, width, height); @@ -8689,6 +8521,7 @@ var Phaser; Phaser.RequestAnimationFrame = RequestAnimationFrame; })(Phaser || (Phaser = {})); /// +/// /** * Phaser */ @@ -9578,7 +9411,7 @@ var Phaser; var Emitter = (function (_super) { __extends(Emitter, _super); /** - * Creates a new FlxEmitter object at a specific position. + * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * * @param X The X position of the emitter. @@ -9624,13 +9457,13 @@ var Phaser; Emitter.prototype.makeParticles = /** * This function generates a new array of particle sprites to attach to the emitter. * - * @param Graphics If you opted to not pre-configure an array of FlxSprite objects, you can simply pass in a particle image or sprite sheet. + * @param Graphics If you opted to not pre-configure an array of Sprite objects, you can simply pass in a particle image or sprite sheet. * @param Quantity The number of particles to generate when using the "create from image" option. * @param BakedRotations How many frames of baked rotation to use (boosts performance). Set to zero to not use baked rotations. * @param Multiple Whether the image in the Graphics param is a single particle or a bunch of particles (if it's a bunch, they need to be square!). * @param Collide Whether the particles should be flagged as not 'dead' (non-colliding particles are higher performance). 0 means no collisions, 0-1 controls scale of particle's bounding box. * - * @return This FlxEmitter instance (nice for chaining stuff together, if you're into that). + * @return This Emitter instance (nice for chaining stuff together, if you're into that). */ function (Graphics, Quantity, BakedRotations, Multiple, Collide) { if (typeof Quantity === "undefined") { Quantity = 50; } @@ -9832,9 +9665,9 @@ var Phaser; this.maxRotation = Max; }; Emitter.prototype.at = /** - * Change the emitter's midpoint to match the midpoint of a FlxObject. + * Change the emitter's midpoint to match the midpoint of a Object. * - * @param Object The FlxObject that you want to sync up with. + * @param Object The Object that you want to sync up with. */ function (Object) { Object.getMidpoint(this._point); @@ -9992,7 +9825,7 @@ var Phaser; this._dx -= (camera.worldView.x * this.scrollFactor.x); this._dy -= (camera.worldView.y * this.scrollFactor.y); } - // Rotation (misleading?) + // Rotation (could be misleading as it doesn't work re: collision) if(this.angle !== 0) { this._game.stage.context.save(); this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); @@ -10006,8 +9839,8 @@ var Phaser; this._dh = Math.round(this._dh); this._game.stage.saveCanvasValues(); // Debug - this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; - this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); + //this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); this._game.stage.context.lineWidth = this.lineWidth; this._game.stage.context.strokeStyle = this.lineColor; this._game.stage.context.fillStyle = this.fillColor; @@ -10229,7 +10062,7 @@ var Phaser; var Tile = (function (_super) { __extends(Tile, _super); /** - * Instantiate this new tile object. This is usually called from FlxTilemap.loadMap(). + * Instantiate this new tile object. This is usually called from Tilemap.loadMap(). * * @param Tilemap A reference to the tilemap object creating the tile. * @param Index The actual core map data index for this tile type. @@ -10560,10 +10393,10 @@ var Phaser; })(Phaser.GameObject); Phaser.Tilemap = Tilemap; })(Phaser || (Phaser = {})); -/// +/// /// /// -/// +/// /// /// /// @@ -10863,408 +10696,587 @@ var Phaser; })(); Phaser.Game = Game; })(Phaser || (Phaser = {})); -/// -/** -* Animation -* -* @desc Loads Sprite Sheets and Texture Atlas formats into a unified FrameData object -* -* @version 1.0 - 22nd March 2013 -* @author Richard Davey -*/ -/** -* Phaser -*/ var Phaser; (function (Phaser) { - var Animation = (function () { - function Animation(game, parent, frameData, name, frames, delay, looped) { - this._game = game; - this._parent = parent; - this._frames = frames; - this._frameData = frameData; - this.name = name; - this.delay = 1000 / delay; - this.looped = looped; - this.isFinished = false; - this.isPlaying = false; - } - Object.defineProperty(Animation.prototype, "frameTotal", { - get: function () { - return this._frames.length; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animation.prototype, "frame", { - get: function () { - return this._frameIndex; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrame(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = value; - } - }, - enumerable: true, - configurable: true - }); - Animation.prototype.play = function (frameRate, loop) { - if (typeof frameRate === "undefined") { frameRate = null; } - if(frameRate !== null) { - this.delay = 1000 / frameRate; - } - if(loop !== undefined) { - this.looped = loop; - } - 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]); - }; - Animation.prototype.onComplete = function () { - this.isPlaying = false; - this.isFinished = true; - // callback - }; - Animation.prototype.stop = function () { - this.isPlaying = false; - this.isFinished = true; - }; - Animation.prototype.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]); - } else { - this.onComplete(); - } - } else { - this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); - } - this._timeLastFrame = this._game.time.now; - this._timeNextFrame = this._game.time.now + this.delay; - return true; - } - return false; - }; - Animation.prototype.destroy = function () { - this._game = null; - this._parent = null; - this._frames = null; - this._frameData = null; - this.currentFrame = null; - this.isPlaying = false; - }; - return Animation; - })(); - Phaser.Animation = Animation; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var AnimationLoader = (function () { - function AnimationLoader() { } - AnimationLoader.parseSpriteSheet = function parseSpriteSheet(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; - 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) { - return null; - } - // Let's create some frames then - var data = new Phaser.FrameData(); - var x = 0; - var y = 0; - for(var i = 0; i < total; i++) { - data.addFrame(new Phaser.Frame(x, y, frameWidth, frameHeight, '')); - x += frameWidth; - if(x === width) { - x = 0; - y += frameHeight; - } - } - return data; - }; - AnimationLoader.parseJSONData = function parseJSONData(game, json) { - // Let's create some frames then - var data = new Phaser.FrameData(); - // By this stage frames is a fully parsed array - var frames = json; - var newFrame; - for(var i = 0; i < frames.length; i++) { - newFrame = data.addFrame(new Phaser.Frame(frames[i].frame.x, frames[i].frame.y, frames[i].frame.w, frames[i].frame.h, frames[i].filename)); - 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); - } - return data; - }; - return AnimationLoader; - })(); - Phaser.AnimationLoader = AnimationLoader; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var Frame = (function () { - function Frame(x, y, width, height, name) { - // Useful for Texture Atlas files (is set to the filename value) - this.name = ''; - // Rotated? (not yet implemented) - this.rotated = false; - // Either cw or ccw, rotation is always 90 degrees - this.rotationDirection = 'cw'; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.name = name; - this.rotated = false; - this.trimmed = false; - } - Frame.prototype.setRotation = function (rotated, rotationDirection) { - // Not yet supported - }; - Frame.prototype.setTrim = function (trimmed, actualWidth, actualHeight, destX, destY, destWidth, destHeight) { - this.trimmed = trimmed; - this.sourceSizeW = actualWidth; - this.sourceSizeH = actualHeight; - this.spriteSourceSizeX = destX; - this.spriteSourceSizeY = destY; - this.spriteSourceSizeW = destWidth; - this.spriteSourceSizeH = destHeight; - }; - return Frame; - })(); - Phaser.Frame = Frame; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var FrameData = (function () { - function FrameData() { - this._frames = []; - this._frameNames = []; - } - Object.defineProperty(FrameData.prototype, "total", { - get: function () { - return this._frames.length; - }, - enumerable: true, - configurable: true - }); - FrameData.prototype.addFrame = function (frame) { - frame.index = this._frames.length; - this._frames.push(frame); - if(frame.name !== '') { - this._frameNames[frame.name] = frame.index; - } - return frame; - }; - FrameData.prototype.getFrame = function (index) { - if(this._frames[index]) { - return this._frames[index]; - } - return null; - }; - FrameData.prototype.getFrameByName = function (name) { - if(this._frameNames[name] >= 0) { - return this._frames[this._frameNames[name]]; - } - return null; - }; - FrameData.prototype.checkFrameName = function (name) { - if(this._frameNames[name] >= 0) { - return true; - } - return false; - }; - FrameData.prototype.getFrameRange = function (start, end, output) { - if (typeof output === "undefined") { output = []; } - for(var i = start; i <= end; i++) { - output.push(this._frames[i]); - } - return output; - }; - FrameData.prototype.getFrameIndexes = function (output) { - if (typeof output === "undefined") { output = []; } - output.length = 0; - for(var i = 0; i < this._frames.length; i++) { - output.push(i); - } - return output; - }; - FrameData.prototype.getFrameIndexesByName = function (input) { - var output = []; - for(var i = 0; i < input.length; i++) { - if(this.getFrameByName(input[i])) { - output.push(this.getFrameByName(input[i]).index); - } - } - return output; - }; - FrameData.prototype.getAllFrames = function () { - return this._frames; - }; - FrameData.prototype.getFrames = function (range) { - var output = []; - for(var i = 0; i < range.length; i++) { - output.push(this._frames[i]); - } - return output; - }; - return FrameData; - })(); - Phaser.FrameData = FrameData; -})(Phaser || (Phaser = {})); -/// -/// -/// -/// -/// -/// -var Phaser; -(function (Phaser) { - var Animations = (function () { - function Animations(game, parent) { - this._frameData = null; - this.currentFrame = null; - this._game = game; - this._parent = parent; - this._anims = { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Back = (function () { + function Back() { } + Back.In = function In(k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); }; + Back.Out = function Out(k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }; + Back.InOut = function InOut(k) { + var s = 1.70158 * 1.525; + if((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }; + return Back; + })(); + Easing.Back = Back; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Bounce = (function () { + function Bounce() { } + Bounce.In = function In(k) { + return 1 - Phaser.Easing.Bounce.Out(1 - k); + }; + Bounce.Out = function Out(k) { + if(k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if(k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if(k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }; + Bounce.InOut = function InOut(k) { + if(k < 0.5) { + return Phaser.Easing.Bounce.In(k * 2) * 0.5; + } + return Phaser.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; + }; + return Bounce; + })(); + Easing.Bounce = Bounce; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Circular = (function () { + function Circular() { } + Circular.In = function In(k) { + return 1 - Math.sqrt(1 - k * k); + }; + Circular.Out = function Out(k) { + return Math.sqrt(1 - (--k * k)); + }; + Circular.InOut = function InOut(k) { + if((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }; + return Circular; + })(); + Easing.Circular = Circular; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Cubic = (function () { + function Cubic() { } + Cubic.In = function In(k) { + return k * k * k; + }; + Cubic.Out = function Out(k) { + return --k * k * k + 1; + }; + Cubic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }; + return Cubic; + })(); + Easing.Cubic = Cubic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Elastic = (function () { + function Elastic() { } + Elastic.In = function In(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + }; + Elastic.Out = function Out(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }; + Elastic.InOut = function InOut(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }; + return Elastic; + })(); + Easing.Elastic = Elastic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Exponential = (function () { + function Exponential() { } + Exponential.In = function In(k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }; + Exponential.Out = function Out(k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }; + Exponential.InOut = function InOut(k) { + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }; + return Exponential; + })(); + Easing.Exponential = Exponential; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Linear = (function () { + function Linear() { } + Linear.None = function None(k) { + return k; + }; + return Linear; + })(); + Easing.Linear = Linear; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quadratic = (function () { + function Quadratic() { } + Quadratic.In = function In(k) { + return k * k; + }; + Quadratic.Out = function Out(k) { + return k * (2 - k); + }; + Quadratic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }; + return Quadratic; + })(); + Easing.Quadratic = Quadratic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quartic = (function () { + function Quartic() { } + Quartic.In = function In(k) { + return k * k * k * k; + }; + Quartic.Out = function Out(k) { + return 1 - (--k * k * k * k); + }; + Quartic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }; + return Quartic; + })(); + Easing.Quartic = Quartic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quintic = (function () { + function Quintic() { } + Quintic.In = function In(k) { + return k * k * k * k * k; + }; + Quintic.Out = function Out(k) { + return --k * k * k * k * k + 1; + }; + Quintic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }; + return Quintic; + })(); + Easing.Quintic = Quintic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Sinusoidal = (function () { + function Sinusoidal() { } + Sinusoidal.In = function In(k) { + return 1 - Math.cos(k * Math.PI / 2); + }; + Sinusoidal.Out = function Out(k) { + return Math.sin(k * Math.PI / 2); + }; + Sinusoidal.InOut = function InOut(k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }; + return Sinusoidal; + })(); + Easing.Sinusoidal = Sinusoidal; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/** +* Phaser - Tween +* +* @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) converted to TypeScript and integrated into Phaser +* +* @version 1.0 - 11th January 2013 +* +* @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list +*/ +var Phaser; +(function (Phaser) { + var Tween = (function () { + function Tween(object, game) { + this._object = null; + this._pausedTime = 0; + this._valuesStart = { + }; + this._valuesEnd = { + }; + this._duration = 1000; + this._delayTime = 0; + this._startTime = null; + this._chainedTweens = []; + this._object = object; + this._game = game; + this._manager = this._game.tweens; + this._interpolationFunction = this._game.math.linearInterpolation; + this._easingFunction = Phaser.Easing.Linear.None; + this.onStart = new Phaser.Signal(); + this.onUpdate = new Phaser.Signal(); + this.onComplete = new Phaser.Signal(); } - Animations.prototype.loadFrameData = function (frameData) { - this._frameData = frameData; - this.frame = 0; + Tween.prototype.to = function (properties, duration, ease, autoStart) { + if (typeof duration === "undefined") { duration = 1000; } + if (typeof ease === "undefined") { ease = null; } + if (typeof autoStart === "undefined") { autoStart = false; } + this._duration = duration; + // If properties isn't an object this will fail, sanity check it here somehow? + this._valuesEnd = properties; + if(ease !== null) { + this._easingFunction = ease; + } + if(autoStart === true) { + return this.start(); + } else { + return this; + } }; - Animations.prototype.add = function (name, frames, frameRate, loop, useNumericIndex) { - if (typeof frames === "undefined") { frames = null; } - if (typeof frameRate === "undefined") { frameRate = 60; } - if (typeof loop === "undefined") { loop = false; } - if (typeof useNumericIndex === "undefined") { useNumericIndex = true; } - if(this._frameData == null) { + Tween.prototype.start = function () { + if(this._game === null || this._object === null) { return; } - if(frames == null) { - frames = this._frameData.getFrameIndexes(); - } else { - if(this.validateFrames(frames, useNumericIndex) == false) { - return; + this._manager.add(this); + this.onStart.dispatch(this._object); + this._startTime = this._game.time.now + this._delayTime; + for(var property in this._valuesEnd) { + // This prevents the interpolation of null values or of non-existing properties + if(this._object[property] === null || !(property in this._object)) { + throw Error('Phaser.Tween interpolation of null value of non-existing property'); + continue; } + // check if an Array was provided as property value + if(this._valuesEnd[property] instanceof Array) { + if(this._valuesEnd[property].length === 0) { + continue; + } + // create a local copy of the Array with the start value at the front + this._valuesEnd[property] = [ + this._object[property] + ].concat(this._valuesEnd[property]); + } + this._valuesStart[property] = this._object[property]; } - if(useNumericIndex == false) { - frames = this._frameData.getFrameIndexesByName(frames); - } - this._anims[name] = new Phaser.Animation(this._game, this._parent, this._frameData, name, frames, frameRate, loop); - this.currentAnim = this._anims[name]; + return this; }; - Animations.prototype.validateFrames = function (frames, useNumericIndex) { - for(var i = 0; i < frames.length; i++) { - if(useNumericIndex == true) { - if(frames[i] > this._frameData.total) { - return false; - } - } else { - if(this._frameData.checkFrameName(frames[i]) == false) { - return false; - } + Tween.prototype.stop = function () { + if(this._manager !== null) { + this._manager.remove(this); + } + return this; + }; + Object.defineProperty(Tween.prototype, "parent", { + set: function (value) { + this._game = value; + this._manager = this._game.tweens; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "delay", { + get: function () { + return this._delayTime; + }, + set: function (amount) { + this._delayTime = amount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "easing", { + get: function () { + return this._easingFunction; + }, + set: function (easing) { + this._easingFunction = easing; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "interpolation", { + get: function () { + return this._interpolationFunction; + }, + set: function (interpolation) { + this._interpolationFunction = interpolation; + }, + enumerable: true, + configurable: true + }); + Tween.prototype.chain = function (tween) { + this._chainedTweens.push(tween); + return this; + }; + Tween.prototype.update = function (time) { + if(this._game.paused == true) { + if(this._pausedTime == 0) { + this._pausedTime = time; } + } else { + // Ok we aren't paused, but was there some time gained? + if(this._pausedTime > 0) { + this._startTime += (time - this._pausedTime); + this._pausedTime = 0; + } + } + if(time < this._startTime) { + return true; + } + var elapsed = (time - this._startTime) / this._duration; + elapsed = elapsed > 1 ? 1 : elapsed; + var value = this._easingFunction(elapsed); + for(var property in this._valuesStart) { + // Add checks for object, array, numeric up front + if(this._valuesEnd[property] instanceof Array) { + this._object[property] = this._interpolationFunction(this._valuesEnd[property], value); + } else { + this._object[property] = this._valuesStart[property] + (this._valuesEnd[property] - this._valuesStart[property]) * value; + } + } + this.onUpdate.dispatch(this._object, value); + if(elapsed == 1) { + this.onComplete.dispatch(this._object); + for(var i = 0; i < this._chainedTweens.length; i++) { + this._chainedTweens[i].start(); + } + return false; } return true; }; - Animations.prototype.play = function (name, frameRate, loop) { - if (typeof frameRate === "undefined") { frameRate = null; } - if(this._anims[name]) { - this.currentAnim = this._anims[name]; - this.currentAnim.play(frameRate, loop); - } - }; - Animations.prototype.stop = function (name) { - if(this._anims[name]) { - this.currentAnim = this._anims[name]; - this.currentAnim.stop(); - } - }; - Animations.prototype.update = function () { - if(this.currentAnim && this.currentAnim.update() == true) { - this.currentFrame = this.currentAnim.currentFrame; - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - } - }; - Object.defineProperty(Animations.prototype, "frameData", { - get: function () { - return this._frameData; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frameTotal", { - get: function () { - return this._frameData.total; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frame", { - get: function () { - return this._frameIndex; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrame(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = value; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frameName", { - get: function () { - return this.currentFrame.name; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrameByName(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = this.currentFrame.index; - } - }, - enumerable: true, - configurable: true - }); - return Animations; + return Tween; })(); - Phaser.Animations = Animations; + Phaser.Tween = Tween; })(Phaser || (Phaser = {})); /// /** diff --git a/Tests/sprites/animate by framename.js b/Tests/sprites/animate by framename.js index 4097d5a9..76b529d7 100644 --- a/Tests/sprites/animate by framename.js +++ b/Tests/sprites/animate by framename.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/animate by framename.ts b/Tests/sprites/animate by framename.ts index 3f502398..f8a8f860 100644 --- a/Tests/sprites/animate by framename.ts +++ b/Tests/sprites/animate by framename.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/animation 1.js b/Tests/sprites/animation 1.js index df4be20a..525cf87f 100644 --- a/Tests/sprites/animation 1.js +++ b/Tests/sprites/animation 1.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/animation 1.ts b/Tests/sprites/animation 1.ts index b8fea3a6..96df5ed8 100644 --- a/Tests/sprites/animation 1.ts +++ b/Tests/sprites/animation 1.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/dynamic texture 1.js b/Tests/sprites/dynamic texture 1.js index 297a9140..50085dff 100644 --- a/Tests/sprites/dynamic texture 1.js +++ b/Tests/sprites/dynamic texture 1.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/dynamic texture 1.ts b/Tests/sprites/dynamic texture 1.ts index 75091a4f..25bd0479 100644 --- a/Tests/sprites/dynamic texture 1.ts +++ b/Tests/sprites/dynamic texture 1.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/dynamic texture 2.js b/Tests/sprites/dynamic texture 2.js index 06ed4b21..93c5423a 100644 --- a/Tests/sprites/dynamic texture 2.js +++ b/Tests/sprites/dynamic texture 2.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/dynamic texture 2.ts b/Tests/sprites/dynamic texture 2.ts index 50114632..01f86abe 100644 --- a/Tests/sprites/dynamic texture 2.ts +++ b/Tests/sprites/dynamic texture 2.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/mark of the bunny.js b/Tests/sprites/mark of the bunny.js index ed9ebac0..bfdd68a0 100644 --- a/Tests/sprites/mark of the bunny.js +++ b/Tests/sprites/mark of the bunny.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/mark of the bunny.ts b/Tests/sprites/mark of the bunny.ts index dd4d1e50..718c2450 100644 --- a/Tests/sprites/mark of the bunny.ts +++ b/Tests/sprites/mark of the bunny.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/rotation.js b/Tests/sprites/rotation.js index 17d4b2cf..26589aca 100644 --- a/Tests/sprites/rotation.js +++ b/Tests/sprites/rotation.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/rotation.ts b/Tests/sprites/rotation.ts index 1bff11f0..e008aad6 100644 --- a/Tests/sprites/rotation.ts +++ b/Tests/sprites/rotation.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/texture atlas 2.js b/Tests/sprites/texture atlas 2.js index e1ff0ece..fd671b4b 100644 --- a/Tests/sprites/texture atlas 2.js +++ b/Tests/sprites/texture atlas 2.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/texture atlas 2.ts b/Tests/sprites/texture atlas 2.ts index 5e97b35e..c08c38f6 100644 --- a/Tests/sprites/texture atlas 2.ts +++ b/Tests/sprites/texture atlas 2.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/texture atlas 3.js b/Tests/sprites/texture atlas 3.js index d0ea271f..a8cf1fc0 100644 --- a/Tests/sprites/texture atlas 3.js +++ b/Tests/sprites/texture atlas 3.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/texture atlas 3.ts b/Tests/sprites/texture atlas 3.ts index e154db0a..c777f451 100644 --- a/Tests/sprites/texture atlas 3.ts +++ b/Tests/sprites/texture atlas 3.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/texture atlas 4.js b/Tests/sprites/texture atlas 4.js index 719c2068..d00fa8a4 100644 --- a/Tests/sprites/texture atlas 4.js +++ b/Tests/sprites/texture atlas 4.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); function init() { diff --git a/Tests/sprites/texture atlas 4.ts b/Tests/sprites/texture atlas 4.ts index c51d32cc..a85a789d 100644 --- a/Tests/sprites/texture atlas 4.ts +++ b/Tests/sprites/texture atlas 4.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/texture atlas.js b/Tests/sprites/texture atlas.js index 332669a8..b83e2c85 100644 --- a/Tests/sprites/texture atlas.js +++ b/Tests/sprites/texture atlas.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/texture atlas.ts b/Tests/sprites/texture atlas.ts index dac92475..dae3fc3e 100644 --- a/Tests/sprites/texture atlas.ts +++ b/Tests/sprites/texture atlas.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/sprites/velocity.js b/Tests/sprites/velocity.js index 070a0fba..2abc08ca 100644 --- a/Tests/sprites/velocity.js +++ b/Tests/sprites/velocity.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/sprites/velocity.ts b/Tests/sprites/velocity.ts index 7b2a7649..02cad9cc 100644 --- a/Tests/sprites/velocity.ts +++ b/Tests/sprites/velocity.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/tilemap/basic tilemap.js b/Tests/tilemap/basic tilemap.js index 6db21320..b9fac338 100644 --- a/Tests/tilemap/basic tilemap.js +++ b/Tests/tilemap/basic tilemap.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); function init() { diff --git a/Tests/tilemap/basic tilemap.ts b/Tests/tilemap/basic tilemap.ts index 053ffc07..dd2e68bb 100644 --- a/Tests/tilemap/basic tilemap.ts +++ b/Tests/tilemap/basic tilemap.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/tweens/bounce.js b/Tests/tweens/bounce.js index c87150fd..d00babe6 100644 --- a/Tests/tweens/bounce.js +++ b/Tests/tweens/bounce.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); function init() { diff --git a/Tests/tweens/bounce.ts b/Tests/tweens/bounce.ts index 4026566a..70e09331 100644 --- a/Tests/tweens/bounce.ts +++ b/Tests/tweens/bounce.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/Tests/tweens/elastic.js b/Tests/tweens/elastic.js index 4e17b860..47bb5493 100644 --- a/Tests/tweens/elastic.js +++ b/Tests/tweens/elastic.js @@ -1,4 +1,4 @@ -/// +/// (function () { var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); function init() { diff --git a/Tests/tweens/elastic.ts b/Tests/tweens/elastic.ts index f37f0a61..5aae4cbb 100644 --- a/Tests/tweens/elastic.ts +++ b/Tests/tweens/elastic.ts @@ -1,4 +1,4 @@ -/// +/// (function () { diff --git a/build/phaser.js b/build/phaser.js index 1ddb5002..c6d155bc 100644 --- a/build/phaser.js +++ b/build/phaser.js @@ -1,21 +1,3 @@ -/** -* Phaser -* -* v0.9 - April 18th 2013 -* -* A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. -* -* Richard Davey (@photonstorm) -* Adam Saltsman (@ADAMATOMIC) (original Flixel code) -* -* "If you want your children to be intelligent, read them fairy tales." -* "If you want them to be more intelligent, read them more fairy tales." -* -- Albert Einstein -*/ -var Phaser; -(function (Phaser) { - Phaser.VERSION = 'Phaser version 0.9'; -})(Phaser || (Phaser = {})); /// /** * This is a useful "generic" object. @@ -86,7 +68,7 @@ var Phaser; }; Basic.prototype.revive = /** * Handy for bringing game objects "back to life". Just sets alive and exists back to true. - * In practice, this is most often called by FlxObject.reset(). + * In practice, this is most often called by Object.reset(). */ function () { this.alive = true; @@ -102,129 +84,390 @@ var Phaser; })(); Phaser.Basic = Basic; })(Phaser || (Phaser = {})); -/// +/// +/* +* SignalBinding +* +* @desc An object that represents a binding between a Signal and a listener function. +* Released under the MIT license +* http://millermedeiros.github.com/js-signals/ +* +* @version 1. - 7th March 2013 +* +* @author Richard Davey, TypeScript conversion +* @author Miller Medeiros, JS Signals +* +*/ /** * Phaser */ var Phaser; (function (Phaser) { - var Cache = (function () { - function Cache(game) { - this._game = game; - this._canvases = { - }; - this._images = { - }; - this._sounds = { - }; - this._text = { - }; + var SignalBinding = (function () { + /** + * Object that represents a binding between a Signal and a listener function. + *
- This is an internal constructor and shouldn't be called by regular users. + *
- inspired by Joa Ebert AS3 SignalBinding and Robert Penner's Slot classes. + * @author Miller Medeiros + * @constructor + * @internal + * @name SignalBinding + * @param {Signal} signal Reference to Signal object that listener is currently bound to. + * @param {Function} listener Handler function bound to the signal. + * @param {boolean} isOnce If binding should be executed just once. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. (default = 0). + */ + function SignalBinding(signal, listener, isOnce, listenerContext, priority) { + if (typeof priority === "undefined") { priority = 0; } + /** + * If binding is active and should be executed. + * @type boolean + */ + this.active = true; + /** + * Default parameters passed to listener during `Signal.dispatch` and `SignalBinding.execute`. (curried parameters) + * @type Array|null + */ + this.params = null; + this._listener = listener; + this._isOnce = isOnce; + this.context = listenerContext; + this._signal = signal; + this.priority = priority || 0; } - Cache.prototype.addCanvas = function (key, canvas, context) { - this._canvases[key] = { - canvas: canvas, - context: context - }; - }; - Cache.prototype.addSpriteSheet = function (key, url, data, frameWidth, frameHeight, frameMax) { - this._images[key] = { - url: url, - data: data, - spriteSheet: true, - frameWidth: frameWidth, - frameHeight: frameHeight - }; - this._images[key].frameData = Phaser.AnimationLoader.parseSpriteSheet(this._game, key, frameWidth, frameHeight, frameMax); - }; - Cache.prototype.addTextureAtlas = function (key, url, data, jsonData) { - this._images[key] = { - url: url, - data: data, - spriteSheet: true - }; - this._images[key].frameData = Phaser.AnimationLoader.parseJSONData(this._game, jsonData); - }; - Cache.prototype.addImage = function (key, url, data) { - this._images[key] = { - url: url, - data: data, - spriteSheet: false - }; - }; - Cache.prototype.addSound = function (key, url, data) { - this._sounds[key] = { - url: url, - data: data, - decoded: false - }; - }; - Cache.prototype.decodedSound = function (key, data) { - this._sounds[key].data = data; - this._sounds[key].decoded = true; - }; - Cache.prototype.addText = function (key, url, data) { - this._text[key] = { - url: url, - data: data - }; - }; - Cache.prototype.getCanvas = function (key) { - if(this._canvases[key]) { - return this._canvases[key].canvas; + SignalBinding.prototype.execute = /** + * Call listener passing arbitrary parameters. + *

If binding was added using `Signal.addOnce()` it will be automatically removed from signal dispatch queue, this method is used internally for the signal dispatch.

+ * @param {Array} [paramsArr] Array of parameters that should be passed to the listener + * @return {*} Value returned by the listener. + */ + function (paramsArr) { + var handlerReturn; + var params; + if(this.active && !!this._listener) { + params = this.params ? this.params.concat(paramsArr) : paramsArr; + handlerReturn = this._listener.apply(this.context, params); + if(this._isOnce) { + this.detach(); + } } - return null; + return handlerReturn; }; - Cache.prototype.getImage = function (key) { - if(this._images[key]) { - return this._images[key].data; - } - return null; + SignalBinding.prototype.detach = /** + * Detach binding from signal. + * - alias to: mySignal.remove(myBinding.getListener()); + * @return {Function|null} Handler function bound to the signal or `null` if binding was previously detached. + */ + function () { + return this.isBound() ? this._signal.remove(this._listener, this.context) : null; }; - Cache.prototype.getFrameData = function (key) { - if(this._images[key] && this._images[key].spriteSheet == true) { - return this._images[key].frameData; - } - return null; + SignalBinding.prototype.isBound = /** + * @return {Boolean} `true` if binding is still bound to the signal and have a listener. + */ + function () { + return (!!this._signal && !!this._listener); }; - Cache.prototype.getSound = function (key) { - if(this._sounds[key]) { - return this._sounds[key].data; - } - return null; + SignalBinding.prototype.isOnce = /** + * @return {boolean} If SignalBinding will only be executed once. + */ + function () { + return this._isOnce; }; - Cache.prototype.isSoundDecoded = function (key) { - if(this._sounds[key]) { - return this._sounds[key].decoded; - } + SignalBinding.prototype.getListener = /** + * @return {Function} Handler function bound to the signal. + */ + function () { + return this._listener; }; - Cache.prototype.isSpriteSheet = function (key) { - if(this._images[key]) { - return this._images[key].spriteSheet; - } + SignalBinding.prototype.getSignal = /** + * @return {Signal} Signal that listener is currently bound to. + */ + function () { + return this._signal; }; - Cache.prototype.getText = function (key) { - if(this._text[key]) { - return this._text[key].data; - } - return null; + SignalBinding.prototype._destroy = /** + * Delete instance properties + * @private + */ + function () { + delete this._signal; + delete this._listener; + delete this.context; }; - Cache.prototype.destroy = function () { - for(var item in this._canvases) { - delete this._canvases[item['key']]; - } - for(var item in this._images) { - delete this._images[item['key']]; - } - for(var item in this._sounds) { - delete this._sounds[item['key']]; - } - for(var item in this._text) { - delete this._text[item['key']]; - } + SignalBinding.prototype.toString = /** + * @return {string} String representation of the object. + */ + function () { + return '[SignalBinding isOnce:' + this._isOnce + ', isBound:' + this.isBound() + ', active:' + this.active + ']'; }; - return Cache; + return SignalBinding; })(); - Phaser.Cache = Cache; + Phaser.SignalBinding = SignalBinding; +})(Phaser || (Phaser = {})); +/// +/* +* Signal +* +* @desc A TypeScript conversion of JS Signals by Miller Medeiros +* Released under the MIT license +* http://millermedeiros.github.com/js-signals/ +* +* @version 1. - 7th March 2013 +* +* @author Richard Davey, TypeScript conversion +* @author Miller Medeiros, JS Signals +* +*/ +/** +* Custom event broadcaster +*
- inspired by Robert Penner's AS3 Signals. +* @name Signal +* @author Miller Medeiros +* @constructor +*/ +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Signal = (function () { + function Signal() { + /** + * + * @property _bindings + * @type Array + * @private + */ + this._bindings = []; + /** + * + * @property _prevParams + * @type Any + * @private + */ + this._prevParams = null; + /** + * If Signal should keep record of previously dispatched parameters and + * automatically execute listener during `add()`/`addOnce()` if Signal was + * already dispatched before. + * @type boolean + */ + this.memorize = false; + /** + * @type boolean + * @private + */ + this._shouldPropagate = true; + /** + * If Signal is active and should broadcast events. + *

IMPORTANT: Setting this property during a dispatch will only affect the next dispatch, if you want to stop the propagation of a signal use `halt()` instead.

+ * @type boolean + */ + this.active = true; + } + Signal.VERSION = '1.0.0'; + Signal.prototype.validateListener = /** + * + * @method validateListener + * @param {Any} listener + * @param {Any} fnName + */ + function (listener, fnName) { + if(typeof listener !== 'function') { + throw new Error('listener is a required param of {fn}() and should be a Function.'.replace('{fn}', fnName)); + } + }; + Signal.prototype._registerListener = /** + * @param {Function} listener + * @param {boolean} isOnce + * @param {Object} [listenerContext] + * @param {Number} [priority] + * @return {SignalBinding} + * @private + */ + function (listener, isOnce, listenerContext, priority) { + var prevIndex = this._indexOfListener(listener, listenerContext); + var binding; + if(prevIndex !== -1) { + binding = this._bindings[prevIndex]; + if(binding.isOnce() !== isOnce) { + throw new Error('You cannot add' + (isOnce ? '' : 'Once') + '() then add' + (!isOnce ? '' : 'Once') + '() the same listener without removing the relationship first.'); + } + } else { + binding = new Phaser.SignalBinding(this, listener, isOnce, listenerContext, priority); + this._addBinding(binding); + } + if(this.memorize && this._prevParams) { + binding.execute(this._prevParams); + } + return binding; + }; + Signal.prototype._addBinding = /** + * + * @method _addBinding + * @param {SignalBinding} binding + * @private + */ + function (binding) { + //simplified insertion sort + var n = this._bindings.length; + do { + --n; + }while(this._bindings[n] && binding.priority <= this._bindings[n].priority); + this._bindings.splice(n + 1, 0, binding); + }; + Signal.prototype._indexOfListener = /** + * + * @method _indexOfListener + * @param {Function} listener + * @return {number} + * @private + */ + function (listener, context) { + var n = this._bindings.length; + var cur; + while(n--) { + cur = this._bindings[n]; + if(cur.getListener() === listener && cur.context === context) { + return n; + } + } + return -1; + }; + Signal.prototype.has = /** + * Check if listener was attached to Signal. + * @param {Function} listener + * @param {Object} [context] + * @return {boolean} if Signal has the specified listener. + */ + function (listener, context) { + if (typeof context === "undefined") { context = null; } + return this._indexOfListener(listener, context) !== -1; + }; + Signal.prototype.add = /** + * Add a listener to the signal. + * @param {Function} listener Signal handler function. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) + * @return {SignalBinding} An Object representing the binding between the Signal and listener. + */ + function (listener, listenerContext, priority) { + if (typeof listenerContext === "undefined") { listenerContext = null; } + if (typeof priority === "undefined") { priority = 0; } + this.validateListener(listener, 'add'); + return this._registerListener(listener, false, listenerContext, priority); + }; + Signal.prototype.addOnce = /** + * Add listener to the signal that should be removed after first execution (will be executed only once). + * @param {Function} listener Signal handler function. + * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). + * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) + * @return {SignalBinding} An Object representing the binding between the Signal and listener. + */ + function (listener, listenerContext, priority) { + if (typeof listenerContext === "undefined") { listenerContext = null; } + if (typeof priority === "undefined") { priority = 0; } + this.validateListener(listener, 'addOnce'); + return this._registerListener(listener, true, listenerContext, priority); + }; + Signal.prototype.remove = /** + * Remove a single listener from the dispatch queue. + * @param {Function} listener Handler function that should be removed. + * @param {Object} [context] Execution context (since you can add the same handler multiple times if executing in a different context). + * @return {Function} Listener handler function. + */ + function (listener, context) { + if (typeof context === "undefined") { context = null; } + this.validateListener(listener, 'remove'); + var i = this._indexOfListener(listener, context); + if(i !== -1) { + this._bindings[i]._destroy()//no reason to a SignalBinding exist if it isn't attached to a signal + ; + this._bindings.splice(i, 1); + } + return listener; + }; + Signal.prototype.removeAll = /** + * Remove all listeners from the Signal. + */ + function () { + var n = this._bindings.length; + while(n--) { + this._bindings[n]._destroy(); + } + this._bindings.length = 0; + }; + Signal.prototype.getNumListeners = /** + * @return {number} Number of listeners attached to the Signal. + */ + function () { + return this._bindings.length; + }; + Signal.prototype.halt = /** + * Stop propagation of the event, blocking the dispatch to next listeners on the queue. + *

IMPORTANT: should be called only during signal dispatch, calling it before/after dispatch won't affect signal broadcast.

+ * @see Signal.prototype.disable + */ + function () { + this._shouldPropagate = false; + }; + Signal.prototype.dispatch = /** + * Dispatch/Broadcast Signal to all listeners added to the queue. + * @param {...*} [params] Parameters that should be passed to each handler. + */ + function () { + var paramsArr = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + paramsArr[_i] = arguments[_i + 0]; + } + if(!this.active) { + return; + } + var n = this._bindings.length; + var bindings; + if(this.memorize) { + this._prevParams = paramsArr; + } + if(!n) { + //should come after memorize + return; + } + bindings = this._bindings.slice(0)//clone array in case add/remove items during dispatch + ; + this._shouldPropagate = true//in case `halt` was called before dispatch or during the previous dispatch. + ; + //execute all callbacks until end of the list or until a callback returns `false` or stops propagation + //reverse loop since listeners with higher priority will be added at the end of the list + do { + n--; + }while(bindings[n] && this._shouldPropagate && bindings[n].execute(paramsArr) !== false); + }; + Signal.prototype.forget = /** + * Forget memorized arguments. + * @see Signal.memorize + */ + function () { + this._prevParams = null; + }; + Signal.prototype.dispose = /** + * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object). + *

IMPORTANT: calling any method on the signal instance after calling dispose will throw errors.

+ */ + function () { + this.removeAll(); + delete this._bindings; + delete this._prevParams; + }; + Signal.prototype.toString = /** + * @return {string} String representation of the object. + */ + function () { + return '[Signal active:' + this.active + ' numListeners:' + this.getNumListeners() + ']'; + }; + return Signal; + })(); + Phaser.Signal = Signal; })(Phaser || (Phaser = {})); var __extends = this.__extends || function (d, b) { function __() { this.constructor = d; } @@ -233,6 +476,7 @@ var __extends = this.__extends || function (d, b) { }; /// /// +/// /** * Phaser */ @@ -249,6 +493,9 @@ var Phaser; this._angle = 0; this.z = 0; this.moves = true; + // Input + this.inputEnabled = false; + this._inputOver = false; this.bounds = new Phaser.Rectangle(x, y, width, height); this.exists = true; this.active = true; @@ -289,9 +536,14 @@ var Phaser; if(this.moves) { this.updateMotion(); } + if(this.inputEnabled) { + this.updateInput(); + } this.wasTouching = this.touching; this.touching = Phaser.Collision.NONE; }; + GameObject.prototype.updateInput = function () { + }; GameObject.prototype.updateMotion = function () { var delta; var velocityDelta; @@ -311,8 +563,8 @@ var Phaser; this.bounds.y += delta; }; GameObject.prototype.overlaps = /** - * Checks to see if some GameObject overlaps this GameObject or FlxGroup. - * If the group has a LOT of things in it, it might be faster to use FlxG.overlaps(). + * Checks to see if some GameObject overlaps this GameObject or Group. + * If the group has a LOT of things in it, it might be faster to use G.overlaps(). * WARNING: Currently tilemaps do NOT support screen space overlap checks! * * @param ObjectOrGroup The object or group being tested. @@ -336,7 +588,7 @@ var Phaser; return results; } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. @@ -355,7 +607,7 @@ var Phaser; return (objectScreenPos.x + ObjectOrGroup.width > this._point.x) && (objectScreenPos.x < this._point.x + this.width) && (objectScreenPos.y + ObjectOrGroup.height > this._point.y) && (objectScreenPos.y < this._point.y + this.height); }; GameObject.prototype.overlapsAt = /** - * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or FlxGroup? + * Checks to see if this GameObject were located at the given position, would it overlap the GameObject or Group? * This is distinct from overlapsPoint(), which just checks that ponumber, rather than taking the object's size numbero account. * WARNING: Currently tilemaps do NOT support screen space overlap checks! * @@ -383,13 +635,13 @@ var Phaser; return results; } /* - if (typeof ObjectOrGroup === 'FlxTilemap') + if (typeof ObjectOrGroup === 'Tilemap') { //Since tilemap's have to be the caller, not the target, to do proper tile-based collisions, // we redirect the call to the tilemap overlap here. //However, since this is overlapsAt(), we also have to invent the appropriate position for the tilemap. //So we calculate the offset between the player and the requested position, and subtract that from the tilemap. - var tilemap: FlxTilemap = ObjectOrGroup; + var tilemap: Tilemap = ObjectOrGroup; return tilemap.overlapsAt(tilemap.x - (X - this.x), tilemap.y - (Y - this.y), this, InScreenSpace, Camera); } */ @@ -620,6 +872,7 @@ var Phaser; Phaser.GameObject = GameObject; })(Phaser || (Phaser = {})); /// +/// /// /** * Phaser @@ -644,7 +897,7 @@ var Phaser; this._dw = 0; this._dh = 0; this._texture = null; - this.animations = new Phaser.Animations(this._game, this); + this.animations = new Phaser.AnimationManager(this._game, this); if(key !== null) { this.loadGraphic(key); } else { @@ -756,7 +1009,8 @@ var Phaser; // Rotation if(this.angle !== 0) { this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + //this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); this._game.stage.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); @@ -822,8 +1076,535 @@ var Phaser; })(Phaser.GameObject); Phaser.Sprite = Sprite; })(Phaser || (Phaser = {})); -/// +/// +/** +* Animation +* +* @desc Loads Sprite Sheets and Texture Atlas formats into a unified FrameData object +* +* @version 1.0 - 22nd March 2013 +* @author Richard Davey +*/ +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Animation = (function () { + function Animation(game, parent, frameData, name, frames, delay, looped) { + this._game = game; + this._parent = parent; + this._frames = frames; + this._frameData = frameData; + this.name = name; + this.delay = 1000 / delay; + this.looped = looped; + this.isFinished = false; + this.isPlaying = false; + } + Object.defineProperty(Animation.prototype, "frameTotal", { + get: function () { + return this._frames.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "frame", { + get: function () { + return this._frameIndex; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrame(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = value; + } + }, + enumerable: true, + configurable: true + }); + Animation.prototype.play = function (frameRate, loop) { + if (typeof frameRate === "undefined") { frameRate = null; } + if(frameRate !== null) { + this.delay = 1000 / frameRate; + } + if(loop !== undefined) { + this.looped = loop; + } + 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]); + }; + Animation.prototype.onComplete = function () { + this.isPlaying = false; + this.isFinished = true; + // callback + }; + Animation.prototype.stop = function () { + this.isPlaying = false; + this.isFinished = true; + }; + Animation.prototype.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]); + } else { + this.onComplete(); + } + } else { + this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); + } + this._timeLastFrame = this._game.time.now; + this._timeNextFrame = this._game.time.now + this.delay; + return true; + } + return false; + }; + Animation.prototype.destroy = function () { + this._game = null; + this._parent = null; + this._frames = null; + this._frameData = null; + this.currentFrame = null; + this.isPlaying = false; + }; + return Animation; + })(); + Phaser.Animation = Animation; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var AnimationLoader = (function () { + function AnimationLoader() { } + AnimationLoader.parseSpriteSheet = function parseSpriteSheet(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; + 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) { + return null; + } + // Let's create some frames then + var data = new Phaser.FrameData(); + var x = 0; + var y = 0; + for(var i = 0; i < total; i++) { + data.addFrame(new Phaser.Frame(x, y, frameWidth, frameHeight, '')); + x += frameWidth; + if(x === width) { + x = 0; + y += frameHeight; + } + } + return data; + }; + AnimationLoader.parseJSONData = function parseJSONData(game, json) { + // Let's create some frames then + var data = new Phaser.FrameData(); + // By this stage frames is a fully parsed array + var frames = json; + var newFrame; + for(var i = 0; i < frames.length; i++) { + newFrame = data.addFrame(new Phaser.Frame(frames[i].frame.x, frames[i].frame.y, frames[i].frame.w, frames[i].frame.h, frames[i].filename)); + 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); + } + return data; + }; + return AnimationLoader; + })(); + Phaser.AnimationLoader = AnimationLoader; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Frame = (function () { + function Frame(x, y, width, height, name) { + // Useful for Texture Atlas files (is set to the filename value) + this.name = ''; + // Rotated? (not yet implemented) + this.rotated = false; + // Either cw or ccw, rotation is always 90 degrees + this.rotationDirection = 'cw'; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.name = name; + this.rotated = false; + this.trimmed = false; + } + Frame.prototype.setRotation = function (rotated, rotationDirection) { + // Not yet supported + }; + Frame.prototype.setTrim = function (trimmed, actualWidth, actualHeight, destX, destY, destWidth, destHeight) { + this.trimmed = trimmed; + this.sourceSizeW = actualWidth; + this.sourceSizeH = actualHeight; + this.spriteSourceSizeX = destX; + this.spriteSourceSizeY = destY; + this.spriteSourceSizeW = destWidth; + this.spriteSourceSizeH = destHeight; + }; + return Frame; + })(); + Phaser.Frame = Frame; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var FrameData = (function () { + function FrameData() { + this._frames = []; + this._frameNames = []; + } + Object.defineProperty(FrameData.prototype, "total", { + get: function () { + return this._frames.length; + }, + enumerable: true, + configurable: true + }); + FrameData.prototype.addFrame = function (frame) { + frame.index = this._frames.length; + this._frames.push(frame); + if(frame.name !== '') { + this._frameNames[frame.name] = frame.index; + } + return frame; + }; + FrameData.prototype.getFrame = function (index) { + if(this._frames[index]) { + return this._frames[index]; + } + return null; + }; + FrameData.prototype.getFrameByName = function (name) { + if(this._frameNames[name] >= 0) { + return this._frames[this._frameNames[name]]; + } + return null; + }; + FrameData.prototype.checkFrameName = function (name) { + if(this._frameNames[name] >= 0) { + return true; + } + return false; + }; + FrameData.prototype.getFrameRange = function (start, end, output) { + if (typeof output === "undefined") { output = []; } + for(var i = start; i <= end; i++) { + output.push(this._frames[i]); + } + return output; + }; + FrameData.prototype.getFrameIndexes = function (output) { + if (typeof output === "undefined") { output = []; } + output.length = 0; + for(var i = 0; i < this._frames.length; i++) { + output.push(i); + } + return output; + }; + FrameData.prototype.getFrameIndexesByName = function (input) { + var output = []; + for(var i = 0; i < input.length; i++) { + if(this.getFrameByName(input[i])) { + output.push(this.getFrameByName(input[i]).index); + } + } + return output; + }; + FrameData.prototype.getAllFrames = function () { + return this._frames; + }; + FrameData.prototype.getFrames = function (range) { + var output = []; + for(var i = 0; i < range.length; i++) { + output.push(this._frames[i]); + } + return output; + }; + return FrameData; + })(); + Phaser.FrameData = FrameData; +})(Phaser || (Phaser = {})); +/// +/// +/// +/// +/// +/// +var Phaser; +(function (Phaser) { + var AnimationManager = (function () { + function AnimationManager(game, parent) { + this._frameData = null; + this.currentFrame = null; + this._game = game; + this._parent = parent; + this._anims = { + }; + } + AnimationManager.prototype.loadFrameData = function (frameData) { + this._frameData = frameData; + this.frame = 0; + }; + AnimationManager.prototype.add = function (name, frames, frameRate, loop, useNumericIndex) { + if (typeof frames === "undefined") { frames = null; } + if (typeof frameRate === "undefined") { frameRate = 60; } + if (typeof loop === "undefined") { loop = false; } + if (typeof useNumericIndex === "undefined") { useNumericIndex = true; } + if(this._frameData == null) { + return; + } + if(frames == null) { + frames = this._frameData.getFrameIndexes(); + } else { + if(this.validateFrames(frames, useNumericIndex) == false) { + return; + } + } + if(useNumericIndex == false) { + frames = this._frameData.getFrameIndexesByName(frames); + } + this._anims[name] = new Phaser.Animation(this._game, this._parent, this._frameData, name, frames, frameRate, loop); + this.currentAnim = this._anims[name]; + }; + AnimationManager.prototype.validateFrames = function (frames, useNumericIndex) { + for(var i = 0; i < frames.length; i++) { + if(useNumericIndex == true) { + if(frames[i] > this._frameData.total) { + return false; + } + } else { + if(this._frameData.checkFrameName(frames[i]) == false) { + return false; + } + } + } + return true; + }; + AnimationManager.prototype.play = function (name, frameRate, loop) { + if (typeof frameRate === "undefined") { frameRate = null; } + if(this._anims[name]) { + this.currentAnim = this._anims[name]; + this.currentAnim.play(frameRate, loop); + } + }; + AnimationManager.prototype.stop = function (name) { + if(this._anims[name]) { + this.currentAnim = this._anims[name]; + this.currentAnim.stop(); + } + }; + AnimationManager.prototype.update = function () { + if(this.currentAnim && this.currentAnim.update() == true) { + this.currentFrame = this.currentAnim.currentFrame; + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + } + }; + Object.defineProperty(AnimationManager.prototype, "frameData", { + get: function () { + return this._frameData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frameTotal", { + get: function () { + return this._frameData.total; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frame", { + get: function () { + return this._frameIndex; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrame(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = value; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationManager.prototype, "frameName", { + get: function () { + return this.currentFrame.name; + }, + set: function (value) { + this.currentFrame = this._frameData.getFrameByName(value); + if(this.currentFrame !== null) { + this._parent.bounds.width = this.currentFrame.width; + this._parent.bounds.height = this.currentFrame.height; + this._frameIndex = this.currentFrame.index; + } + }, + enumerable: true, + configurable: true + }); + return AnimationManager; + })(); + Phaser.AnimationManager = AnimationManager; +})(Phaser || (Phaser = {})); +/// +/** +* Phaser +*/ +var Phaser; +(function (Phaser) { + var Cache = (function () { + function Cache(game) { + this._game = game; + this._canvases = { + }; + this._images = { + }; + this._sounds = { + }; + this._text = { + }; + } + Cache.prototype.addCanvas = function (key, canvas, context) { + this._canvases[key] = { + canvas: canvas, + context: context + }; + }; + Cache.prototype.addSpriteSheet = function (key, url, data, frameWidth, frameHeight, frameMax) { + this._images[key] = { + url: url, + data: data, + spriteSheet: true, + frameWidth: frameWidth, + frameHeight: frameHeight + }; + this._images[key].frameData = Phaser.AnimationLoader.parseSpriteSheet(this._game, key, frameWidth, frameHeight, frameMax); + }; + Cache.prototype.addTextureAtlas = function (key, url, data, jsonData) { + this._images[key] = { + url: url, + data: data, + spriteSheet: true + }; + this._images[key].frameData = Phaser.AnimationLoader.parseJSONData(this._game, jsonData); + }; + Cache.prototype.addImage = function (key, url, data) { + this._images[key] = { + url: url, + data: data, + spriteSheet: false + }; + }; + Cache.prototype.addSound = function (key, url, data) { + this._sounds[key] = { + url: url, + data: data, + decoded: false + }; + }; + Cache.prototype.decodedSound = function (key, data) { + this._sounds[key].data = data; + this._sounds[key].decoded = true; + }; + Cache.prototype.addText = function (key, url, data) { + this._text[key] = { + url: url, + data: data + }; + }; + Cache.prototype.getCanvas = function (key) { + if(this._canvases[key]) { + return this._canvases[key].canvas; + } + return null; + }; + Cache.prototype.getImage = function (key) { + if(this._images[key]) { + return this._images[key].data; + } + return null; + }; + Cache.prototype.getFrameData = function (key) { + if(this._images[key] && this._images[key].spriteSheet == true) { + return this._images[key].frameData; + } + return null; + }; + Cache.prototype.getSound = function (key) { + if(this._sounds[key]) { + return this._sounds[key].data; + } + return null; + }; + Cache.prototype.isSoundDecoded = function (key) { + if(this._sounds[key]) { + return this._sounds[key].decoded; + } + }; + Cache.prototype.isSpriteSheet = function (key) { + if(this._images[key]) { + return this._images[key].spriteSheet; + } + }; + Cache.prototype.getText = function (key) { + if(this._text[key]) { + return this._text[key].data; + } + return null; + }; + Cache.prototype.destroy = function () { + for(var item in this._canvases) { + delete this._canvases[item['key']]; + } + for(var item in this._images) { + delete this._images[item['key']]; + } + for(var item in this._sounds) { + delete this._sounds[item['key']]; + } + for(var item in this._text) { + delete this._text[item['key']]; + } + }; + return Cache; + })(); + Phaser.Cache = Cache; +})(Phaser || (Phaser = {})); /// +/// /** * Phaser */ @@ -1048,7 +1829,7 @@ var Phaser; } this.bounds.setTo(X, Y, Width, Height); //if(UpdateWorld) - // FlxG.worldBounds.copyFrom(bounds); + // G.worldBounds.copyFrom(bounds); this.update(); }; Camera.prototype.update = function () { @@ -1350,31 +2131,31 @@ var Phaser; */ var Phaser; (function (Phaser) { - var Cameras = (function () { - function Cameras(game, x, y, width, height) { + var CameraManager = (function () { + function CameraManager(game, x, y, width, height) { this._game = game; this._cameras = []; this.current = this.addCamera(x, y, width, height); } - Cameras.prototype.getAll = function () { + CameraManager.prototype.getAll = function () { return this._cameras; }; - Cameras.prototype.update = function () { + CameraManager.prototype.update = function () { this._cameras.forEach(function (camera) { return camera.update(); }); }; - Cameras.prototype.render = function () { + CameraManager.prototype.render = function () { this._cameras.forEach(function (camera) { return camera.render(); }); }; - Cameras.prototype.addCamera = function (x, y, width, height) { + CameraManager.prototype.addCamera = function (x, y, width, height) { var newCam = new Phaser.Camera(this._game, this._cameras.length, x, y, width, height); this._cameras.push(newCam); return newCam; }; - Cameras.prototype.removeCamera = function (id) { + CameraManager.prototype.removeCamera = function (id) { if(this._cameras[id]) { if(this.current === this._cameras[id]) { this.current = null; @@ -1385,13 +2166,13 @@ var Phaser; return false; } }; - Cameras.prototype.destroy = function () { + CameraManager.prototype.destroy = function () { this._cameras.length = 0; this.current = this.addCamera(0, 0, this._game.stage.width, this._game.stage.height); }; - return Cameras; + return CameraManager; })(); - Phaser.Cameras = Cameras; + Phaser.CameraManager = CameraManager; })(Phaser || (Phaser = {})); /// /** @@ -4892,8 +5673,8 @@ var Phaser; GameMath.prototype.getRandom = /** * Fetch a random entry from the given array. * Will return null if random selection is missing, or array has no entries. - * FlxG.getRandom() is deterministic and safe for use with replays/recordings. - * HOWEVER, FlxU.getRandom() is NOT deterministic and unsafe for use with replays/recordings. + * G.getRandom() is deterministic and safe for use with replays/recordings. + * HOWEVER, U.getRandom() is NOT deterministic and unsafe for use with replays/recordings. * * @param Objects An array of objects. * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. @@ -5105,7 +5886,7 @@ var Phaser; configurable: true }); Group.prototype.add = /** - * Adds a new Basic subclass (Basic, FlxBasic, Enemy, etc) to the group. + * Adds a new Basic subclass (Basic, Basic, Enemy, etc) to the group. * Group will try to replace a null member of the array first. * Failing that, Group will add it to the end of the member array, * assuming there is room for it, and doubling the size of the array if necessary. @@ -5172,7 +5953,7 @@ var Phaser; * and no object class was provided, it will return null * instead of a valid object!

* - * @param ObjectClass The class type you want to recycle (e.g. FlxBasic, EvilRobot, etc). Do NOT "new" the class in the parameter! + * @param ObjectClass The class type you want to recycle (e.g. Basic, EvilRobot, etc). Do NOT "new" the class in the parameter! * * @return A reference to the object that was created. Don't forget to cast it back to the Class you want (e.g. myObject = myGroup.recycle(myObjectClass) as myObjectClass;). */ @@ -5245,7 +6026,7 @@ var Phaser; * Call this function to sort the group according to a particular value and order. * For example, to sort game objects for Zelda-style overlaps you might call * myGroup.sort("y",Group.ASCENDING) at the bottom of your - * FlxState.update() override. To sort all existing objects after + * State.update() override. To sort all existing objects after * a big explosion or bomb attack, you might call myGroup.sort("exists",Group.DESCENDING). * * @param Index The string name of the member variable you want to sort on. Default value is "y". @@ -5468,7 +6249,7 @@ var Phaser; return this._game.math.getRandom(this.members, StartIndex, Length); }; Group.prototype.clear = /** - * Remove all instances of Basic subclass (FlxBasic, FlxBlock, etc) from the list. + * Remove all instances of Basic subclass (Basic, Block, etc) from the list. * WARNING: does not destroy() or kill() any of these objects! */ function () { @@ -6114,391 +6895,6 @@ var Phaser; })(); Phaser.Motion = Motion; })(Phaser || (Phaser = {})); -/// -/* -* SignalBinding -* -* @desc An object that represents a binding between a Signal and a listener function. -* Released under the MIT license -* http://millermedeiros.github.com/js-signals/ -* -* @version 1. - 7th March 2013 -* -* @author Richard Davey, TypeScript conversion -* @author Miller Medeiros, JS Signals -* -*/ -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var SignalBinding = (function () { - /** - * Object that represents a binding between a Signal and a listener function. - *
- This is an internal constructor and shouldn't be called by regular users. - *
- inspired by Joa Ebert AS3 SignalBinding and Robert Penner's Slot classes. - * @author Miller Medeiros - * @constructor - * @internal - * @name SignalBinding - * @param {Signal} signal Reference to Signal object that listener is currently bound to. - * @param {Function} listener Handler function bound to the signal. - * @param {boolean} isOnce If binding should be executed just once. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. (default = 0). - */ - function SignalBinding(signal, listener, isOnce, listenerContext, priority) { - if (typeof priority === "undefined") { priority = 0; } - /** - * If binding is active and should be executed. - * @type boolean - */ - this.active = true; - /** - * Default parameters passed to listener during `Signal.dispatch` and `SignalBinding.execute`. (curried parameters) - * @type Array|null - */ - this.params = null; - this._listener = listener; - this._isOnce = isOnce; - this.context = listenerContext; - this._signal = signal; - this.priority = priority || 0; - } - SignalBinding.prototype.execute = /** - * Call listener passing arbitrary parameters. - *

If binding was added using `Signal.addOnce()` it will be automatically removed from signal dispatch queue, this method is used internally for the signal dispatch.

- * @param {Array} [paramsArr] Array of parameters that should be passed to the listener - * @return {*} Value returned by the listener. - */ - function (paramsArr) { - var handlerReturn; - var params; - if(this.active && !!this._listener) { - params = this.params ? this.params.concat(paramsArr) : paramsArr; - handlerReturn = this._listener.apply(this.context, params); - if(this._isOnce) { - this.detach(); - } - } - return handlerReturn; - }; - SignalBinding.prototype.detach = /** - * Detach binding from signal. - * - alias to: mySignal.remove(myBinding.getListener()); - * @return {Function|null} Handler function bound to the signal or `null` if binding was previously detached. - */ - function () { - return this.isBound() ? this._signal.remove(this._listener, this.context) : null; - }; - SignalBinding.prototype.isBound = /** - * @return {Boolean} `true` if binding is still bound to the signal and have a listener. - */ - function () { - return (!!this._signal && !!this._listener); - }; - SignalBinding.prototype.isOnce = /** - * @return {boolean} If SignalBinding will only be executed once. - */ - function () { - return this._isOnce; - }; - SignalBinding.prototype.getListener = /** - * @return {Function} Handler function bound to the signal. - */ - function () { - return this._listener; - }; - SignalBinding.prototype.getSignal = /** - * @return {Signal} Signal that listener is currently bound to. - */ - function () { - return this._signal; - }; - SignalBinding.prototype._destroy = /** - * Delete instance properties - * @private - */ - function () { - delete this._signal; - delete this._listener; - delete this.context; - }; - SignalBinding.prototype.toString = /** - * @return {string} String representation of the object. - */ - function () { - return '[SignalBinding isOnce:' + this._isOnce + ', isBound:' + this.isBound() + ', active:' + this.active + ']'; - }; - return SignalBinding; - })(); - Phaser.SignalBinding = SignalBinding; -})(Phaser || (Phaser = {})); -/// -/* -* Signal -* -* @desc A TypeScript conversion of JS Signals by Miller Medeiros -* Released under the MIT license -* http://millermedeiros.github.com/js-signals/ -* -* @version 1. - 7th March 2013 -* -* @author Richard Davey, TypeScript conversion -* @author Miller Medeiros, JS Signals -* -*/ -/** -* Custom event broadcaster -*
- inspired by Robert Penner's AS3 Signals. -* @name Signal -* @author Miller Medeiros -* @constructor -*/ -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var Signal = (function () { - function Signal() { - /** - * - * @property _bindings - * @type Array - * @private - */ - this._bindings = []; - /** - * - * @property _prevParams - * @type Any - * @private - */ - this._prevParams = null; - /** - * If Signal should keep record of previously dispatched parameters and - * automatically execute listener during `add()`/`addOnce()` if Signal was - * already dispatched before. - * @type boolean - */ - this.memorize = false; - /** - * @type boolean - * @private - */ - this._shouldPropagate = true; - /** - * If Signal is active and should broadcast events. - *

IMPORTANT: Setting this property during a dispatch will only affect the next dispatch, if you want to stop the propagation of a signal use `halt()` instead.

- * @type boolean - */ - this.active = true; - } - Signal.VERSION = '1.0.0'; - Signal.prototype.validateListener = /** - * - * @method validateListener - * @param {Any} listener - * @param {Any} fnName - */ - function (listener, fnName) { - if(typeof listener !== 'function') { - throw new Error('listener is a required param of {fn}() and should be a Function.'.replace('{fn}', fnName)); - } - }; - Signal.prototype._registerListener = /** - * @param {Function} listener - * @param {boolean} isOnce - * @param {Object} [listenerContext] - * @param {Number} [priority] - * @return {SignalBinding} - * @private - */ - function (listener, isOnce, listenerContext, priority) { - var prevIndex = this._indexOfListener(listener, listenerContext); - var binding; - if(prevIndex !== -1) { - binding = this._bindings[prevIndex]; - if(binding.isOnce() !== isOnce) { - throw new Error('You cannot add' + (isOnce ? '' : 'Once') + '() then add' + (!isOnce ? '' : 'Once') + '() the same listener without removing the relationship first.'); - } - } else { - binding = new Phaser.SignalBinding(this, listener, isOnce, listenerContext, priority); - this._addBinding(binding); - } - if(this.memorize && this._prevParams) { - binding.execute(this._prevParams); - } - return binding; - }; - Signal.prototype._addBinding = /** - * - * @method _addBinding - * @param {SignalBinding} binding - * @private - */ - function (binding) { - //simplified insertion sort - var n = this._bindings.length; - do { - --n; - }while(this._bindings[n] && binding.priority <= this._bindings[n].priority); - this._bindings.splice(n + 1, 0, binding); - }; - Signal.prototype._indexOfListener = /** - * - * @method _indexOfListener - * @param {Function} listener - * @return {number} - * @private - */ - function (listener, context) { - var n = this._bindings.length; - var cur; - while(n--) { - cur = this._bindings[n]; - if(cur.getListener() === listener && cur.context === context) { - return n; - } - } - return -1; - }; - Signal.prototype.has = /** - * Check if listener was attached to Signal. - * @param {Function} listener - * @param {Object} [context] - * @return {boolean} if Signal has the specified listener. - */ - function (listener, context) { - if (typeof context === "undefined") { context = null; } - return this._indexOfListener(listener, context) !== -1; - }; - Signal.prototype.add = /** - * Add a listener to the signal. - * @param {Function} listener Signal handler function. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) - * @return {SignalBinding} An Object representing the binding between the Signal and listener. - */ - function (listener, listenerContext, priority) { - if (typeof listenerContext === "undefined") { listenerContext = null; } - if (typeof priority === "undefined") { priority = 0; } - this.validateListener(listener, 'add'); - return this._registerListener(listener, false, listenerContext, priority); - }; - Signal.prototype.addOnce = /** - * Add listener to the signal that should be removed after first execution (will be executed only once). - * @param {Function} listener Signal handler function. - * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function). - * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) - * @return {SignalBinding} An Object representing the binding between the Signal and listener. - */ - function (listener, listenerContext, priority) { - if (typeof listenerContext === "undefined") { listenerContext = null; } - if (typeof priority === "undefined") { priority = 0; } - this.validateListener(listener, 'addOnce'); - return this._registerListener(listener, true, listenerContext, priority); - }; - Signal.prototype.remove = /** - * Remove a single listener from the dispatch queue. - * @param {Function} listener Handler function that should be removed. - * @param {Object} [context] Execution context (since you can add the same handler multiple times if executing in a different context). - * @return {Function} Listener handler function. - */ - function (listener, context) { - if (typeof context === "undefined") { context = null; } - this.validateListener(listener, 'remove'); - var i = this._indexOfListener(listener, context); - if(i !== -1) { - this._bindings[i]._destroy()//no reason to a SignalBinding exist if it isn't attached to a signal - ; - this._bindings.splice(i, 1); - } - return listener; - }; - Signal.prototype.removeAll = /** - * Remove all listeners from the Signal. - */ - function () { - var n = this._bindings.length; - while(n--) { - this._bindings[n]._destroy(); - } - this._bindings.length = 0; - }; - Signal.prototype.getNumListeners = /** - * @return {number} Number of listeners attached to the Signal. - */ - function () { - return this._bindings.length; - }; - Signal.prototype.halt = /** - * Stop propagation of the event, blocking the dispatch to next listeners on the queue. - *

IMPORTANT: should be called only during signal dispatch, calling it before/after dispatch won't affect signal broadcast.

- * @see Signal.prototype.disable - */ - function () { - this._shouldPropagate = false; - }; - Signal.prototype.dispatch = /** - * Dispatch/Broadcast Signal to all listeners added to the queue. - * @param {...*} [params] Parameters that should be passed to each handler. - */ - function () { - var paramsArr = []; - for (var _i = 0; _i < (arguments.length - 0); _i++) { - paramsArr[_i] = arguments[_i + 0]; - } - if(!this.active) { - return; - } - var n = this._bindings.length; - var bindings; - if(this.memorize) { - this._prevParams = paramsArr; - } - if(!n) { - //should come after memorize - return; - } - bindings = this._bindings.slice(0)//clone array in case add/remove items during dispatch - ; - this._shouldPropagate = true//in case `halt` was called before dispatch or during the previous dispatch. - ; - //execute all callbacks until end of the list or until a callback returns `false` or stops propagation - //reverse loop since listeners with higher priority will be added at the end of the list - do { - n--; - }while(bindings[n] && this._shouldPropagate && bindings[n].execute(paramsArr) !== false); - }; - Signal.prototype.forget = /** - * Forget memorized arguments. - * @see Signal.memorize - */ - function () { - this._prevParams = null; - }; - Signal.prototype.dispose = /** - * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object). - *

IMPORTANT: calling any method on the signal instance after calling dispose will throw errors.

- */ - function () { - this.removeAll(); - delete this._bindings; - delete this._prevParams; - }; - Signal.prototype.toString = /** - * @return {string} String representation of the object. - */ - function () { - return '[Signal active:' + this.active + ' numListeners:' + this.getNumListeners() + ']'; - }; - return Signal; - })(); - Phaser.Signal = Signal; -})(Phaser || (Phaser = {})); /// /** * Phaser @@ -6655,6 +7051,24 @@ var Phaser; })(); Phaser.Sound = Sound; })(Phaser || (Phaser = {})); +/** +* Phaser +* +* v0.9 - April 18th 2013 +* +* A small and feature-packed 2D canvas game framework born from the firey pits of Flixel and Kiwi. +* +* Richard Davey (@photonstorm) +* Adam Saltsman (@ADAMATOMIC) (original Flixel code) +* +* "If you want your children to be intelligent, read them fairy tales." +* "If you want them to be more intelligent, read them more fairy tales." +* -- Albert Einstein +*/ +var Phaser; +(function (Phaser) { + Phaser.VERSION = 'Phaser version 0.9'; +})(Phaser || (Phaser = {})); /// /* * Based on code from Viewporter v2.0 @@ -7066,588 +7480,6 @@ var Phaser; })(); Phaser.Time = Time; })(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Back = (function () { - function Back() { } - Back.In = function In(k) { - var s = 1.70158; - return k * k * ((s + 1) * k - s); - }; - Back.Out = function Out(k) { - var s = 1.70158; - return --k * k * ((s + 1) * k + s) + 1; - }; - Back.InOut = function InOut(k) { - var s = 1.70158 * 1.525; - if((k *= 2) < 1) { - return 0.5 * (k * k * ((s + 1) * k - s)); - } - return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); - }; - return Back; - })(); - Easing.Back = Back; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Bounce = (function () { - function Bounce() { } - Bounce.In = function In(k) { - return 1 - Phaser.Easing.Bounce.Out(1 - k); - }; - Bounce.Out = function Out(k) { - if(k < (1 / 2.75)) { - return 7.5625 * k * k; - } else if(k < (2 / 2.75)) { - return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; - } else if(k < (2.5 / 2.75)) { - return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; - } else { - return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; - } - }; - Bounce.InOut = function InOut(k) { - if(k < 0.5) { - return Phaser.Easing.Bounce.In(k * 2) * 0.5; - } - return Phaser.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; - }; - return Bounce; - })(); - Easing.Bounce = Bounce; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Circular = (function () { - function Circular() { } - Circular.In = function In(k) { - return 1 - Math.sqrt(1 - k * k); - }; - Circular.Out = function Out(k) { - return Math.sqrt(1 - (--k * k)); - }; - Circular.InOut = function InOut(k) { - if((k *= 2) < 1) { - return -0.5 * (Math.sqrt(1 - k * k) - 1); - } - return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); - }; - return Circular; - })(); - Easing.Circular = Circular; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Cubic = (function () { - function Cubic() { } - Cubic.In = function In(k) { - return k * k * k; - }; - Cubic.Out = function Out(k) { - return --k * k * k + 1; - }; - Cubic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k; - } - return 0.5 * ((k -= 2) * k * k + 2); - }; - return Cubic; - })(); - Easing.Cubic = Cubic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Elastic = (function () { - function Elastic() { } - Elastic.In = function In(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); - }; - Elastic.Out = function Out(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); - }; - Elastic.InOut = function InOut(k) { - var s, a = 0.1, p = 0.4; - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if(!a || a < 1) { - a = 1; - s = p / 4; - } else { - s = p * Math.asin(1 / a) / (2 * Math.PI); - } - if((k *= 2) < 1) { - return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); - } - return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; - }; - return Elastic; - })(); - Easing.Elastic = Elastic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Exponential = (function () { - function Exponential() { } - Exponential.In = function In(k) { - return k === 0 ? 0 : Math.pow(1024, k - 1); - }; - Exponential.Out = function Out(k) { - return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); - }; - Exponential.InOut = function InOut(k) { - if(k === 0) { - return 0; - } - if(k === 1) { - return 1; - } - if((k *= 2) < 1) { - return 0.5 * Math.pow(1024, k - 1); - } - return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); - }; - return Exponential; - })(); - Easing.Exponential = Exponential; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Linear = (function () { - function Linear() { } - Linear.None = function None(k) { - return k; - }; - return Linear; - })(); - Easing.Linear = Linear; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quadratic = (function () { - function Quadratic() { } - Quadratic.In = function In(k) { - return k * k; - }; - Quadratic.Out = function Out(k) { - return k * (2 - k); - }; - Quadratic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k; - } - return -0.5 * (--k * (k - 2) - 1); - }; - return Quadratic; - })(); - Easing.Quadratic = Quadratic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quartic = (function () { - function Quartic() { } - Quartic.In = function In(k) { - return k * k * k * k; - }; - Quartic.Out = function Out(k) { - return 1 - (--k * k * k * k); - }; - Quartic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k * k; - } - return -0.5 * ((k -= 2) * k * k * k - 2); - }; - return Quartic; - })(); - Easing.Quartic = Quartic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Quintic = (function () { - function Quintic() { } - Quintic.In = function In(k) { - return k * k * k * k * k; - }; - Quintic.Out = function Out(k) { - return --k * k * k * k * k + 1; - }; - Quintic.InOut = function InOut(k) { - if((k *= 2) < 1) { - return 0.5 * k * k * k * k * k; - } - return 0.5 * ((k -= 2) * k * k * k * k + 2); - }; - return Quintic; - })(); - Easing.Quintic = Quintic; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -var Phaser; -(function (Phaser) { - /// - /** - * Phaser - Easing - * - * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) - * - * @version 1.0 - 11th January 2013 - * - * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list - */ - (function (Easing) { - var Sinusoidal = (function () { - function Sinusoidal() { } - Sinusoidal.In = function In(k) { - return 1 - Math.cos(k * Math.PI / 2); - }; - Sinusoidal.Out = function Out(k) { - return Math.sin(k * Math.PI / 2); - }; - Sinusoidal.InOut = function InOut(k) { - return 0.5 * (1 - Math.cos(Math.PI * k)); - }; - return Sinusoidal; - })(); - Easing.Sinusoidal = Sinusoidal; - })(Phaser.Easing || (Phaser.Easing = {})); - var Easing = Phaser.Easing; -})(Phaser || (Phaser = {})); -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/** -* Phaser - Tween -* -* @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) converted to TypeScript and integrated into Phaser -* -* @version 1.0 - 11th January 2013 -* -* @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list -*/ -var Phaser; -(function (Phaser) { - var Tween = (function () { - function Tween(object, game) { - this._object = null; - this._pausedTime = 0; - this._valuesStart = { - }; - this._valuesEnd = { - }; - this._duration = 1000; - this._delayTime = 0; - this._startTime = null; - this._chainedTweens = []; - this._object = object; - this._game = game; - this._manager = this._game.tweens; - this._interpolationFunction = this._game.math.linearInterpolation; - this._easingFunction = Phaser.Easing.Linear.None; - this.onStart = new Phaser.Signal(); - this.onUpdate = new Phaser.Signal(); - this.onComplete = new Phaser.Signal(); - } - Tween.prototype.to = function (properties, duration, ease, autoStart) { - if (typeof duration === "undefined") { duration = 1000; } - if (typeof ease === "undefined") { ease = null; } - if (typeof autoStart === "undefined") { autoStart = false; } - this._duration = duration; - // If properties isn't an object this will fail, sanity check it here somehow? - this._valuesEnd = properties; - if(ease !== null) { - this._easingFunction = ease; - } - if(autoStart === true) { - return this.start(); - } else { - return this; - } - }; - Tween.prototype.start = function () { - if(this._game === null || this._object === null) { - return; - } - this._manager.add(this); - this.onStart.dispatch(this._object); - this._startTime = this._game.time.now + this._delayTime; - for(var property in this._valuesEnd) { - // This prevents the interpolation of null values or of non-existing properties - if(this._object[property] === null || !(property in this._object)) { - throw Error('Phaser.Tween interpolation of null value of non-existing property'); - continue; - } - // check if an Array was provided as property value - if(this._valuesEnd[property] instanceof Array) { - if(this._valuesEnd[property].length === 0) { - continue; - } - // create a local copy of the Array with the start value at the front - this._valuesEnd[property] = [ - this._object[property] - ].concat(this._valuesEnd[property]); - } - this._valuesStart[property] = this._object[property]; - } - return this; - }; - Tween.prototype.stop = function () { - if(this._manager !== null) { - this._manager.remove(this); - } - return this; - }; - Object.defineProperty(Tween.prototype, "parent", { - set: function (value) { - this._game = value; - this._manager = this._game.tweens; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "delay", { - get: function () { - return this._delayTime; - }, - set: function (amount) { - this._delayTime = amount; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "easing", { - get: function () { - return this._easingFunction; - }, - set: function (easing) { - this._easingFunction = easing; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Tween.prototype, "interpolation", { - get: function () { - return this._interpolationFunction; - }, - set: function (interpolation) { - this._interpolationFunction = interpolation; - }, - enumerable: true, - configurable: true - }); - Tween.prototype.chain = function (tween) { - this._chainedTweens.push(tween); - return this; - }; - Tween.prototype.update = function (time) { - if(this._game.paused == true) { - if(this._pausedTime == 0) { - this._pausedTime = time; - } - } else { - // Ok we aren't paused, but was there some time gained? - if(this._pausedTime > 0) { - this._startTime += (time - this._pausedTime); - this._pausedTime = 0; - } - } - if(time < this._startTime) { - return true; - } - var elapsed = (time - this._startTime) / this._duration; - elapsed = elapsed > 1 ? 1 : elapsed; - var value = this._easingFunction(elapsed); - for(var property in this._valuesStart) { - // Add checks for object, array, numeric up front - if(this._valuesEnd[property] instanceof Array) { - this._object[property] = this._interpolationFunction(this._valuesEnd[property], value); - } else { - this._object[property] = this._valuesStart[property] + (this._valuesEnd[property] - this._valuesStart[property]) * value; - } - } - this.onUpdate.dispatch(this._object, value); - if(elapsed == 1) { - this.onComplete.dispatch(this._object); - for(var i = 0; i < this._chainedTweens.length; i++) { - this._chainedTweens[i].start(); - } - return false; - } - return true; - }; - return Tween; - })(); - Phaser.Tween = Tween; -})(Phaser || (Phaser = {})); /// /// /** @@ -7728,7 +7560,7 @@ var Phaser; var World = (function () { function World(game, width, height) { this._game = game; - this._cameras = new Phaser.Cameras(this._game, 0, 0, width, height); + this._cameras = new Phaser.CameraManager(this._game, 0, 0, width, height); this._game.camera = this._cameras.current; this.group = new Phaser.Group(this._game, 0); this.bounds = new Phaser.Rectangle(0, 0, width, height); @@ -8689,6 +8521,7 @@ var Phaser; Phaser.RequestAnimationFrame = RequestAnimationFrame; })(Phaser || (Phaser = {})); /// +/// /** * Phaser */ @@ -9578,7 +9411,7 @@ var Phaser; var Emitter = (function (_super) { __extends(Emitter, _super); /** - * Creates a new FlxEmitter object at a specific position. + * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * * @param X The X position of the emitter. @@ -9624,13 +9457,13 @@ var Phaser; Emitter.prototype.makeParticles = /** * This function generates a new array of particle sprites to attach to the emitter. * - * @param Graphics If you opted to not pre-configure an array of FlxSprite objects, you can simply pass in a particle image or sprite sheet. + * @param Graphics If you opted to not pre-configure an array of Sprite objects, you can simply pass in a particle image or sprite sheet. * @param Quantity The number of particles to generate when using the "create from image" option. * @param BakedRotations How many frames of baked rotation to use (boosts performance). Set to zero to not use baked rotations. * @param Multiple Whether the image in the Graphics param is a single particle or a bunch of particles (if it's a bunch, they need to be square!). * @param Collide Whether the particles should be flagged as not 'dead' (non-colliding particles are higher performance). 0 means no collisions, 0-1 controls scale of particle's bounding box. * - * @return This FlxEmitter instance (nice for chaining stuff together, if you're into that). + * @return This Emitter instance (nice for chaining stuff together, if you're into that). */ function (Graphics, Quantity, BakedRotations, Multiple, Collide) { if (typeof Quantity === "undefined") { Quantity = 50; } @@ -9832,9 +9665,9 @@ var Phaser; this.maxRotation = Max; }; Emitter.prototype.at = /** - * Change the emitter's midpoint to match the midpoint of a FlxObject. + * Change the emitter's midpoint to match the midpoint of a Object. * - * @param Object The FlxObject that you want to sync up with. + * @param Object The Object that you want to sync up with. */ function (Object) { Object.getMidpoint(this._point); @@ -9992,7 +9825,7 @@ var Phaser; this._dx -= (camera.worldView.x * this.scrollFactor.x); this._dy -= (camera.worldView.y * this.scrollFactor.y); } - // Rotation (misleading?) + // Rotation (could be misleading as it doesn't work re: collision) if(this.angle !== 0) { this._game.stage.context.save(); this._game.stage.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); @@ -10006,8 +9839,8 @@ var Phaser; this._dh = Math.round(this._dh); this._game.stage.saveCanvasValues(); // Debug - this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; - this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); + //this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this._game.stage.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); this._game.stage.context.lineWidth = this.lineWidth; this._game.stage.context.strokeStyle = this.lineColor; this._game.stage.context.fillStyle = this.fillColor; @@ -10229,7 +10062,7 @@ var Phaser; var Tile = (function (_super) { __extends(Tile, _super); /** - * Instantiate this new tile object. This is usually called from FlxTilemap.loadMap(). + * Instantiate this new tile object. This is usually called from Tilemap.loadMap(). * * @param Tilemap A reference to the tilemap object creating the tile. * @param Index The actual core map data index for this tile type. @@ -10560,10 +10393,10 @@ var Phaser; })(Phaser.GameObject); Phaser.Tilemap = Tilemap; })(Phaser || (Phaser = {})); -/// +/// /// /// -/// +/// /// /// /// @@ -10863,408 +10696,587 @@ var Phaser; })(); Phaser.Game = Game; })(Phaser || (Phaser = {})); -/// -/** -* Animation -* -* @desc Loads Sprite Sheets and Texture Atlas formats into a unified FrameData object -* -* @version 1.0 - 22nd March 2013 -* @author Richard Davey -*/ -/** -* Phaser -*/ var Phaser; (function (Phaser) { - var Animation = (function () { - function Animation(game, parent, frameData, name, frames, delay, looped) { - this._game = game; - this._parent = parent; - this._frames = frames; - this._frameData = frameData; - this.name = name; - this.delay = 1000 / delay; - this.looped = looped; - this.isFinished = false; - this.isPlaying = false; - } - Object.defineProperty(Animation.prototype, "frameTotal", { - get: function () { - return this._frames.length; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animation.prototype, "frame", { - get: function () { - return this._frameIndex; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrame(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = value; - } - }, - enumerable: true, - configurable: true - }); - Animation.prototype.play = function (frameRate, loop) { - if (typeof frameRate === "undefined") { frameRate = null; } - if(frameRate !== null) { - this.delay = 1000 / frameRate; - } - if(loop !== undefined) { - this.looped = loop; - } - 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]); - }; - Animation.prototype.onComplete = function () { - this.isPlaying = false; - this.isFinished = true; - // callback - }; - Animation.prototype.stop = function () { - this.isPlaying = false; - this.isFinished = true; - }; - Animation.prototype.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]); - } else { - this.onComplete(); - } - } else { - this.currentFrame = this._frameData.getFrame(this._frames[this._frameIndex]); - } - this._timeLastFrame = this._game.time.now; - this._timeNextFrame = this._game.time.now + this.delay; - return true; - } - return false; - }; - Animation.prototype.destroy = function () { - this._game = null; - this._parent = null; - this._frames = null; - this._frameData = null; - this.currentFrame = null; - this.isPlaying = false; - }; - return Animation; - })(); - Phaser.Animation = Animation; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var AnimationLoader = (function () { - function AnimationLoader() { } - AnimationLoader.parseSpriteSheet = function parseSpriteSheet(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; - 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) { - return null; - } - // Let's create some frames then - var data = new Phaser.FrameData(); - var x = 0; - var y = 0; - for(var i = 0; i < total; i++) { - data.addFrame(new Phaser.Frame(x, y, frameWidth, frameHeight, '')); - x += frameWidth; - if(x === width) { - x = 0; - y += frameHeight; - } - } - return data; - }; - AnimationLoader.parseJSONData = function parseJSONData(game, json) { - // Let's create some frames then - var data = new Phaser.FrameData(); - // By this stage frames is a fully parsed array - var frames = json; - var newFrame; - for(var i = 0; i < frames.length; i++) { - newFrame = data.addFrame(new Phaser.Frame(frames[i].frame.x, frames[i].frame.y, frames[i].frame.w, frames[i].frame.h, frames[i].filename)); - 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); - } - return data; - }; - return AnimationLoader; - })(); - Phaser.AnimationLoader = AnimationLoader; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var Frame = (function () { - function Frame(x, y, width, height, name) { - // Useful for Texture Atlas files (is set to the filename value) - this.name = ''; - // Rotated? (not yet implemented) - this.rotated = false; - // Either cw or ccw, rotation is always 90 degrees - this.rotationDirection = 'cw'; - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.name = name; - this.rotated = false; - this.trimmed = false; - } - Frame.prototype.setRotation = function (rotated, rotationDirection) { - // Not yet supported - }; - Frame.prototype.setTrim = function (trimmed, actualWidth, actualHeight, destX, destY, destWidth, destHeight) { - this.trimmed = trimmed; - this.sourceSizeW = actualWidth; - this.sourceSizeH = actualHeight; - this.spriteSourceSizeX = destX; - this.spriteSourceSizeY = destY; - this.spriteSourceSizeW = destWidth; - this.spriteSourceSizeH = destHeight; - }; - return Frame; - })(); - Phaser.Frame = Frame; -})(Phaser || (Phaser = {})); -/// -/** -* Phaser -*/ -var Phaser; -(function (Phaser) { - var FrameData = (function () { - function FrameData() { - this._frames = []; - this._frameNames = []; - } - Object.defineProperty(FrameData.prototype, "total", { - get: function () { - return this._frames.length; - }, - enumerable: true, - configurable: true - }); - FrameData.prototype.addFrame = function (frame) { - frame.index = this._frames.length; - this._frames.push(frame); - if(frame.name !== '') { - this._frameNames[frame.name] = frame.index; - } - return frame; - }; - FrameData.prototype.getFrame = function (index) { - if(this._frames[index]) { - return this._frames[index]; - } - return null; - }; - FrameData.prototype.getFrameByName = function (name) { - if(this._frameNames[name] >= 0) { - return this._frames[this._frameNames[name]]; - } - return null; - }; - FrameData.prototype.checkFrameName = function (name) { - if(this._frameNames[name] >= 0) { - return true; - } - return false; - }; - FrameData.prototype.getFrameRange = function (start, end, output) { - if (typeof output === "undefined") { output = []; } - for(var i = start; i <= end; i++) { - output.push(this._frames[i]); - } - return output; - }; - FrameData.prototype.getFrameIndexes = function (output) { - if (typeof output === "undefined") { output = []; } - output.length = 0; - for(var i = 0; i < this._frames.length; i++) { - output.push(i); - } - return output; - }; - FrameData.prototype.getFrameIndexesByName = function (input) { - var output = []; - for(var i = 0; i < input.length; i++) { - if(this.getFrameByName(input[i])) { - output.push(this.getFrameByName(input[i]).index); - } - } - return output; - }; - FrameData.prototype.getAllFrames = function () { - return this._frames; - }; - FrameData.prototype.getFrames = function (range) { - var output = []; - for(var i = 0; i < range.length; i++) { - output.push(this._frames[i]); - } - return output; - }; - return FrameData; - })(); - Phaser.FrameData = FrameData; -})(Phaser || (Phaser = {})); -/// -/// -/// -/// -/// -/// -var Phaser; -(function (Phaser) { - var Animations = (function () { - function Animations(game, parent) { - this._frameData = null; - this.currentFrame = null; - this._game = game; - this._parent = parent; - this._anims = { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Back = (function () { + function Back() { } + Back.In = function In(k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); }; + Back.Out = function Out(k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }; + Back.InOut = function InOut(k) { + var s = 1.70158 * 1.525; + if((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }; + return Back; + })(); + Easing.Back = Back; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Bounce = (function () { + function Bounce() { } + Bounce.In = function In(k) { + return 1 - Phaser.Easing.Bounce.Out(1 - k); + }; + Bounce.Out = function Out(k) { + if(k < (1 / 2.75)) { + return 7.5625 * k * k; + } else if(k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } else if(k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }; + Bounce.InOut = function InOut(k) { + if(k < 0.5) { + return Phaser.Easing.Bounce.In(k * 2) * 0.5; + } + return Phaser.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5; + }; + return Bounce; + })(); + Easing.Bounce = Bounce; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Circular = (function () { + function Circular() { } + Circular.In = function In(k) { + return 1 - Math.sqrt(1 - k * k); + }; + Circular.Out = function Out(k) { + return Math.sqrt(1 - (--k * k)); + }; + Circular.InOut = function InOut(k) { + if((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }; + return Circular; + })(); + Easing.Circular = Circular; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Cubic = (function () { + function Cubic() { } + Cubic.In = function In(k) { + return k * k * k; + }; + Cubic.Out = function Out(k) { + return --k * k * k + 1; + }; + Cubic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }; + return Cubic; + })(); + Easing.Cubic = Cubic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Elastic = (function () { + function Elastic() { } + Elastic.In = function In(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + }; + Elastic.Out = function Out(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }; + Elastic.InOut = function InOut(k) { + var s, a = 0.1, p = 0.4; + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if(!a || a < 1) { + a = 1; + s = p / 4; + } else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + }; + return Elastic; + })(); + Easing.Elastic = Elastic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Exponential = (function () { + function Exponential() { } + Exponential.In = function In(k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }; + Exponential.Out = function Out(k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }; + Exponential.InOut = function InOut(k) { + if(k === 0) { + return 0; + } + if(k === 1) { + return 1; + } + if((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }; + return Exponential; + })(); + Easing.Exponential = Exponential; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Linear = (function () { + function Linear() { } + Linear.None = function None(k) { + return k; + }; + return Linear; + })(); + Easing.Linear = Linear; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quadratic = (function () { + function Quadratic() { } + Quadratic.In = function In(k) { + return k * k; + }; + Quadratic.Out = function Out(k) { + return k * (2 - k); + }; + Quadratic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }; + return Quadratic; + })(); + Easing.Quadratic = Quadratic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quartic = (function () { + function Quartic() { } + Quartic.In = function In(k) { + return k * k * k * k; + }; + Quartic.Out = function Out(k) { + return 1 - (--k * k * k * k); + }; + Quartic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }; + return Quartic; + })(); + Easing.Quartic = Quartic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Quintic = (function () { + function Quintic() { } + Quintic.In = function In(k) { + return k * k * k * k * k; + }; + Quintic.Out = function Out(k) { + return --k * k * k * k * k + 1; + }; + Quintic.InOut = function InOut(k) { + if((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }; + return Quintic; + })(); + Easing.Quintic = Quintic; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +var Phaser; +(function (Phaser) { + /// + /** + * Phaser - Easing + * + * @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) + * + * @version 1.0 - 11th January 2013 + * + * @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list + */ + (function (Easing) { + var Sinusoidal = (function () { + function Sinusoidal() { } + Sinusoidal.In = function In(k) { + return 1 - Math.cos(k * Math.PI / 2); + }; + Sinusoidal.Out = function Out(k) { + return Math.sin(k * Math.PI / 2); + }; + Sinusoidal.InOut = function InOut(k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }; + return Sinusoidal; + })(); + Easing.Sinusoidal = Sinusoidal; + })(Phaser.Easing || (Phaser.Easing = {})); + var Easing = Phaser.Easing; +})(Phaser || (Phaser = {})); +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/** +* Phaser - Tween +* +* @desc Based heavily on tween.js by sole (https://github.com/sole/tween.js) converted to TypeScript and integrated into Phaser +* +* @version 1.0 - 11th January 2013 +* +* @author Richard Davey, TypeScript conversion and Phaser integration. See Phaser.TweenManager for the full tween.js author list +*/ +var Phaser; +(function (Phaser) { + var Tween = (function () { + function Tween(object, game) { + this._object = null; + this._pausedTime = 0; + this._valuesStart = { + }; + this._valuesEnd = { + }; + this._duration = 1000; + this._delayTime = 0; + this._startTime = null; + this._chainedTweens = []; + this._object = object; + this._game = game; + this._manager = this._game.tweens; + this._interpolationFunction = this._game.math.linearInterpolation; + this._easingFunction = Phaser.Easing.Linear.None; + this.onStart = new Phaser.Signal(); + this.onUpdate = new Phaser.Signal(); + this.onComplete = new Phaser.Signal(); } - Animations.prototype.loadFrameData = function (frameData) { - this._frameData = frameData; - this.frame = 0; + Tween.prototype.to = function (properties, duration, ease, autoStart) { + if (typeof duration === "undefined") { duration = 1000; } + if (typeof ease === "undefined") { ease = null; } + if (typeof autoStart === "undefined") { autoStart = false; } + this._duration = duration; + // If properties isn't an object this will fail, sanity check it here somehow? + this._valuesEnd = properties; + if(ease !== null) { + this._easingFunction = ease; + } + if(autoStart === true) { + return this.start(); + } else { + return this; + } }; - Animations.prototype.add = function (name, frames, frameRate, loop, useNumericIndex) { - if (typeof frames === "undefined") { frames = null; } - if (typeof frameRate === "undefined") { frameRate = 60; } - if (typeof loop === "undefined") { loop = false; } - if (typeof useNumericIndex === "undefined") { useNumericIndex = true; } - if(this._frameData == null) { + Tween.prototype.start = function () { + if(this._game === null || this._object === null) { return; } - if(frames == null) { - frames = this._frameData.getFrameIndexes(); - } else { - if(this.validateFrames(frames, useNumericIndex) == false) { - return; + this._manager.add(this); + this.onStart.dispatch(this._object); + this._startTime = this._game.time.now + this._delayTime; + for(var property in this._valuesEnd) { + // This prevents the interpolation of null values or of non-existing properties + if(this._object[property] === null || !(property in this._object)) { + throw Error('Phaser.Tween interpolation of null value of non-existing property'); + continue; } + // check if an Array was provided as property value + if(this._valuesEnd[property] instanceof Array) { + if(this._valuesEnd[property].length === 0) { + continue; + } + // create a local copy of the Array with the start value at the front + this._valuesEnd[property] = [ + this._object[property] + ].concat(this._valuesEnd[property]); + } + this._valuesStart[property] = this._object[property]; } - if(useNumericIndex == false) { - frames = this._frameData.getFrameIndexesByName(frames); - } - this._anims[name] = new Phaser.Animation(this._game, this._parent, this._frameData, name, frames, frameRate, loop); - this.currentAnim = this._anims[name]; + return this; }; - Animations.prototype.validateFrames = function (frames, useNumericIndex) { - for(var i = 0; i < frames.length; i++) { - if(useNumericIndex == true) { - if(frames[i] > this._frameData.total) { - return false; - } - } else { - if(this._frameData.checkFrameName(frames[i]) == false) { - return false; - } + Tween.prototype.stop = function () { + if(this._manager !== null) { + this._manager.remove(this); + } + return this; + }; + Object.defineProperty(Tween.prototype, "parent", { + set: function (value) { + this._game = value; + this._manager = this._game.tweens; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "delay", { + get: function () { + return this._delayTime; + }, + set: function (amount) { + this._delayTime = amount; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "easing", { + get: function () { + return this._easingFunction; + }, + set: function (easing) { + this._easingFunction = easing; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Tween.prototype, "interpolation", { + get: function () { + return this._interpolationFunction; + }, + set: function (interpolation) { + this._interpolationFunction = interpolation; + }, + enumerable: true, + configurable: true + }); + Tween.prototype.chain = function (tween) { + this._chainedTweens.push(tween); + return this; + }; + Tween.prototype.update = function (time) { + if(this._game.paused == true) { + if(this._pausedTime == 0) { + this._pausedTime = time; } + } else { + // Ok we aren't paused, but was there some time gained? + if(this._pausedTime > 0) { + this._startTime += (time - this._pausedTime); + this._pausedTime = 0; + } + } + if(time < this._startTime) { + return true; + } + var elapsed = (time - this._startTime) / this._duration; + elapsed = elapsed > 1 ? 1 : elapsed; + var value = this._easingFunction(elapsed); + for(var property in this._valuesStart) { + // Add checks for object, array, numeric up front + if(this._valuesEnd[property] instanceof Array) { + this._object[property] = this._interpolationFunction(this._valuesEnd[property], value); + } else { + this._object[property] = this._valuesStart[property] + (this._valuesEnd[property] - this._valuesStart[property]) * value; + } + } + this.onUpdate.dispatch(this._object, value); + if(elapsed == 1) { + this.onComplete.dispatch(this._object); + for(var i = 0; i < this._chainedTweens.length; i++) { + this._chainedTweens[i].start(); + } + return false; } return true; }; - Animations.prototype.play = function (name, frameRate, loop) { - if (typeof frameRate === "undefined") { frameRate = null; } - if(this._anims[name]) { - this.currentAnim = this._anims[name]; - this.currentAnim.play(frameRate, loop); - } - }; - Animations.prototype.stop = function (name) { - if(this._anims[name]) { - this.currentAnim = this._anims[name]; - this.currentAnim.stop(); - } - }; - Animations.prototype.update = function () { - if(this.currentAnim && this.currentAnim.update() == true) { - this.currentFrame = this.currentAnim.currentFrame; - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - } - }; - Object.defineProperty(Animations.prototype, "frameData", { - get: function () { - return this._frameData; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frameTotal", { - get: function () { - return this._frameData.total; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frame", { - get: function () { - return this._frameIndex; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrame(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = value; - } - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(Animations.prototype, "frameName", { - get: function () { - return this.currentFrame.name; - }, - set: function (value) { - this.currentFrame = this._frameData.getFrameByName(value); - if(this.currentFrame !== null) { - this._parent.bounds.width = this.currentFrame.width; - this._parent.bounds.height = this.currentFrame.height; - this._frameIndex = this.currentFrame.index; - } - }, - enumerable: true, - configurable: true - }); - return Animations; + return Tween; })(); - Phaser.Animations = Animations; + Phaser.Tween = Tween; })(Phaser || (Phaser = {})); /// /**

;+ky|6|~Q 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�{K87^Pt{kk0 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 literal 0 HcmV?d00001 diff --git a/Docs/phaser_tilemap.png b/Docs/phaser_tilemap.png new file mode 100644 index 0000000000000000000000000000000000000000..b2415f08a6639eb86b9dace15b11969761474187 GIT binary patch literal 67283 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 WjJr#)jqBM0zaxio-ch|>cHv)mBkupdate() and draw() are automatically called by FlxState/FlxGroup. + * Controls whether update() and draw() are automatically called by State/Group. */ public exists: bool; /** - * Controls whether update() is automatically called by FlxState/FlxGroup. + * Controls whether update() is automatically called by State/Group. */ public active: bool; /** - * Controls whether draw() is automatically called by FlxState/FlxGroup. + * Controls whether draw() is automatically called by State/Group. */ public visible: bool; @@ -125,7 +125,7 @@ module Phaser { /** * Handy for bringing game objects "back to life". Just sets alive and exists back to true. - * In practice, this is most often called by FlxObject.reset(). + * In practice, this is most often called by Object.reset(). */ public revive() { this.alive = true; diff --git a/Phaser/Cameras.ts b/Phaser/CameraManager.ts similarity index 98% rename from Phaser/Cameras.ts rename to Phaser/CameraManager.ts index 287990f1..4bc8f3e7 100644 --- a/Phaser/Cameras.ts +++ b/Phaser/CameraManager.ts @@ -10,7 +10,7 @@ module Phaser { - export class Cameras { + export class CameraManager { constructor(game: Game, x: number, y: number, width: number, height: number) { diff --git a/Phaser/Game.ts b/Phaser/Game.ts index 44ee807c..cacef060 100644 --- a/Phaser/Game.ts +++ b/Phaser/Game.ts @@ -1,7 +1,7 @@ -/// +/// /// /// -/// +/// /// /// /// diff --git a/Phaser/GameMath.ts b/Phaser/GameMath.ts index 84e2ffb6..16df2713 100644 --- a/Phaser/GameMath.ts +++ b/Phaser/GameMath.ts @@ -858,8 +858,8 @@ module Phaser { /** * Fetch a random entry from the given array. * Will return null if random selection is missing, or array has no entries. - * FlxG.getRandom() is deterministic and safe for use with replays/recordings. - * HOWEVER, FlxU.getRandom() is NOT deterministic and unsafe for use with replays/recordings. + * G.getRandom() is deterministic and safe for use with replays/recordings. + * HOWEVER, U.getRandom() is NOT deterministic and unsafe for use with replays/recordings. * * @param Objects An array of objects. * @param StartIndex Optional offset off the front of the array. Default value is 0, or the beginning of the array. diff --git a/Phaser/Group.ts b/Phaser/Group.ts index cf42a278..993f75d9 100644 --- a/Phaser/Group.ts +++ b/Phaser/Group.ts @@ -60,7 +60,7 @@ module Phaser { private _maxSize: number; /** - * Internal helper variable for recycling objects a la FlxEmitter. + * Internal helper variable for recycling objects a la Emitter. */ private _marker: number; @@ -185,7 +185,7 @@ module Phaser { } /** - * Adds a new Basic subclass (Basic, FlxBasic, Enemy, etc) to the group. + * Adds a new Basic subclass (Basic, Basic, Enemy, etc) to the group. * Group will try to replace a null member of the array first. * Failing that, Group will add it to the end of the member array, * assuming there is room for it, and doubling the size of the array if necessary. @@ -275,7 +275,7 @@ module Phaser { * and no object class was provided, it will return null * instead of a valid object!