diff --git a/Phaser/AnimationManager.ts b/Phaser/AnimationManager.ts index 00e297c0..de5800f4 100644 --- a/Phaser/AnimationManager.ts +++ b/Phaser/AnimationManager.ts @@ -34,6 +34,7 @@ module Phaser { * Local private reference to game. */ private _game: Game; + /** * Local private reference to its owner sprite. */ @@ -43,11 +44,13 @@ module Phaser { * Animation key-value container. */ private _anims: {}; + /** * Index of current frame. * @type {number} */ private _frameIndex: number; + /** * Data contains animation frames. * @type {FrameData} @@ -58,6 +61,7 @@ module Phaser { * Keeps track of the current animation being played. */ public currentAnim: Animation; + /** * Keeps track of the current frame of animation. */ diff --git a/Phaser/Basic.ts b/Phaser/Basic.ts index a850f261..1dcb7f75 100644 --- a/Phaser/Basic.ts +++ b/Phaser/Basic.ts @@ -23,6 +23,8 @@ module Phaser { this.visible = true; this.alive = true; this.isGroup = false; + this.ignoreGlobalUpdate = false; + this.ignoreGlobalRender = false; this.ignoreDrawDebug = false; } @@ -70,6 +72,16 @@ module Phaser { */ public alive: bool; + /** + * Setting this to true will prevent the object from being updated during the main game loop (you will have to call update on it yourself) + */ + public ignoreGlobalUpdate: bool; + + /** + * Setting this to true will prevent the object from being rendered during the main game loop (you will have to call render on it yourself) + */ + public ignoreGlobalRender: bool; + /** * Setting this to true will prevent the object from appearing * when the visual debug mode in the debugger overlay is toggled on. @@ -93,7 +105,7 @@ module Phaser { * Override this to update your class's position and appearance. * This is where most of your game rules and behavioral code will go. */ - public update() { + public update(forceUpdate?: bool = false) { } /** @@ -102,7 +114,7 @@ module Phaser { public postUpdate() { } - public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number) { + public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number, forceRender?: bool = false) { } /** diff --git a/Phaser/DynamicTexture.ts b/Phaser/DynamicTexture.ts index 1b48c621..e66a7b2a 100644 --- a/Phaser/DynamicTexture.ts +++ b/Phaser/DynamicTexture.ts @@ -239,6 +239,20 @@ module Phaser { } + /** + * Given an array of GameObjects it will update each of them so that their canvas/contexts reference this DynamicTexture + * @param objects {Array} An array of GameObjects, or objects that inherit from it such as Sprites + */ + public assignCanvasToGameObjects(objects: GameObject[]) { + + for (var i = 0; i < objects.length; i++) + { + objects[i].canvas = this.canvas; + objects[i].context = this.context; + } + + } + /** * Clear the whole canvas. */ @@ -248,6 +262,18 @@ module Phaser { } + /** + * Renders this DynamicTexture to the Stage at the given x/y coordinates + * + * @param x {number} The X coordinate to render on the stage to (given in screen coordinates, not world) + * @param y {number} The Y coordinate to render on the stage to (given in screen coordinates, not world) + */ + public render(x?: number = 0, y?: number = 0) { + + this._game.stage.context.drawImage(this.canvas, x, y); + + } + public get width(): number { return this.bounds.width; } diff --git a/Phaser/Game.ts b/Phaser/Game.ts index 4134976c..7ef9882a 100644 --- a/Phaser/Game.ts +++ b/Phaser/Game.ts @@ -661,11 +661,11 @@ module Phaser { /** * Create a new object container. * - * @param MaxSize {number} Optional, capacity of this group. + * @param maxSize {number} Optional, capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number = 0): Group { - return this.world.createGroup(MaxSize); + public createGroup(maxSize?: number = 0): Group { + return this.world.createGroup(maxSize); } /** diff --git a/Phaser/Group.ts b/Phaser/Group.ts index bf61020c..ce76aca9 100644 --- a/Phaser/Group.ts +++ b/Phaser/Group.ts @@ -98,7 +98,12 @@ module Phaser { /** * Automatically goes through and calls update on everything you added. */ - public update() { + public update(forceUpdate?: bool = false) { + + if (this.ignoreGlobalUpdate && forceUpdate == false) + { + return; + } var basic: Basic; var i: number = 0; @@ -107,10 +112,10 @@ module Phaser { { basic = this.members[i++]; - if ((basic != null) && basic.exists && basic.active) + if ((basic != null) && basic.exists && basic.active && basic.ignoreGlobalUpdate == false) { basic.preUpdate(); - basic.update(); + basic.update(forceUpdate); basic.postUpdate(); } } @@ -119,7 +124,12 @@ module Phaser { /** * Automatically goes through and calls render on everything you added. */ - public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number) { + public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number, forceRender?: bool = false) { + + if (this.ignoreGlobalRender && forceRender == false) + { + return; + } var basic: Basic; var i: number = 0; @@ -128,9 +138,9 @@ module Phaser { { basic = this.members[i++]; - if ((basic != null) && basic.exists && basic.visible) + if ((basic != null) && basic.exists && basic.visible && basic.ignoreGlobalRender == false) { - basic.render(camera, cameraOffsetX, cameraOffsetY); + basic.render(camera, cameraOffsetX, cameraOffsetY, forceRender); } } } @@ -189,7 +199,7 @@ module Phaser { * @param {Basic} Object The object you want to add to the group. * @return {Basic} The same Basic object that was passed in. */ - public add(Object: Basic) { + public add(Object: Basic): any { //Don't bother adding an object twice. if (this.members.indexOf(Object) >= 0) diff --git a/Phaser/Loader.ts b/Phaser/Loader.ts index 4165e9d7..0c25fd19 100644 --- a/Phaser/Loader.ts +++ b/Phaser/Loader.ts @@ -32,26 +32,32 @@ module Phaser { * Local private reference to game. */ private _game: Game; + /** * Array stors assets keys. So you can get that asset by its unique key. */ private _keys: string[]; + /** * Contains all the assets file infos. */ private _fileList; + /** * Game initialial assets loading callback. */ private _gameCreateComplete; private _onComplete; private _onFileLoad; + /** * Indicates assets loading progress. (from 0 to 100) * @type {number} */ private _progressChunk: number; + private _xhr: XMLHttpRequest; + /** * Length of assets queue. * @type {number} @@ -63,6 +69,7 @@ module Phaser { * @type {boolean} */ public hasLoaded: bool; + /** * Loading progress (from 0 to 1) * @type {number} @@ -404,9 +411,9 @@ module Phaser { this.progress = Math.round(this.progress + this._progressChunk); - if (this.progress > 1) + if (this.progress > 100) { - this.progress = 1; + this.progress = 100; } if (this._onFileLoad) diff --git a/Phaser/State.ts b/Phaser/State.ts index 8b457153..329e18da 100644 --- a/Phaser/State.ts +++ b/Phaser/State.ts @@ -196,11 +196,11 @@ module Phaser { /** * Create a new object container. * - * @param MaxSize {number} [optional] capacity of this group. + * @param maxSize {number} [optional] capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number = 0): Group { - return this.game.world.createGroup(MaxSize); + public createGroup(maxSize?: number = 0): Group { + return this.game.world.createGroup(maxSize); } /** diff --git a/Phaser/World.ts b/Phaser/World.ts index 59b5def1..a1867f3a 100644 --- a/Phaser/World.ts +++ b/Phaser/World.ts @@ -222,11 +222,11 @@ module Phaser { /** * Create a new object container. * - * @param [MaxSize] {number} capacity of this group. + * @param [maxSize] {number} capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number = 0): Group { - return this.group.add(new Group(this._game, MaxSize)); + public createGroup(maxSize?: number = 0): Group { + return this.group.add(new Group(this._game, maxSize)); } /** diff --git a/Phaser/gameobjects/Emitter.ts b/Phaser/gameobjects/Emitter.ts index a2b6ed9e..d918736c 100644 --- a/Phaser/gameobjects/Emitter.ts +++ b/Phaser/gameobjects/Emitter.ts @@ -17,14 +17,16 @@ module Phaser { * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * - * @param X {number} The X position of the emitter. - * @param Y {number} The Y position of the emitter. - * @param [Size] {number} specifies a maximum capacity for this emitter. + * @param x {number} The X position of the emitter. + * @param y {number} The Y position of the emitter. + * @param [size] {number} Specifies a maximum capacity for this emitter. */ - constructor(game: Game, X: number = 0, Y: number = 0, Size: number = 0) { - super(game, Size); - this.x = X; - this.y = Y; + constructor(game: Game, x: number = 0, y: number = 0, size: number = 0) { + + super(game, size); + + this.x = x; + this.y = y; this.width = 0; this.height = 0; this.minParticleSpeed = new MicroPoint(-100, -100); @@ -42,6 +44,7 @@ module Phaser { this._explode = true; this.on = false; this._point = new MicroPoint(); + } /** diff --git a/Phaser/gameobjects/GameObject.ts b/Phaser/gameobjects/GameObject.ts index a2381c45..eb06bacc 100644 --- a/Phaser/gameobjects/GameObject.ts +++ b/Phaser/gameobjects/GameObject.ts @@ -27,6 +27,9 @@ module Phaser { super(game); + this.canvas = game.stage.canvas; + this.context = game.stage.context; + this.bounds = new Rectangle(x, y, width, height); this.exists = true; this.active = true; @@ -126,7 +129,6 @@ module Phaser { */ public static ALIGN_BOTTOM_RIGHT: number = 8; - /** * Enum value for outOfBoundsAction. Stop the object when is out of world bounds. * @type {number} @@ -139,12 +141,28 @@ module Phaser { */ public static OUT_OF_BOUNDS_KILL: number = 1; + /** + * A reference to the Canvas this GameObject will render to + * @type {HTMLCanvasElement} + */ + public canvas: HTMLCanvasElement; + + /** + * A reference to the Canvas Context2D this GameObject will render to + * @type {CanvasRenderingContext2D} + */ + public context: CanvasRenderingContext2D; + /** * Position of this object after scrolling. * @type {MicroPoint} */ public _point: MicroPoint; + /** + * An Array of Cameras to which this GameObject won't render + * @type {Array} + */ public cameraBlacklist: number[]; /** @@ -352,8 +370,6 @@ module Phaser { */ public preUpdate() { - // flicker time - this.last.x = this.bounds.x; this.last.y = this.bounds.y; @@ -761,6 +777,18 @@ module Phaser { } + /** + * Set the world bounds that this GameObject can exist within based on the size of the current game world. + * + * @param action {number} The action to take if the object hits the world bounds, either OUT_OF_BOUNDS_KILL or OUT_OF_BOUNDS_STOP + */ + public setBoundsFromWorld(action?: number = GameObject.OUT_OF_BOUNDS_STOP) { + + this.setBounds(this._game.world.bounds.x, this._game.world.bounds.y, this._game.world.bounds.width, this._game.world.bounds.height); + this.outOfBoundsAction = action; + + } + /** * If you do not wish this object to be visible to a specific camera, pass the camera here. * diff --git a/Phaser/gameobjects/GeomSprite.ts b/Phaser/gameobjects/GeomSprite.ts index cfb25eae..1d77a881 100644 --- a/Phaser/gameobjects/GeomSprite.ts +++ b/Phaser/gameobjects/GeomSprite.ts @@ -46,21 +46,25 @@ module Phaser { * Not completely set yet. (the default type) */ public static UNASSIGNED: number = 0; + /** * Circle. * @type {number} */ public static CIRCLE: number = 1; + /** * Line. * @type {number} */ public static LINE: number = 2; + /** * Point. * @type {number} */ public static POINT: number = 3; + /** * Rectangle. * @type {number} @@ -72,16 +76,19 @@ module Phaser { * @type {Circle} */ public circle: Circle; + /** * Line shape container. A Line instance. * @type {Line} */ public line: Line; + /** * Point shape container. A Point instance. * @type {Point} */ public point: Point; + /** * Rectangle shape container. A Rectangle instance. * @type {Rectangle} @@ -93,6 +100,7 @@ module Phaser { * @type {boolean} */ public renderOutline: bool = true; + /** * Fill the shape or not. (default is true) * @type {boolean} @@ -104,11 +112,13 @@ module Phaser { * @type {number} */ public lineWidth: number = 1; + /** * Width of outline. (default is 1) * @type {number} */ public lineColor: string = 'rgb(0,255,0)'; + /** * Width of outline. (default is 1) * @type {number} @@ -322,8 +332,8 @@ module Phaser { // Alpha if (this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.x - camera.worldView.x); @@ -349,9 +359,9 @@ 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.rotate(this.angle * (Math.PI / 180)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); } @@ -365,12 +375,12 @@ 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.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this.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; + this.context.lineWidth = this.lineWidth; + this.context.strokeStyle = this.lineColor; + this.context.fillStyle = this.fillColor; if (this._game.stage.fillStyle !== this.fillColor) { @@ -379,52 +389,52 @@ module Phaser { // Primitive Renderer if (this.type == GeomSprite.CIRCLE) { - this._game.stage.context.beginPath(); - this._game.stage.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); + this.context.stroke(); if (this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } else if (this.type == GeomSprite.LINE) { - this._game.stage.context.beginPath(); - this._game.stage.context.moveTo(this._dx, this._dy); - this._game.stage.context.lineTo(this.line.x2, this.line.y2); - this._game.stage.context.stroke(); - this._game.stage.context.closePath(); + this.context.beginPath(); + this.context.moveTo(this._dx, this._dy); + this.context.lineTo(this.line.x2, this.line.y2); + this.context.stroke(); + this.context.closePath(); } else if (this.type == GeomSprite.POINT) { - this._game.stage.context.fillRect(this._dx, this._dy, 2, 2); + this.context.fillRect(this._dx, this._dy, 2, 2); } else if (this.type == GeomSprite.RECTANGLE) { // We can use the faster fillRect if we don't need the outline if (this.renderOutline == false) { - this._game.stage.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); } else { - this._game.stage.context.beginPath(); - this._game.stage.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.stroke(); if (this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } // And now the edge points - this._game.stage.context.fillStyle = 'rgb(255,255,255)'; + this.context.fillStyle = 'rgb(255,255,255)'; //this.renderPoint(this.rect.topLeft, this._dx, this._dy, 2); //this.renderPoint(this.rect.topCenter, this._dx, this._dy, 2); //this.renderPoint(this.rect.topRight, this._dx, this._dy, 2); @@ -450,13 +460,13 @@ module Phaser { if (this.rotation !== 0) { - this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + this.context.translate(0, 0); + this.context.restore(); } if (globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; @@ -472,7 +482,7 @@ module Phaser { */ public renderPoint(point, offsetX?: number = 0, offsetY?: number = 0, size?: number = 1) { - this._game.stage.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); + this.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); } @@ -484,11 +494,11 @@ module Phaser { */ public renderDebugInfo(x: number, y: number, color?: string = 'rgb(255,255,255)') { - //this._game.stage.context.fillStyle = color; - //this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - //this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - //this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - //this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + //this.context.fillStyle = color; + //this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + //this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + //this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + //this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); } diff --git a/Phaser/gameobjects/ScrollRegion.ts b/Phaser/gameobjects/ScrollRegion.ts index 5d3149b5..42c80219 100644 --- a/Phaser/gameobjects/ScrollRegion.ts +++ b/Phaser/gameobjects/ScrollRegion.ts @@ -10,7 +10,7 @@ module Phaser { - export class ScrollRegion{ + export class ScrollRegion { /** * ScrollRegion constructor @@ -54,6 +54,7 @@ module Phaser { * @type {boolean} */ public visible: bool = true; + /** * Region scrolling speed. * @type {MicroPoint} diff --git a/Phaser/gameobjects/ScrollZone.ts b/Phaser/gameobjects/ScrollZone.ts index c6c0e672..d801a769 100644 --- a/Phaser/gameobjects/ScrollZone.ts +++ b/Phaser/gameobjects/ScrollZone.ts @@ -202,8 +202,8 @@ module Phaser { // Alpha if (this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); @@ -221,12 +221,12 @@ module Phaser { // Rotation - needs to work from origin point really, but for now from center if (this.angle !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if (this.angle !== 0) { - this._game.stage.context.rotate(this.angle * (Math.PI / 180)); + this.context.rotate(this.angle * (Math.PI / 180)); } this._dx = -(this._dw / 2); @@ -234,7 +234,7 @@ module Phaser { if (this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } @@ -247,17 +247,17 @@ module Phaser { { if (this._dynamicTexture) { - this.regions[i].render(this._game.stage.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); } else { - this.regions[i].render(this._game.stage.context, this._texture, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._texture, this._dx, this._dy, this._dw, this._dh); } } if (globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; diff --git a/Phaser/gameobjects/Sprite.ts b/Phaser/gameobjects/Sprite.ts index e18c5ffa..f113f902 100644 --- a/Phaser/gameobjects/Sprite.ts +++ b/Phaser/gameobjects/Sprite.ts @@ -232,8 +232,8 @@ module Phaser { // Alpha if (this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._sx = 0; @@ -304,12 +304,12 @@ module Phaser { // Rotation - needs to work from origin point really, but for now from center if (this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if (this.renderRotation == true && (this.angle !== 0 || this.rotationOffset !== 0)) { - this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); + this.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); } this._dx = -(this._dw / 2); @@ -317,7 +317,7 @@ module Phaser { if (this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } @@ -334,7 +334,7 @@ module Phaser { { if (this._dynamicTexture) { - this._game.stage.context.drawImage( + this.context.drawImage( this._texture.canvas, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y @@ -348,7 +348,7 @@ module Phaser { } else { - this._game.stage.context.drawImage( + this.context.drawImage( this._texture, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y @@ -363,14 +363,14 @@ module Phaser { } else { - this._game.stage.context.fillStyle = this.fillColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.fillColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); } if (this.flipped === true || this.rotation !== 0 || this.rotationOffset !== 0) { - //this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + //this.context.translate(0, 0); + this.context.restore(); } if (this.renderDebug) @@ -380,7 +380,7 @@ module Phaser { if (globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; @@ -398,24 +398,24 @@ module Phaser { this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.topLeft.y - camera.worldView.y); - this._game.stage.context.fillStyle = this.renderDebugColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); - this._game.stage.context.fillStyle = this.renderDebugPointColor; + this.context.fillStyle = this.renderDebugColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.renderDebugPointColor; var hw = this.bounds.halfWidth * this.scale.x; var hh = this.bounds.halfHeight * this.scale.y; var sw = (this.bounds.width * this.scale.x) - 1; var sh = (this.bounds.height * this.scale.y) - 1; - this._game.stage.context.fillRect(this._dx, this._dy, 1, 1); // top left - this._game.stage.context.fillRect(this._dx + hw, this._dy, 1, 1); // top center - this._game.stage.context.fillRect(this._dx + sw, this._dy, 1, 1); // top right - this._game.stage.context.fillRect(this._dx, this._dy + hh, 1, 1); // left center - this._game.stage.context.fillRect(this._dx + hw, this._dy + hh, 1, 1); // center - this._game.stage.context.fillRect(this._dx + sw, this._dy + hh, 1, 1); // right center - this._game.stage.context.fillRect(this._dx, this._dy + sh, 1, 1); // bottom left - this._game.stage.context.fillRect(this._dx + hw, this._dy + sh, 1, 1); // bottom center - this._game.stage.context.fillRect(this._dx + sw, this._dy + sh, 1, 1); // bottom right + this.context.fillRect(this._dx, this._dy, 1, 1); // top left + this.context.fillRect(this._dx + hw, this._dy, 1, 1); // top center + this.context.fillRect(this._dx + sw, this._dy, 1, 1); // top right + this.context.fillRect(this._dx, this._dy + hh, 1, 1); // left center + this.context.fillRect(this._dx + hw, this._dy + hh, 1, 1); // center + this.context.fillRect(this._dx + sw, this._dy + hh, 1, 1); // right center + this.context.fillRect(this._dx, this._dy + sh, 1, 1); // bottom left + this.context.fillRect(this._dx + hw, this._dy + sh, 1, 1); // bottom center + this.context.fillRect(this._dx + sw, this._dy + sh, 1, 1); // bottom right } @@ -427,11 +427,11 @@ module Phaser { */ public renderDebugInfo(x: number, y: number, color?: string = 'rgb(255,255,255)') { - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + this.context.fillStyle = color; + this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); } diff --git a/Phaser/system/TilemapLayer.ts b/Phaser/system/TilemapLayer.ts index e80b875c..b45a71d9 100644 --- a/Phaser/system/TilemapLayer.ts +++ b/Phaser/system/TilemapLayer.ts @@ -34,6 +34,9 @@ module Phaser { this.boundsInTiles = new Rectangle(); //this.scrollFactor = new MicroPoint(1, 1); + this.canvas = game.stage.canvas; + this.context = game.stage.context; + this.mapData = []; this._tempTileBlock = []; this._texture = this._game.cache.getImage(key); @@ -44,11 +47,13 @@ module Phaser { * Local private reference to game. */ private _game: Game; + /** * The tilemap that contains this layer. * @type {Tilemap} */ private _parent: Tilemap; + /** * Tileset of this layer. */ @@ -78,26 +83,43 @@ module Phaser { * @type {string} */ public name: string; + + /** + * A reference to the Canvas this GameObject will render to + * @type {HTMLCanvasElement} + */ + public canvas: HTMLCanvasElement; + + /** + * A reference to the Canvas Context2D this GameObject will render to + * @type {CanvasRenderingContext2D} + */ + public context: CanvasRenderingContext2D; + /** * Opacity of this layer. * @type {number} */ public alpha: number = 1; + /** * Controls whether update() and draw() are automatically called. * @type {boolean} */ public exists: bool = true; + /** * Controls whether draw() are automatically called. * @type {boolean} */ public visible: bool = true; + //public scrollFactor: MicroPoint; /** * @type {string} */ public orientation: string; + /** * Properties of this map layer. (normally set by map editors) */ @@ -108,10 +130,12 @@ module Phaser { * @type {number[][]} */ public mapData; + /** * Format of this map data, available: Tilemap.FORMAT_CSV or Tilemap.FORMAT_TILED_JSON. */ public mapFormat: number; + /** * It's width and height are in tiles instead of pixels. * @type {Rectangle} @@ -123,6 +147,7 @@ module Phaser { * @type {number} */ public tileWidth: number; + /** * Height of a single tile. * @type {number} @@ -135,6 +160,7 @@ module Phaser { * @type {number} */ public widthInTiles: number = 0; + /** * How many tiles in each column. * Read-only variable, do NOT recommend changing after the map is loaded! @@ -147,6 +173,7 @@ module Phaser { * @type {number} */ public widthInPixels: number = 0; + /** * Read-only variable, do NOT recommend changing after the map is loaded! * @type {number} @@ -158,6 +185,7 @@ module Phaser { * @type {number} */ public tileMargin: number = 0; + /** * Distance between every 2 neighbor tile in the tileset texture. * @type {number} @@ -502,11 +530,11 @@ module Phaser { public renderDebugInfo(x: number, y: number, color?: string = 'rgb(255,255,255)') { - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('TilemapLayer: ' + this.name, x, y); - this._game.stage.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); - this._game.stage.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); - this._game.stage.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); + this.context.fillStyle = color; + this.context.fillText('TilemapLayer: ' + this.name, x, y); + this.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); + this.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); + this.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); } @@ -585,8 +613,8 @@ module Phaser { // Alpha if (this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } for (var row = this._startY; row < this._startY + this._maxY; row++) @@ -597,7 +625,7 @@ module Phaser { { if (this._tileOffsets[this._columnData[tile]]) { - this._game.stage.context.drawImage( + this.context.drawImage( this._texture, // Source Image this._tileOffsets[this._columnData[tile]].x, // Source X (location within the source image) this._tileOffsets[this._columnData[tile]].y, // Source Y @@ -622,13 +650,12 @@ module Phaser { if (globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; } - } } \ No newline at end of file diff --git a/Phaser/system/input/Input.ts b/Phaser/system/input/Input.ts index c1f158d4..b640cc38 100644 --- a/Phaser/system/input/Input.ts +++ b/Phaser/system/input/Input.ts @@ -40,7 +40,6 @@ module Phaser { this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; @@ -164,17 +163,12 @@ module Phaser { public onUp: Phaser.Signal; /** - * A Signal dispatched when a Pointer object (including the mouse) is tapped: pressed and released quickly + * A Signal dispatched when a Pointer object (including the mouse) is tapped: pressed and released quickly. + * The signal sends 2 parameters. The Pointer that caused it and a boolean depending if the tap was a single tap or a double tap. * @type {Phaser.Signal} */ public onTap: Phaser.Signal; - /** - * A Signal dispatched when a Pointer object (including the mouse) is double tapped: pressed and released quickly twice in succession - * @type {Phaser.Signal} - */ - public onDoubleTap: Phaser.Signal; - /** * A Signal dispatched when a Pointer object (including the mouse) is held down * @type {Phaser.Signal} @@ -193,7 +187,7 @@ module Phaser { * @property doubleTapRate * @type {Number} **/ - public doubleTapRate: number = 250; + public doubleTapRate: number = 300; /** * The number of milliseconds that the Pointer has to be pressed down for it to fire a onHold event @@ -395,7 +389,6 @@ module Phaser { this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; diff --git a/Phaser/system/input/Pointer.ts b/Phaser/system/input/Pointer.ts index 17085094..7b0b3906 100644 --- a/Phaser/system/input/Pointer.ts +++ b/Phaser/system/input/Pointer.ts @@ -401,7 +401,7 @@ module Phaser { */ public stop(event): Pointer { - console.log('duration', this.duration); + this.timeUp = this._game.time.now; if (this._game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { @@ -410,13 +410,16 @@ module Phaser { // Was it a tap? if (this.duration >= 0 && this.duration <= this._game.input.tapRate) { - // Yes, let's dispatch the signal - this._game.input.onTap.dispatch(this); - // Was it a double-tap? if (this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) { - this._game.input.onDoubleTap.dispatch(this); + // Yes, let's dispatch the signal then with the 2nd parameter set to true + this._game.input.onTap.dispatch(this, true); + } + else + { + // Wasn't a double-tap, so dispatch a single tap signal + this._game.input.onTap.dispatch(this, false); } this.previousTapTime = this.timeUp; @@ -426,10 +429,8 @@ module Phaser { this.active = false; this.withinGame = false; - this.isDown = false; this.isUp = true; - this.timeUp = this._game.time.now; if (this.isMouse == false) { diff --git a/README.md b/README.md index e37c1c83..1216ea30 100644 --- a/README.md +++ b/README.md @@ -63,12 +63,21 @@ V0.9.6 * Added Input.onDown, onUp, onTap, onDoubleTap and onHold signals - all fired by the mouse or touch. * Added Input.recordPointerHistory to record the x/y coordinates a Pointer tracks through. Also Input.recordRate and Input.recordLimit for fine control. * Added Input.multiInputOverride which can be MOUSE_OVERRIDES_TOUCH, TOUCH_OVERRIDES_MOUSE or MOUSE_TOUCH_COMBINE. - +* Added GameObject.setBoundsFromWorld to quickly set the bounds of a game object to match those of the current game world. +* Added GameObject.canvas and GameObject.context. By default they reference Stage.canvas but can be changed to anything, i.e. a DynamicTexture +* The new canvas and context references are applied to Sprite, GeomSprite and TilemapLayer +* Added DynamicTexture.assignCanvasToGameObjects() to allow you to redirect GameObject rendering en-mass to a DynamicTexture +* Added DynamicTexture.render(x,y) to render the texture to the Stage canvas +* Added Basic.ignoreGlobalUpdate - stops the object being updated as part of the main game loop, you'll need to call update on it yourself +* Added Basic.ignoreGlobalRender - stops the object being rendered as part of the main game loop, you'll need to call render on it yourself +* Added forceUpdate and forceRender parameters to Group.update and Group.render respectively. Combined with ignoreGlobal you can create custom rendering set-ups +* Fixed Loader.progress calculation so it now accurate passes a value between 0 and 100% to your loader callback * TODO: Check that tween pausing works with the new performance.now * TODO: Game.Time should monitor pause duration * TODO: Investigate bug re: tilemap collision and animation frames * TODO: Update tests that use arrow keys and include touch/mouse support +* TODO: GameObject.clipRect Requirements diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index a905a611..e73be18b 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -116,6 +116,10 @@ shake.ts + + + display order.ts + multitouch.ts diff --git a/Tests/groups/display order.js b/Tests/groups/display order.js new file mode 100644 index 00000000..95902fb4 --- /dev/null +++ b/Tests/groups/display order.js @@ -0,0 +1,32 @@ +/// +(function () { + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + function init() { + myGame.loader.addImageFile('atari1', 'assets/sprites/atari130xe.png'); + myGame.loader.addImageFile('atari2', 'assets/sprites/atari800xl.png'); + myGame.loader.addImageFile('card', 'assets/sprites/mana_card.png'); + myGame.loader.load(); + } + var items; + var card; + function create() { + items = myGame.createGroup(); + // Items are rendered in the depth order in which they are added to the Group + items.add(myGame.createSprite(64, 100, 'atari1')); + card = items.add(myGame.createSprite(240, 80, 'card')); + items.add(myGame.createSprite(280, 100, 'atari2')); + myGame.input.onTap.addOnce(removeCard, this); + } + function removeCard() { + // Now let's kill the card sprite + card.kill(); + myGame.input.onTap.addOnce(replaceCard, this); + } + function replaceCard() { + // And bring it back to life again - I assume it will render in the same place as before? + var bob = items.getFirstDead(); + bob.revive(); + } + function update() { + } +})(); diff --git a/Tests/groups/display order.ts b/Tests/groups/display order.ts new file mode 100644 index 00000000..5b9c1dfb --- /dev/null +++ b/Tests/groups/display order.ts @@ -0,0 +1,56 @@ +/// + +(function () { + + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create, update); + + function init() { + + myGame.loader.addImageFile('atari1', 'assets/sprites/atari130xe.png'); + myGame.loader.addImageFile('atari2', 'assets/sprites/atari800xl.png'); + myGame.loader.addImageFile('card', 'assets/sprites/mana_card.png'); + + myGame.loader.load(); + + } + + var items: Phaser.Group; + var card: Phaser.Sprite; + + function create() { + + items = myGame.createGroup(); + + // Items are rendered in the depth order in which they are added to the Group + + items.add(myGame.createSprite(64, 100, 'atari1')); + card = items.add(myGame.createSprite(240, 80, 'card')); + items.add(myGame.createSprite(280, 100, 'atari2')); + + myGame.input.onTap.addOnce(removeCard, this); + + } + + function removeCard() { + + // Now let's kill the card sprite + card.kill(); + + myGame.input.onTap.addOnce(replaceCard, this); + + } + + function replaceCard() { + + // And bring it back to life again - I assume it will render in the same place as before? + var bob = items.getFirstDead(); + + bob.revive(); + + } + + function update() { + + } + +})(); diff --git a/Tests/input/single tap.js b/Tests/input/single tap.js index 08f3911a..d7ab5df0 100644 --- a/Tests/input/single tap.js +++ b/Tests/input/single tap.js @@ -14,29 +14,26 @@ function create() { balls = myGame.createGroup(); myGame.input.onTap.add(tapped, this); - myGame.input.onDoubleTap.add(doubleTapped, this); } - function doubleTapped(pointer) { - var tempBall = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); - tempBall.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; - tempBall.velocity.y = 100 + Math.random() * 150; - tempBall.elasticity = 0.9; - tempBall.scale.setTo(4, 4); - balls.add(tempBall); - } - function tapped(pointer) { - var tempBall = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); - tempBall.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; - tempBall.velocity.y = 100 + Math.random() * 150; - tempBall.elasticity = 0.9; - balls.add(tempBall); + function tapped(pointer, doubleTap) { + if(balls.countDead() > 0) { + var tempBall = balls.getFirstDead(); + tempBall.revive(); + tempBall.x = pointer.x; + tempBall.y = pointer.y; + } else { + var tempBall = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); + tempBall.setBoundsFromWorld(Phaser.GameObject.OUT_OF_BOUNDS_KILL); + balls.add(tempBall); + } + tempBall.velocity.y = 150; + if(doubleTap) { + tempBall.scale.setTo(4, 4); + } } function update() { } function render() { myGame.input.renderDebugInfo(16, 16); - //myGame.input.pointer1.renderDebug(true); - //myGame.input.pointer2.renderDebug(true); - //myGame.input.pointer3.renderDebug(true); - } + } })(); diff --git a/Tests/input/single tap.ts b/Tests/input/single tap.ts index 17e91e36..1f017329 100644 --- a/Tests/input/single tap.ts +++ b/Tests/input/single tap.ts @@ -24,28 +24,31 @@ balls = myGame.createGroup(); myGame.input.onTap.add(tapped, this); - myGame.input.onDoubleTap.add(doubleTapped, this); } - function doubleTapped(pointer: Phaser.Pointer) { + function tapped(pointer: Phaser.Pointer, doubleTap: bool) { - var tempBall: Phaser.Sprite = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); - tempBall.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; - tempBall.velocity.y = 100 + Math.random() * 150; - tempBall.elasticity = 0.9; - tempBall.scale.setTo(4, 4); - balls.add(tempBall); + if (balls.countDead() > 0) + { + var tempBall: Phaser.Sprite = balls.getFirstDead(); + tempBall.revive(); + tempBall.x = pointer.x; + tempBall.y = pointer.y; + } + else + { + var tempBall: Phaser.Sprite = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); + tempBall.setBoundsFromWorld(Phaser.GameObject.OUT_OF_BOUNDS_KILL); + balls.add(tempBall); + } - } + tempBall.velocity.y = 150; - function tapped(pointer: Phaser.Pointer) { - - var tempBall: Phaser.Sprite = new Phaser.Sprite(myGame, pointer.x, pointer.y, 'ball' + Math.round(Math.random() * 5)); - tempBall.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; - tempBall.velocity.y = 100 + Math.random() * 150; - tempBall.elasticity = 0.9; - balls.add(tempBall); + if (doubleTap) + { + tempBall.scale.setTo(4, 4); + } } @@ -56,10 +59,6 @@ myGame.input.renderDebugInfo(16, 16); - //myGame.input.pointer1.renderDebug(true); - //myGame.input.pointer2.renderDebug(true); - //myGame.input.pointer3.renderDebug(true); - } })(); diff --git a/Tests/phaser.js b/Tests/phaser.js index abdc4db2..8dd81191 100644 --- a/Tests/phaser.js +++ b/Tests/phaser.js @@ -23,6 +23,8 @@ var Phaser; this.visible = true; this.alive = true; this.isGroup = false; + this.ignoreGlobalUpdate = false; + this.ignoreGlobalRender = false; this.ignoreDrawDebug = false; } Basic.prototype.destroy = /** @@ -41,14 +43,16 @@ var Phaser; * Override this to update your class's position and appearance. * This is where most of your game rules and behavioral code will go. */ - function () { + function (forceUpdate) { + if (typeof forceUpdate === "undefined") { forceUpdate = false; } }; Basic.prototype.postUpdate = /** * Post-update is called right after update() on each object in the game loop. */ function () { }; - Basic.prototype.render = function (camera, cameraOffsetX, cameraOffsetY) { + Basic.prototype.render = function (camera, cameraOffsetX, cameraOffsetY, forceRender) { + if (typeof forceRender === "undefined") { forceRender = false; } }; Basic.prototype.kill = /** * Handy for "killing" game objects. @@ -512,6 +516,8 @@ var Phaser; // Input this.inputEnabled = false; this._inputOver = false; + this.canvas = game.stage.canvas; + this.context = game.stage.context; this.bounds = new Phaser.Rectangle(x, y, width, height); this.exists = true; this.active = true; @@ -559,7 +565,6 @@ var Phaser; * Pre-update is called right before update() on each object in the game loop. */ function () { - // flicker time this.last.x = this.bounds.x; this.last.y = this.bounds.y; }; @@ -869,6 +874,16 @@ var Phaser; function (x, y, width, height) { this.worldBounds = new Phaser.Quad(x, y, width, height); }; + GameObject.prototype.setBoundsFromWorld = /** + * Set the world bounds that this GameObject can exist within based on the size of the current game world. + * + * @param action {number} The action to take if the object hits the world bounds, either OUT_OF_BOUNDS_KILL or OUT_OF_BOUNDS_STOP + */ + function (action) { + if (typeof action === "undefined") { action = GameObject.OUT_OF_BOUNDS_STOP; } + this.setBounds(this._game.world.bounds.x, this._game.world.bounds.y, this._game.world.bounds.width, this._game.world.bounds.height); + this.outOfBoundsAction = action; + }; GameObject.prototype.hideFromCamera = /** * If you do not wish this object to be visible to a specific camera, pass the camera here. * @@ -1620,8 +1635,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._sx = 0; this._sy = 0; @@ -1667,15 +1682,15 @@ var Phaser; } // Rotation - needs to work from origin point really, but for now from center if(this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if(this.renderRotation == true && (this.angle !== 0 || this.rotationOffset !== 0)) { - this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); + this.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); } this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); if(this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } this._sx = Math.round(this._sx); @@ -1688,7 +1703,7 @@ var Phaser; this._dh = Math.round(this._dh); if(this._texture != null) { if(this._dynamicTexture) { - this._game.stage.context.drawImage(this._texture.canvas, // Source Image + this.context.drawImage(this._texture.canvas, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y this._sw, // Source Width @@ -1699,7 +1714,7 @@ var Phaser; this._dh); // Destination Height (always same as Source Height unless scaled) } else { - this._game.stage.context.drawImage(this._texture, // Source Image + this.context.drawImage(this._texture, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y this._sw, // Source Width @@ -1711,18 +1726,18 @@ var Phaser; // Destination Height (always same as Source Height unless scaled) } } else { - this._game.stage.context.fillStyle = this.fillColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.fillColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); } if(this.flipped === true || this.rotation !== 0 || this.rotationOffset !== 0) { - //this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + //this.context.translate(0, 0); + this.context.restore(); } if(this.renderDebug) { this.renderBounds(camera, cameraOffsetX, cameraOffsetY); } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -1735,30 +1750,30 @@ var Phaser; function (camera, cameraOffsetX, cameraOffsetY) { this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.topLeft.y - camera.worldView.y); - this._game.stage.context.fillStyle = this.renderDebugColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); - this._game.stage.context.fillStyle = this.renderDebugPointColor; + this.context.fillStyle = this.renderDebugColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.renderDebugPointColor; var hw = this.bounds.halfWidth * this.scale.x; var hh = this.bounds.halfHeight * this.scale.y; var sw = (this.bounds.width * this.scale.x) - 1; var sh = (this.bounds.height * this.scale.y) - 1; - this._game.stage.context.fillRect(this._dx, this._dy, 1, 1)// top left + this.context.fillRect(this._dx, this._dy, 1, 1)// top left ; - this._game.stage.context.fillRect(this._dx + hw, this._dy, 1, 1)// top center + this.context.fillRect(this._dx + hw, this._dy, 1, 1)// top center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy, 1, 1)// top right + this.context.fillRect(this._dx + sw, this._dy, 1, 1)// top right ; - this._game.stage.context.fillRect(this._dx, this._dy + hh, 1, 1)// left center + this.context.fillRect(this._dx, this._dy + hh, 1, 1)// left center ; - this._game.stage.context.fillRect(this._dx + hw, this._dy + hh, 1, 1)// center + this.context.fillRect(this._dx + hw, this._dy + hh, 1, 1)// center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy + hh, 1, 1)// right center + this.context.fillRect(this._dx + sw, this._dy + hh, 1, 1)// right center ; - this._game.stage.context.fillRect(this._dx, this._dy + sh, 1, 1)// bottom left + this.context.fillRect(this._dx, this._dy + sh, 1, 1)// bottom left ; - this._game.stage.context.fillRect(this._dx + hw, this._dy + sh, 1, 1)// bottom center + this.context.fillRect(this._dx + hw, this._dy + sh, 1, 1)// bottom center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy + sh, 1, 1)// bottom right + this.context.fillRect(this._dx + sw, this._dy + sh, 1, 1)// bottom right ; }; Sprite.prototype.renderDebugInfo = /** @@ -1769,11 +1784,11 @@ var Phaser; */ function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + this.context.fillStyle = color; + this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); }; return Sprite; })(Phaser.GameObject); @@ -5842,12 +5857,33 @@ var Phaser; this.context.putImageData(sourceTexture.getPixels(sourceRect), destPoint.x, destPoint.y); } }; + DynamicTexture.prototype.assignCanvasToGameObjects = /** + * Given an array of GameObjects it will update each of them so that their canvas/contexts reference this DynamicTexture + * @param objects {Array} An array of GameObjects, or objects that inherit from it such as Sprites + */ + function (objects) { + for(var i = 0; i < objects.length; i++) { + objects[i].canvas = this.canvas; + objects[i].context = this.context; + } + }; DynamicTexture.prototype.clear = /** * Clear the whole canvas. */ function () { this.context.clearRect(0, 0, this.bounds.width, this.bounds.height); }; + DynamicTexture.prototype.render = /** + * Renders this DynamicTexture to the Stage at the given x/y coordinates + * + * @param x {number} The X coordinate to render on the stage to (given in screen coordinates, not world) + * @param y {number} The Y coordinate to render on the stage to (given in screen coordinates, not world) + */ + function (x, y) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + this._game.stage.context.drawImage(this.canvas, x, y); + }; Object.defineProperty(DynamicTexture.prototype, "width", { get: function () { return this.bounds.width; @@ -6807,14 +6843,18 @@ var Phaser; Group.prototype.update = /** * Automatically goes through and calls update on everything you added. */ - function () { + function (forceUpdate) { + if (typeof forceUpdate === "undefined") { forceUpdate = false; } + if(this.ignoreGlobalUpdate && forceUpdate == false) { + return; + } var basic; var i = 0; while(i < this.length) { basic = this.members[i++]; - if((basic != null) && basic.exists && basic.active) { + if((basic != null) && basic.exists && basic.active && basic.ignoreGlobalUpdate == false) { basic.preUpdate(); - basic.update(); + basic.update(forceUpdate); basic.postUpdate(); } } @@ -6822,13 +6862,17 @@ var Phaser; Group.prototype.render = /** * Automatically goes through and calls render on everything you added. */ - function (camera, cameraOffsetX, cameraOffsetY) { + function (camera, cameraOffsetX, cameraOffsetY, forceRender) { + if (typeof forceRender === "undefined") { forceRender = false; } + if(this.ignoreGlobalRender && forceRender == false) { + return; + } var basic; var i = 0; while(i < this.length) { basic = this.members[i++]; - if((basic != null) && basic.exists && basic.visible) { - basic.render(camera, cameraOffsetX, cameraOffsetY); + if((basic != null) && basic.exists && basic.visible && basic.ignoreGlobalRender == false) { + basic.render(camera, cameraOffsetX, cameraOffsetY, forceRender); } } }; @@ -7508,6 +7552,7 @@ var Phaser; this._onFileLoad = onFileLoadCallback; if(this._keys.length > 0) { this._progressChunk = 100 / this._keys.length; + console.log('prog chunk', this._progressChunk); this.loadFile(); } else { this.progress = 1; @@ -7647,8 +7692,10 @@ var Phaser; */ function (previousKey, success) { this.progress = Math.round(this.progress + this._progressChunk); - if(this.progress > 1) { - this.progress = 1; + //this.progress = this.progress + this._progressChunk; + console.log('progress', this.progress); + if(this.progress > 100) { + this.progress = 100; } if(this._onFileLoad) { this._onFileLoad.call(this._game.callbackContext, this.progress, previousKey, success); @@ -9889,12 +9936,12 @@ var Phaser; World.prototype.createGroup = /** * Create a new object container. * - * @param [MaxSize] {number} capacity of this group. + * @param [maxSize] {number} capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.group.add(new Phaser.Group(this._game, MaxSize)); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.group.add(new Phaser.Group(this._game, maxSize)); }; World.prototype.createScrollZone = /** * Create a new ScrollZone object with image key, position and size. @@ -10995,16 +11042,18 @@ var Phaser; * @param {Any} event */ function (event) { - console.log('duration', this.duration); + this.timeUp = this._game.time.now; if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { this._game.input.onUp.dispatch(this); // Was it a tap? if(this.duration >= 0 && this.duration <= this._game.input.tapRate) { - // Yes, let's dispatch the signal - this._game.input.onTap.dispatch(this); // Was it a double-tap? if(this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) { - this._game.input.onDoubleTap.dispatch(this); + // Yes, let's dispatch the signal then with the 2nd parameter set to true + this._game.input.onTap.dispatch(this, true); + } else { + // Wasn't a double-tap, so dispatch a single tap signal + this._game.input.onTap.dispatch(this, false); } this.previousTapTime = this.timeUp; } @@ -11013,7 +11062,6 @@ var Phaser; this.withinGame = false; this.isDown = false; this.isUp = true; - this.timeUp = this._game.time.now; if(this.isMouse == false) { this._game.input.currentPointers--; } @@ -11308,7 +11356,7 @@ var Phaser; * @property doubleTapRate * @type {Number} **/ - this.doubleTapRate = 250; + this.doubleTapRate = 300; /** * The number of milliseconds that the Pointer has to be pressed down for it to fire a onHold event * @property holdRate @@ -11368,7 +11416,6 @@ var Phaser; this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; } @@ -11440,7 +11487,6 @@ var Phaser; this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; }; @@ -12210,17 +12256,17 @@ var Phaser; * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * - * @param X {number} The X position of the emitter. - * @param Y {number} The Y position of the emitter. - * @param [Size] {number} specifies a maximum capacity for this emitter. + * @param x {number} The X position of the emitter. + * @param y {number} The Y position of the emitter. + * @param [size] {number} Specifies a maximum capacity for this emitter. */ - function Emitter(game, X, Y, Size) { - if (typeof X === "undefined") { X = 0; } - if (typeof Y === "undefined") { Y = 0; } - if (typeof Size === "undefined") { Size = 0; } - _super.call(this, game, Size); - this.x = X; - this.y = Y; + function Emitter(game, x, y, size) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof size === "undefined") { size = 0; } + _super.call(this, game, size); + this.x = x; + this.y = y; this.width = 0; this.height = 0; this.minParticleSpeed = new Phaser.MicroPoint(-100, -100); @@ -12699,8 +12745,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.y - camera.worldView.y); @@ -12720,9 +12766,9 @@ var 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.rotate(this.angle * (Math.PI / 180)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); } @@ -12733,45 +12779,45 @@ 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.lineWidth = this.lineWidth; - this._game.stage.context.strokeStyle = this.lineColor; - this._game.stage.context.fillStyle = this.fillColor; + //this.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); + this.context.lineWidth = this.lineWidth; + this.context.strokeStyle = this.lineColor; + this.context.fillStyle = this.fillColor; if(this._game.stage.fillStyle !== this.fillColor) { } // Primitive Renderer if(this.type == GeomSprite.CIRCLE) { - this._game.stage.context.beginPath(); - this._game.stage.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); + this.context.stroke(); if(this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } else if(this.type == GeomSprite.LINE) { - this._game.stage.context.beginPath(); - this._game.stage.context.moveTo(this._dx, this._dy); - this._game.stage.context.lineTo(this.line.x2, this.line.y2); - this._game.stage.context.stroke(); - this._game.stage.context.closePath(); + this.context.beginPath(); + this.context.moveTo(this._dx, this._dy); + this.context.lineTo(this.line.x2, this.line.y2); + this.context.stroke(); + this.context.closePath(); } else if(this.type == GeomSprite.POINT) { - this._game.stage.context.fillRect(this._dx, this._dy, 2, 2); + this.context.fillRect(this._dx, this._dy, 2, 2); } else if(this.type == GeomSprite.RECTANGLE) { // We can use the faster fillRect if we don't need the outline if(this.renderOutline == false) { - this._game.stage.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); } else { - this._game.stage.context.beginPath(); - this._game.stage.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.stroke(); if(this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } // And now the edge points - this._game.stage.context.fillStyle = 'rgb(255,255,255)'; + this.context.fillStyle = 'rgb(255,255,255)'; //this.renderPoint(this.rect.topLeft, this._dx, this._dy, 2); //this.renderPoint(this.rect.topCenter, this._dx, this._dy, 2); //this.renderPoint(this.rect.topRight, this._dx, this._dy, 2); @@ -12793,11 +12839,11 @@ var Phaser; } this._game.stage.restoreCanvasValues(); if(this.rotation !== 0) { - this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + this.context.translate(0, 0); + this.context.restore(); } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -12812,7 +12858,7 @@ var Phaser; if (typeof offsetX === "undefined") { offsetX = 0; } if (typeof offsetY === "undefined") { offsetY = 0; } if (typeof size === "undefined") { size = 1; } - this._game.stage.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); + this.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); }; GeomSprite.prototype.renderDebugInfo = /** * Render debug infos. (this method does not work now) @@ -12822,11 +12868,11 @@ var Phaser; */ function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - //this._game.stage.context.fillStyle = color; - //this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - //this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - //this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - //this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + //this.context.fillStyle = color; + //this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + //this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + //this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + //this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); }; GeomSprite.prototype.collide = /** * Gives a basic boolean response to a geometric collision. @@ -13061,6 +13107,8 @@ var Phaser; this.tileHeight = tileHeight; this.boundsInTiles = new Phaser.Rectangle(); //this.scrollFactor = new MicroPoint(1, 1); + this.canvas = game.stage.canvas; + this.context = game.stage.context; this.mapData = []; this._tempTileBlock = []; this._texture = this._game.cache.getImage(key); @@ -13336,11 +13384,11 @@ var Phaser; }; TilemapLayer.prototype.renderDebugInfo = function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('TilemapLayer: ' + this.name, x, y); - this._game.stage.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); - this._game.stage.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); - this._game.stage.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); + this.context.fillStyle = color; + this.context.fillText('TilemapLayer: ' + this.name, x, y); + this.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); + this.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); + this.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); }; TilemapLayer.prototype.render = /** * Render this layer to a specific camera with offset to camera. @@ -13395,14 +13443,14 @@ var Phaser; */ // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } for(var row = this._startY; row < this._startY + this._maxY; row++) { this._columnData = this.mapData[row]; for(var tile = this._startX; tile < this._startX + this._maxX; tile++) { if(this._tileOffsets[this._columnData[tile]]) { - this._game.stage.context.drawImage(this._texture, // Source Image + this.context.drawImage(this._texture, // Source Image this._tileOffsets[this._columnData[tile]].x, // Source X (location within the source image) this._tileOffsets[this._columnData[tile]].y, // Source Y this.tileWidth, // Source Width @@ -13419,7 +13467,7 @@ var Phaser; this._ty += this.tileHeight; } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -14160,8 +14208,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.topLeft.y - camera.worldView.y); @@ -14174,15 +14222,15 @@ var Phaser; } // Rotation - needs to work from origin point really, but for now from center if(this.angle !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if(this.angle !== 0) { - this._game.stage.context.rotate(this.angle * (Math.PI / 180)); + this.context.rotate(this.angle * (Math.PI / 180)); } this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); if(this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } this._dx = Math.round(this._dx); @@ -14191,13 +14239,13 @@ var Phaser; this._dh = Math.round(this._dh); for(var i = 0; i < this.regions.length; i++) { if(this._dynamicTexture) { - this.regions[i].render(this._game.stage.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); } else { - this.regions[i].render(this._game.stage.context, this._texture, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._texture, this._dx, this._dy, this._dw, this._dh); } } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -14687,12 +14735,12 @@ var Phaser; Game.prototype.createGroup = /** * Create a new object container. * - * @param MaxSize {number} Optional, capacity of this group. + * @param maxSize {number} Optional, capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.world.createGroup(MaxSize); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.world.createGroup(maxSize); }; Game.prototype.createParticle = /** * Create a new Particle. @@ -15039,12 +15087,12 @@ var Phaser; State.prototype.createGroup = /** * Create a new object container. * - * @param MaxSize {number} [optional] capacity of this group. + * @param maxSize {number} [optional] capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.game.world.createGroup(MaxSize); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.game.world.createGroup(maxSize); }; State.prototype.createParticle = /** * Create a new Particle. diff --git a/Tests/tilemap/fill tiles.js b/Tests/tilemap/fill tiles.js index f2c344ab..914d5fe8 100644 --- a/Tests/tilemap/fill tiles.js +++ b/Tests/tilemap/fill tiles.js @@ -30,8 +30,8 @@ map.currentLayer.fillTile(15, 2, 2, 10, 20); } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/fill tiles.ts b/Tests/tilemap/fill tiles.ts index e8dc41bb..d25a8579 100644 --- a/Tests/tilemap/fill tiles.ts +++ b/Tests/tilemap/fill tiles.ts @@ -48,8 +48,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/Tests/tilemap/get tile.js b/Tests/tilemap/get tile.js index ff0a3c65..1870f268 100644 --- a/Tests/tilemap/get tile.js +++ b/Tests/tilemap/get tile.js @@ -25,8 +25,8 @@ myGame.onRenderCallback = render; } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/get tile.ts b/Tests/tilemap/get tile.ts index 462118cc..39ca1c76 100644 --- a/Tests/tilemap/get tile.ts +++ b/Tests/tilemap/get tile.ts @@ -40,8 +40,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/Tests/tilemap/map draw.js b/Tests/tilemap/map draw.js index d99c6ad3..a6e4125f 100644 --- a/Tests/tilemap/map draw.js +++ b/Tests/tilemap/map draw.js @@ -30,8 +30,8 @@ function update() { // Collide everything with the map map.collide(); - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 16); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 16); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 16); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 16); if(myGame.input.mousePointer.isDown) { map.putTile(marker.x, marker.y, 32); } diff --git a/Tests/tilemap/map draw.ts b/Tests/tilemap/map draw.ts index d6e82978..daac10d9 100644 --- a/Tests/tilemap/map draw.ts +++ b/Tests/tilemap/map draw.ts @@ -45,8 +45,8 @@ // Collide everything with the map map.collide(); - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 16); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 16); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 16); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 16); if (myGame.input.mousePointer.isDown) { diff --git a/Tests/tilemap/put tile.js b/Tests/tilemap/put tile.js index 9dd8874d..c57d957c 100644 --- a/Tests/tilemap/put tile.js +++ b/Tests/tilemap/put tile.js @@ -28,8 +28,8 @@ map.putTile(marker.x, marker.y, 32); } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/put tile.ts b/Tests/tilemap/put tile.ts index a351ecb5..102e2b5b 100644 --- a/Tests/tilemap/put tile.ts +++ b/Tests/tilemap/put tile.ts @@ -45,8 +45,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/Tests/tilemap/random tiles.js b/Tests/tilemap/random tiles.js index 92516733..478583f4 100644 --- a/Tests/tilemap/random tiles.js +++ b/Tests/tilemap/random tiles.js @@ -36,8 +36,8 @@ ]); } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/random tiles.ts b/Tests/tilemap/random tiles.ts index d92d5dc0..9de8d3af 100644 --- a/Tests/tilemap/random tiles.ts +++ b/Tests/tilemap/random tiles.ts @@ -47,8 +47,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/Tests/tilemap/replace tiles.js b/Tests/tilemap/replace tiles.js index 813053fe..72306f4c 100644 --- a/Tests/tilemap/replace tiles.js +++ b/Tests/tilemap/replace tiles.js @@ -29,8 +29,8 @@ map.currentLayer.replaceTile(30, 31); } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/replace tiles.ts b/Tests/tilemap/replace tiles.ts index 8944f234..09d167ef 100644 --- a/Tests/tilemap/replace tiles.ts +++ b/Tests/tilemap/replace tiles.ts @@ -47,8 +47,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/Tests/tilemap/swap tiles.js b/Tests/tilemap/swap tiles.js index 95de4ec1..5463cf9d 100644 --- a/Tests/tilemap/swap tiles.js +++ b/Tests/tilemap/swap tiles.js @@ -29,8 +29,8 @@ map.currentLayer.swapTile(30, 31); } function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; car.angularVelocity = 0; diff --git a/Tests/tilemap/swap tiles.ts b/Tests/tilemap/swap tiles.ts index 9344ff93..12ed4e10 100644 --- a/Tests/tilemap/swap tiles.ts +++ b/Tests/tilemap/swap tiles.ts @@ -47,8 +47,8 @@ function update() { - marker.x = myGame.math.snapToFloor(myGame.input.worldX, 32); - marker.y = myGame.math.snapToFloor(myGame.input.worldY, 32); + marker.x = myGame.math.snapToFloor(myGame.input.getWorldX(), 32); + marker.y = myGame.math.snapToFloor(myGame.input.getWorldY(), 32); car.velocity.x = 0; car.velocity.y = 0; diff --git a/build/phaser.d.ts b/build/phaser.d.ts index 54cddf8a..3066fc79 100644 --- a/build/phaser.d.ts +++ b/build/phaser.d.ts @@ -46,6 +46,14 @@ module Phaser { */ public alive: bool; /** + * Setting this to true will prevent the object from being updated during the main game loop (you will have to call update on it yourself) + */ + public ignoreGlobalUpdate: bool; + /** + * Setting this to true will prevent the object from being rendered during the main game loop (you will have to call render on it yourself) + */ + public ignoreGlobalRender: bool; + /** * Setting this to true will prevent the object from appearing * when the visual debug mode in the debugger overlay is toggled on. */ @@ -64,12 +72,12 @@ module Phaser { * Override this to update your class's position and appearance. * This is where most of your game rules and behavioral code will go. */ - public update(): void; + public update(forceUpdate?: bool): void; /** * Post-update is called right after update() on each object in the game loop. */ public postUpdate(): void; - public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number): void; + public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number, forceRender?: bool): void; /** * Handy for "killing" game objects. * Default behavior is to flag them as nonexistent AND dead. @@ -419,10 +427,24 @@ module Phaser { */ static OUT_OF_BOUNDS_KILL: number; /** + * A reference to the Canvas this GameObject will render to + * @type {HTMLCanvasElement} + */ + public canvas: HTMLCanvasElement; + /** + * A reference to the Canvas Context2D this GameObject will render to + * @type {CanvasRenderingContext2D} + */ + public context: CanvasRenderingContext2D; + /** * Position of this object after scrolling. * @type {MicroPoint} */ public _point: MicroPoint; + /** + * An Array of Cameras to which this GameObject won't render + * @type {Array} + */ public cameraBlacklist: number[]; /** * Rectangle container of this object. @@ -722,6 +744,12 @@ module Phaser { */ public setBounds(x: number, y: number, width: number, height: number): void; /** + * Set the world bounds that this GameObject can exist within based on the size of the current game world. + * + * @param action {number} The action to take if the object hits the world bounds, either OUT_OF_BOUNDS_KILL or OUT_OF_BOUNDS_STOP + */ + public setBoundsFromWorld(action?: number): void; + /** * If you do not wish this object to be visible to a specific camera, pass the camera here. * * @param camera {Camera} The specific camera. @@ -3542,9 +3570,21 @@ module Phaser { */ public copyPixels(sourceTexture: DynamicTexture, sourceRect: Rectangle, destPoint: Point): void; /** + * Given an array of GameObjects it will update each of them so that their canvas/contexts reference this DynamicTexture + * @param objects {Array} An array of GameObjects, or objects that inherit from it such as Sprites + */ + public assignCanvasToGameObjects(objects: GameObject[]): void; + /** * Clear the whole canvas. */ public clear(): void; + /** + * Renders this DynamicTexture to the Stage at the given x/y coordinates + * + * @param x {number} The X coordinate to render on the stage to (given in screen coordinates, not world) + * @param y {number} The Y coordinate to render on the stage to (given in screen coordinates, not world) + */ + public render(x?: number, y?: number): void; public width : number; public height : number; /** @@ -4111,11 +4151,11 @@ module Phaser { /** * Automatically goes through and calls update on everything you added. */ - public update(): void; + public update(forceUpdate?: bool): void; /** * Automatically goes through and calls render on everything you added. */ - public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number): void; + public render(camera: Camera, cameraOffsetX: number, cameraOffsetY: number, forceRender?: bool): void; /** * The maximum capacity of this group. Default is 0, meaning no max capacity, and the group can just grow. */ @@ -4135,7 +4175,7 @@ module Phaser { * @param {Basic} Object The object you want to add to the group. * @return {Basic} The same Basic object that was passed in. */ - public add(Object: Basic): Basic; + public add(Object: Basic): any; /** * Recycling is designed to help you reuse game objects without always re-allocating or "newing" them. * @@ -5652,10 +5692,10 @@ module Phaser { /** * Create a new object container. * - * @param [MaxSize] {number} capacity of this group. + * @param [maxSize] {number} capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number): Group; + public createGroup(maxSize?: number): Group; /** * Create a new ScrollZone object with image key, position and size. * @@ -6601,16 +6641,12 @@ module Phaser { */ public onUp: Signal; /** - * A Signal dispatched when a Pointer object (including the mouse) is tapped: pressed and released quickly + * A Signal dispatched when a Pointer object (including the mouse) is tapped: pressed and released quickly. + * The signal sends 2 parameters. The Pointer that caused it and a boolean depending if the tap was a single tap or a double tap. * @type {Phaser.Signal} */ public onTap: Signal; /** - * A Signal dispatched when a Pointer object (including the mouse) is double tapped: pressed and released quickly twice in succession - * @type {Phaser.Signal} - */ - public onDoubleTap: Signal; - /** * A Signal dispatched when a Pointer object (including the mouse) is held down * @type {Phaser.Signal} */ @@ -7110,11 +7146,11 @@ module Phaser { * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * - * @param X {number} The X position of the emitter. - * @param Y {number} The Y position of the emitter. - * @param [Size] {number} specifies a maximum capacity for this emitter. + * @param x {number} The X position of the emitter. + * @param y {number} The Y position of the emitter. + * @param [size] {number} Specifies a maximum capacity for this emitter. */ - constructor(game: Game, X?: number, Y?: number, Size?: number); + constructor(game: Game, x?: number, y?: number, size?: number); /** * The X position of the top left corner of the emitter in world space. */ @@ -7559,6 +7595,16 @@ module Phaser { */ public name: string; /** + * A reference to the Canvas this GameObject will render to + * @type {HTMLCanvasElement} + */ + public canvas: HTMLCanvasElement; + /** + * A reference to the Canvas Context2D this GameObject will render to + * @type {CanvasRenderingContext2D} + */ + public context: CanvasRenderingContext2D; + /** * Opacity of this layer. * @type {number} */ @@ -8474,10 +8520,10 @@ module Phaser { /** * Create a new object container. * - * @param MaxSize {number} Optional, capacity of this group. + * @param maxSize {number} Optional, capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number): Group; + public createGroup(maxSize?: number): Group; /** * Create a new Particle. * @@ -8749,10 +8795,10 @@ module Phaser { /** * Create a new object container. * - * @param MaxSize {number} [optional] capacity of this group. + * @param maxSize {number} [optional] capacity of this group. * @returns {Group} The newly created group. */ - public createGroup(MaxSize?: number): Group; + public createGroup(maxSize?: number): Group; /** * Create a new Particle. * diff --git a/build/phaser.js b/build/phaser.js index abdc4db2..8dd81191 100644 --- a/build/phaser.js +++ b/build/phaser.js @@ -23,6 +23,8 @@ var Phaser; this.visible = true; this.alive = true; this.isGroup = false; + this.ignoreGlobalUpdate = false; + this.ignoreGlobalRender = false; this.ignoreDrawDebug = false; } Basic.prototype.destroy = /** @@ -41,14 +43,16 @@ var Phaser; * Override this to update your class's position and appearance. * This is where most of your game rules and behavioral code will go. */ - function () { + function (forceUpdate) { + if (typeof forceUpdate === "undefined") { forceUpdate = false; } }; Basic.prototype.postUpdate = /** * Post-update is called right after update() on each object in the game loop. */ function () { }; - Basic.prototype.render = function (camera, cameraOffsetX, cameraOffsetY) { + Basic.prototype.render = function (camera, cameraOffsetX, cameraOffsetY, forceRender) { + if (typeof forceRender === "undefined") { forceRender = false; } }; Basic.prototype.kill = /** * Handy for "killing" game objects. @@ -512,6 +516,8 @@ var Phaser; // Input this.inputEnabled = false; this._inputOver = false; + this.canvas = game.stage.canvas; + this.context = game.stage.context; this.bounds = new Phaser.Rectangle(x, y, width, height); this.exists = true; this.active = true; @@ -559,7 +565,6 @@ var Phaser; * Pre-update is called right before update() on each object in the game loop. */ function () { - // flicker time this.last.x = this.bounds.x; this.last.y = this.bounds.y; }; @@ -869,6 +874,16 @@ var Phaser; function (x, y, width, height) { this.worldBounds = new Phaser.Quad(x, y, width, height); }; + GameObject.prototype.setBoundsFromWorld = /** + * Set the world bounds that this GameObject can exist within based on the size of the current game world. + * + * @param action {number} The action to take if the object hits the world bounds, either OUT_OF_BOUNDS_KILL or OUT_OF_BOUNDS_STOP + */ + function (action) { + if (typeof action === "undefined") { action = GameObject.OUT_OF_BOUNDS_STOP; } + this.setBounds(this._game.world.bounds.x, this._game.world.bounds.y, this._game.world.bounds.width, this._game.world.bounds.height); + this.outOfBoundsAction = action; + }; GameObject.prototype.hideFromCamera = /** * If you do not wish this object to be visible to a specific camera, pass the camera here. * @@ -1620,8 +1635,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._sx = 0; this._sy = 0; @@ -1667,15 +1682,15 @@ var Phaser; } // Rotation - needs to work from origin point really, but for now from center if(this.angle !== 0 || this.rotationOffset !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if(this.renderRotation == true && (this.angle !== 0 || this.rotationOffset !== 0)) { - this._game.stage.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); + this.context.rotate((this.rotationOffset + this.angle) * (Math.PI / 180)); } this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); if(this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } this._sx = Math.round(this._sx); @@ -1688,7 +1703,7 @@ var Phaser; this._dh = Math.round(this._dh); if(this._texture != null) { if(this._dynamicTexture) { - this._game.stage.context.drawImage(this._texture.canvas, // Source Image + this.context.drawImage(this._texture.canvas, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y this._sw, // Source Width @@ -1699,7 +1714,7 @@ var Phaser; this._dh); // Destination Height (always same as Source Height unless scaled) } else { - this._game.stage.context.drawImage(this._texture, // Source Image + this.context.drawImage(this._texture, // Source Image this._sx, // Source X (location within the source image) this._sy, // Source Y this._sw, // Source Width @@ -1711,18 +1726,18 @@ var Phaser; // Destination Height (always same as Source Height unless scaled) } } else { - this._game.stage.context.fillStyle = this.fillColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.fillColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); } if(this.flipped === true || this.rotation !== 0 || this.rotationOffset !== 0) { - //this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + //this.context.translate(0, 0); + this.context.restore(); } if(this.renderDebug) { this.renderBounds(camera, cameraOffsetX, cameraOffsetY); } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -1735,30 +1750,30 @@ var Phaser; function (camera, cameraOffsetX, cameraOffsetY) { this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.topLeft.y - camera.worldView.y); - this._game.stage.context.fillStyle = this.renderDebugColor; - this._game.stage.context.fillRect(this._dx, this._dy, this._dw, this._dh); - this._game.stage.context.fillStyle = this.renderDebugPointColor; + this.context.fillStyle = this.renderDebugColor; + this.context.fillRect(this._dx, this._dy, this._dw, this._dh); + this.context.fillStyle = this.renderDebugPointColor; var hw = this.bounds.halfWidth * this.scale.x; var hh = this.bounds.halfHeight * this.scale.y; var sw = (this.bounds.width * this.scale.x) - 1; var sh = (this.bounds.height * this.scale.y) - 1; - this._game.stage.context.fillRect(this._dx, this._dy, 1, 1)// top left + this.context.fillRect(this._dx, this._dy, 1, 1)// top left ; - this._game.stage.context.fillRect(this._dx + hw, this._dy, 1, 1)// top center + this.context.fillRect(this._dx + hw, this._dy, 1, 1)// top center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy, 1, 1)// top right + this.context.fillRect(this._dx + sw, this._dy, 1, 1)// top right ; - this._game.stage.context.fillRect(this._dx, this._dy + hh, 1, 1)// left center + this.context.fillRect(this._dx, this._dy + hh, 1, 1)// left center ; - this._game.stage.context.fillRect(this._dx + hw, this._dy + hh, 1, 1)// center + this.context.fillRect(this._dx + hw, this._dy + hh, 1, 1)// center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy + hh, 1, 1)// right center + this.context.fillRect(this._dx + sw, this._dy + hh, 1, 1)// right center ; - this._game.stage.context.fillRect(this._dx, this._dy + sh, 1, 1)// bottom left + this.context.fillRect(this._dx, this._dy + sh, 1, 1)// bottom left ; - this._game.stage.context.fillRect(this._dx + hw, this._dy + sh, 1, 1)// bottom center + this.context.fillRect(this._dx + hw, this._dy + sh, 1, 1)// bottom center ; - this._game.stage.context.fillRect(this._dx + sw, this._dy + sh, 1, 1)// bottom right + this.context.fillRect(this._dx + sw, this._dy + sh, 1, 1)// bottom right ; }; Sprite.prototype.renderDebugInfo = /** @@ -1769,11 +1784,11 @@ var Phaser; */ function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + this.context.fillStyle = color; + this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); }; return Sprite; })(Phaser.GameObject); @@ -5842,12 +5857,33 @@ var Phaser; this.context.putImageData(sourceTexture.getPixels(sourceRect), destPoint.x, destPoint.y); } }; + DynamicTexture.prototype.assignCanvasToGameObjects = /** + * Given an array of GameObjects it will update each of them so that their canvas/contexts reference this DynamicTexture + * @param objects {Array} An array of GameObjects, or objects that inherit from it such as Sprites + */ + function (objects) { + for(var i = 0; i < objects.length; i++) { + objects[i].canvas = this.canvas; + objects[i].context = this.context; + } + }; DynamicTexture.prototype.clear = /** * Clear the whole canvas. */ function () { this.context.clearRect(0, 0, this.bounds.width, this.bounds.height); }; + DynamicTexture.prototype.render = /** + * Renders this DynamicTexture to the Stage at the given x/y coordinates + * + * @param x {number} The X coordinate to render on the stage to (given in screen coordinates, not world) + * @param y {number} The Y coordinate to render on the stage to (given in screen coordinates, not world) + */ + function (x, y) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + this._game.stage.context.drawImage(this.canvas, x, y); + }; Object.defineProperty(DynamicTexture.prototype, "width", { get: function () { return this.bounds.width; @@ -6807,14 +6843,18 @@ var Phaser; Group.prototype.update = /** * Automatically goes through and calls update on everything you added. */ - function () { + function (forceUpdate) { + if (typeof forceUpdate === "undefined") { forceUpdate = false; } + if(this.ignoreGlobalUpdate && forceUpdate == false) { + return; + } var basic; var i = 0; while(i < this.length) { basic = this.members[i++]; - if((basic != null) && basic.exists && basic.active) { + if((basic != null) && basic.exists && basic.active && basic.ignoreGlobalUpdate == false) { basic.preUpdate(); - basic.update(); + basic.update(forceUpdate); basic.postUpdate(); } } @@ -6822,13 +6862,17 @@ var Phaser; Group.prototype.render = /** * Automatically goes through and calls render on everything you added. */ - function (camera, cameraOffsetX, cameraOffsetY) { + function (camera, cameraOffsetX, cameraOffsetY, forceRender) { + if (typeof forceRender === "undefined") { forceRender = false; } + if(this.ignoreGlobalRender && forceRender == false) { + return; + } var basic; var i = 0; while(i < this.length) { basic = this.members[i++]; - if((basic != null) && basic.exists && basic.visible) { - basic.render(camera, cameraOffsetX, cameraOffsetY); + if((basic != null) && basic.exists && basic.visible && basic.ignoreGlobalRender == false) { + basic.render(camera, cameraOffsetX, cameraOffsetY, forceRender); } } }; @@ -7508,6 +7552,7 @@ var Phaser; this._onFileLoad = onFileLoadCallback; if(this._keys.length > 0) { this._progressChunk = 100 / this._keys.length; + console.log('prog chunk', this._progressChunk); this.loadFile(); } else { this.progress = 1; @@ -7647,8 +7692,10 @@ var Phaser; */ function (previousKey, success) { this.progress = Math.round(this.progress + this._progressChunk); - if(this.progress > 1) { - this.progress = 1; + //this.progress = this.progress + this._progressChunk; + console.log('progress', this.progress); + if(this.progress > 100) { + this.progress = 100; } if(this._onFileLoad) { this._onFileLoad.call(this._game.callbackContext, this.progress, previousKey, success); @@ -9889,12 +9936,12 @@ var Phaser; World.prototype.createGroup = /** * Create a new object container. * - * @param [MaxSize] {number} capacity of this group. + * @param [maxSize] {number} capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.group.add(new Phaser.Group(this._game, MaxSize)); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.group.add(new Phaser.Group(this._game, maxSize)); }; World.prototype.createScrollZone = /** * Create a new ScrollZone object with image key, position and size. @@ -10995,16 +11042,18 @@ var Phaser; * @param {Any} event */ function (event) { - console.log('duration', this.duration); + this.timeUp = this._game.time.now; if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { this._game.input.onUp.dispatch(this); // Was it a tap? if(this.duration >= 0 && this.duration <= this._game.input.tapRate) { - // Yes, let's dispatch the signal - this._game.input.onTap.dispatch(this); // Was it a double-tap? if(this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) { - this._game.input.onDoubleTap.dispatch(this); + // Yes, let's dispatch the signal then with the 2nd parameter set to true + this._game.input.onTap.dispatch(this, true); + } else { + // Wasn't a double-tap, so dispatch a single tap signal + this._game.input.onTap.dispatch(this, false); } this.previousTapTime = this.timeUp; } @@ -11013,7 +11062,6 @@ var Phaser; this.withinGame = false; this.isDown = false; this.isUp = true; - this.timeUp = this._game.time.now; if(this.isMouse == false) { this._game.input.currentPointers--; } @@ -11308,7 +11356,7 @@ var Phaser; * @property doubleTapRate * @type {Number} **/ - this.doubleTapRate = 250; + this.doubleTapRate = 300; /** * The number of milliseconds that the Pointer has to be pressed down for it to fire a onHold event * @property holdRate @@ -11368,7 +11416,6 @@ var Phaser; this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; } @@ -11440,7 +11487,6 @@ var Phaser; this.onDown = new Phaser.Signal(); this.onUp = new Phaser.Signal(); this.onTap = new Phaser.Signal(); - this.onDoubleTap = new Phaser.Signal(); this.onHold = new Phaser.Signal(); this.currentPointers = 0; }; @@ -12210,17 +12256,17 @@ var Phaser; * Creates a new Emitter object at a specific position. * Does NOT automatically generate or attach particles! * - * @param X {number} The X position of the emitter. - * @param Y {number} The Y position of the emitter. - * @param [Size] {number} specifies a maximum capacity for this emitter. + * @param x {number} The X position of the emitter. + * @param y {number} The Y position of the emitter. + * @param [size] {number} Specifies a maximum capacity for this emitter. */ - function Emitter(game, X, Y, Size) { - if (typeof X === "undefined") { X = 0; } - if (typeof Y === "undefined") { Y = 0; } - if (typeof Size === "undefined") { Size = 0; } - _super.call(this, game, Size); - this.x = X; - this.y = Y; + function Emitter(game, x, y, size) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof size === "undefined") { size = 0; } + _super.call(this, game, size); + this.x = x; + this.y = y; this.width = 0; this.height = 0; this.minParticleSpeed = new Phaser.MicroPoint(-100, -100); @@ -12699,8 +12745,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.y - camera.worldView.y); @@ -12720,9 +12766,9 @@ var 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.rotate(this.angle * (Math.PI / 180)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2) - this.origin.x, this._dy + (this._dh / 2) - this.origin.y); + this.context.rotate(this.angle * (Math.PI / 180)); this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); } @@ -12733,45 +12779,45 @@ 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.lineWidth = this.lineWidth; - this._game.stage.context.strokeStyle = this.lineColor; - this._game.stage.context.fillStyle = this.fillColor; + //this.context.fillStyle = 'rgba(255,0,0,0.5)'; + //this.context.fillRect(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height); + this.context.lineWidth = this.lineWidth; + this.context.strokeStyle = this.lineColor; + this.context.fillStyle = this.fillColor; if(this._game.stage.fillStyle !== this.fillColor) { } // Primitive Renderer if(this.type == GeomSprite.CIRCLE) { - this._game.stage.context.beginPath(); - this._game.stage.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.arc(this._dx, this._dy, this.circle.radius, 0, Math.PI * 2); + this.context.stroke(); if(this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } else if(this.type == GeomSprite.LINE) { - this._game.stage.context.beginPath(); - this._game.stage.context.moveTo(this._dx, this._dy); - this._game.stage.context.lineTo(this.line.x2, this.line.y2); - this._game.stage.context.stroke(); - this._game.stage.context.closePath(); + this.context.beginPath(); + this.context.moveTo(this._dx, this._dy); + this.context.lineTo(this.line.x2, this.line.y2); + this.context.stroke(); + this.context.closePath(); } else if(this.type == GeomSprite.POINT) { - this._game.stage.context.fillRect(this._dx, this._dy, 2, 2); + this.context.fillRect(this._dx, this._dy, 2, 2); } else if(this.type == GeomSprite.RECTANGLE) { // We can use the faster fillRect if we don't need the outline if(this.renderOutline == false) { - this._game.stage.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.fillRect(this._dx, this._dy, this.rect.width, this.rect.height); } else { - this._game.stage.context.beginPath(); - this._game.stage.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); - this._game.stage.context.stroke(); + this.context.beginPath(); + this.context.rect(this._dx, this._dy, this.rect.width, this.rect.height); + this.context.stroke(); if(this.renderFill) { - this._game.stage.context.fill(); + this.context.fill(); } - this._game.stage.context.closePath(); + this.context.closePath(); } // And now the edge points - this._game.stage.context.fillStyle = 'rgb(255,255,255)'; + this.context.fillStyle = 'rgb(255,255,255)'; //this.renderPoint(this.rect.topLeft, this._dx, this._dy, 2); //this.renderPoint(this.rect.topCenter, this._dx, this._dy, 2); //this.renderPoint(this.rect.topRight, this._dx, this._dy, 2); @@ -12793,11 +12839,11 @@ var Phaser; } this._game.stage.restoreCanvasValues(); if(this.rotation !== 0) { - this._game.stage.context.translate(0, 0); - this._game.stage.context.restore(); + this.context.translate(0, 0); + this.context.restore(); } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -12812,7 +12858,7 @@ var Phaser; if (typeof offsetX === "undefined") { offsetX = 0; } if (typeof offsetY === "undefined") { offsetY = 0; } if (typeof size === "undefined") { size = 1; } - this._game.stage.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); + this.context.fillRect(offsetX + point.x, offsetY + point.y, size, size); }; GeomSprite.prototype.renderDebugInfo = /** * Render debug infos. (this method does not work now) @@ -12822,11 +12868,11 @@ var Phaser; */ function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - //this._game.stage.context.fillStyle = color; - //this._game.stage.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); - //this._game.stage.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); - //this._game.stage.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); - //this._game.stage.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); + //this.context.fillStyle = color; + //this.context.fillText('Sprite: ' + this.name + ' (' + this.bounds.width + ' x ' + this.bounds.height + ')', x, y); + //this.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' rotation: ' + this.angle.toFixed(1), x, y + 14); + //this.context.fillText('dx: ' + this._dx.toFixed(1) + ' dy: ' + this._dy.toFixed(1) + ' dw: ' + this._dw.toFixed(1) + ' dh: ' + this._dh.toFixed(1), x, y + 28); + //this.context.fillText('sx: ' + this._sx.toFixed(1) + ' sy: ' + this._sy.toFixed(1) + ' sw: ' + this._sw.toFixed(1) + ' sh: ' + this._sh.toFixed(1), x, y + 42); }; GeomSprite.prototype.collide = /** * Gives a basic boolean response to a geometric collision. @@ -13061,6 +13107,8 @@ var Phaser; this.tileHeight = tileHeight; this.boundsInTiles = new Phaser.Rectangle(); //this.scrollFactor = new MicroPoint(1, 1); + this.canvas = game.stage.canvas; + this.context = game.stage.context; this.mapData = []; this._tempTileBlock = []; this._texture = this._game.cache.getImage(key); @@ -13336,11 +13384,11 @@ var Phaser; }; TilemapLayer.prototype.renderDebugInfo = function (x, y, color) { if (typeof color === "undefined") { color = 'rgb(255,255,255)'; } - this._game.stage.context.fillStyle = color; - this._game.stage.context.fillText('TilemapLayer: ' + this.name, x, y); - this._game.stage.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); - this._game.stage.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); - this._game.stage.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); + this.context.fillStyle = color; + this.context.fillText('TilemapLayer: ' + this.name, x, y); + this.context.fillText('startX: ' + this._startX + ' endX: ' + this._maxX, x, y + 14); + this.context.fillText('startY: ' + this._startY + ' endY: ' + this._maxY, x, y + 28); + this.context.fillText('dx: ' + this._dx + ' dy: ' + this._dy, x, y + 42); }; TilemapLayer.prototype.render = /** * Render this layer to a specific camera with offset to camera. @@ -13395,14 +13443,14 @@ var Phaser; */ // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } for(var row = this._startY; row < this._startY + this._maxY; row++) { this._columnData = this.mapData[row]; for(var tile = this._startX; tile < this._startX + this._maxX; tile++) { if(this._tileOffsets[this._columnData[tile]]) { - this._game.stage.context.drawImage(this._texture, // Source Image + this.context.drawImage(this._texture, // Source Image this._tileOffsets[this._columnData[tile]].x, // Source X (location within the source image) this._tileOffsets[this._columnData[tile]].y, // Source Y this.tileWidth, // Source Width @@ -13419,7 +13467,7 @@ var Phaser; this._ty += this.tileHeight; } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -14160,8 +14208,8 @@ var Phaser; } // Alpha if(this.alpha !== 1) { - var globalAlpha = this._game.stage.context.globalAlpha; - this._game.stage.context.globalAlpha = this.alpha; + var globalAlpha = this.context.globalAlpha; + this.context.globalAlpha = this.alpha; } this._dx = cameraOffsetX + (this.bounds.topLeft.x - camera.worldView.x); this._dy = cameraOffsetY + (this.bounds.topLeft.y - camera.worldView.y); @@ -14174,15 +14222,15 @@ var Phaser; } // Rotation - needs to work from origin point really, but for now from center if(this.angle !== 0 || this.flipped == true) { - this._game.stage.context.save(); - this._game.stage.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); + this.context.save(); + this.context.translate(this._dx + (this._dw / 2), this._dy + (this._dh / 2)); if(this.angle !== 0) { - this._game.stage.context.rotate(this.angle * (Math.PI / 180)); + this.context.rotate(this.angle * (Math.PI / 180)); } this._dx = -(this._dw / 2); this._dy = -(this._dh / 2); if(this.flipped == true) { - this._game.stage.context.scale(-1, 1); + this.context.scale(-1, 1); } } this._dx = Math.round(this._dx); @@ -14191,13 +14239,13 @@ var Phaser; this._dh = Math.round(this._dh); for(var i = 0; i < this.regions.length; i++) { if(this._dynamicTexture) { - this.regions[i].render(this._game.stage.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._dynamicTexture.canvas, this._dx, this._dy, this._dw, this._dh); } else { - this.regions[i].render(this._game.stage.context, this._texture, this._dx, this._dy, this._dw, this._dh); + this.regions[i].render(this.context, this._texture, this._dx, this._dy, this._dw, this._dh); } } if(globalAlpha > -1) { - this._game.stage.context.globalAlpha = globalAlpha; + this.context.globalAlpha = globalAlpha; } return true; }; @@ -14687,12 +14735,12 @@ var Phaser; Game.prototype.createGroup = /** * Create a new object container. * - * @param MaxSize {number} Optional, capacity of this group. + * @param maxSize {number} Optional, capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.world.createGroup(MaxSize); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.world.createGroup(maxSize); }; Game.prototype.createParticle = /** * Create a new Particle. @@ -15039,12 +15087,12 @@ var Phaser; State.prototype.createGroup = /** * Create a new object container. * - * @param MaxSize {number} [optional] capacity of this group. + * @param maxSize {number} [optional] capacity of this group. * @returns {Group} The newly created group. */ - function (MaxSize) { - if (typeof MaxSize === "undefined") { MaxSize = 0; } - return this.game.world.createGroup(MaxSize); + function (maxSize) { + if (typeof maxSize === "undefined") { maxSize = 0; } + return this.game.world.createGroup(maxSize); }; State.prototype.createParticle = /** * Create a new Particle.