From b20a6ff85afba96dc63051d10df944d7dfa20330 Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Sat, 1 Jun 2013 01:30:36 +0100 Subject: [PATCH] Working my way through putting all the Tests back in and fixing issues as I go. --- Phaser/core/Group.ts | 11 +- Phaser/gameobjects/IGameObject.ts | 2 +- Phaser/gameobjects/ScrollZone.ts | 1 - Phaser/gameobjects/Sprite.ts | 13 +-- Phaser/physics/Body.ts | 5 +- Phaser/renderers/CanvasRenderer.ts | 55 +++++++++- Phaser/renderers/HeadlessRenderer.ts | 3 + Phaser/renderers/IRenderer.ts | 1 + Phaser/utils/SpriteUtils.ts | 53 ++++----- README.md | 2 + Tests/Tests.csproj | 8 ++ Tests/particles/graphic emitter.js | 4 +- Tests/particles/graphic emitter.ts | 4 +- Tests/particles/mousetrail.js | 29 +++++ Tests/particles/mousetrail.ts | 46 ++++++++ Tests/phaser.js | 139 +++++++++++------------ Tests/scrollzones/blasteroids.js | 99 +++++++++++++++++ Tests/scrollzones/blasteroids.ts | 158 +++++++++++++++++++++++++++ Tests/sprites/create sprite 1.js | 2 + Tests/sprites/create sprite 1.ts | 4 + build/phaser.d.ts | 38 ++++--- build/phaser.js | 139 +++++++++++------------ 22 files changed, 602 insertions(+), 214 deletions(-) create mode 100644 Tests/particles/mousetrail.js create mode 100644 Tests/particles/mousetrail.ts create mode 100644 Tests/scrollzones/blasteroids.js create mode 100644 Tests/scrollzones/blasteroids.ts diff --git a/Phaser/core/Group.ts b/Phaser/core/Group.ts index 58576798..45c85dd6 100644 --- a/Phaser/core/Group.ts +++ b/Phaser/core/Group.ts @@ -174,7 +174,7 @@ module Phaser { * Calls render on all members of this Group who have a status of visible=true and exists=true * You can also call Object.render directly, which will bypass the visible/exists check. */ - public render(renderer:IRenderer, camera: Camera) { + public render(camera: Camera) { if (camera.isHidden(this) == true) { @@ -201,17 +201,13 @@ module Phaser { if (this._member != null && this._member.exists && this._member.visible && camera.isHidden(this._member) == false) { - //this._member.render.call(renderer, camera, this._member); - // call = context first, then parameters if (this._member.type == Types.GROUP) { - //console.log('group rend'); - this._member.render.call(this._member, renderer, camera, this._member); - //this._member.render.call(this, renderer, camera, this._member); + this._member.render(camera); } else { - this._member.render.call(renderer, camera, this._member); + this.game.renderer.renderGameObject(this._member); } } } @@ -225,6 +221,7 @@ module Phaser { { this.game.stage.context.restore(); } + } /** diff --git a/Phaser/gameobjects/IGameObject.ts b/Phaser/gameobjects/IGameObject.ts index 01e2ceca..bd86c5e5 100644 --- a/Phaser/gameobjects/IGameObject.ts +++ b/Phaser/gameobjects/IGameObject.ts @@ -32,7 +32,7 @@ module Phaser { /** * Reference to the Renderer.renderSprite method. Can be overriden by custom classes. */ - render; + //render; /** * Controls if both update and render are called by the core game loop. diff --git a/Phaser/gameobjects/ScrollZone.ts b/Phaser/gameobjects/ScrollZone.ts index 16152d0f..6b1c1e07 100644 --- a/Phaser/gameobjects/ScrollZone.ts +++ b/Phaser/gameobjects/ScrollZone.ts @@ -31,7 +31,6 @@ module Phaser { super(game, x, y, key); this.type = Phaser.Types.SCROLLZONE; - this.render = game.renderer.renderScrollZone; this.regions = []; diff --git a/Phaser/gameobjects/Sprite.ts b/Phaser/gameobjects/Sprite.ts index 83cb55d3..e06601b0 100644 --- a/Phaser/gameobjects/Sprite.ts +++ b/Phaser/gameobjects/Sprite.ts @@ -27,7 +27,6 @@ module Phaser { this.game = game; this.type = Phaser.Types.SPRITE; - this.render = game.renderer.renderSprite; this.exists = true; this.active = true; @@ -42,6 +41,9 @@ module Phaser { this.y = y; this.z = 0; // not used yet + // If a texture has been given the body will be set to that size, otherwise 16x16 + this.body = new Phaser.Physics.Body(this, bodyType); + this.animations = new Phaser.Components.AnimationManager(this); this.texture = new Phaser.Components.Texture(this, key); this.cameraBlacklist = []; @@ -50,10 +52,6 @@ module Phaser { this.origin = new Phaser.Vec2(0, 0); this.scale = new Phaser.Vec2(1, 1); this.skew = new Phaser.Vec2(0, 0); - - // If a texture has been given the body will be set to that size, otherwise 16x16 - this.body = new Phaser.Physics.Body(this, bodyType); - } /** @@ -66,11 +64,6 @@ module Phaser { */ public type: number; - /** - * Reference to the Renderer.renderSprite method. Can be overriden by custom classes. - */ - public render; - /** * Controls if both update and render are called by the core game loop. */ diff --git a/Phaser/physics/Body.ts b/Phaser/physics/Body.ts index e57fcb55..8e72f85d 100644 --- a/Phaser/physics/Body.ts +++ b/Phaser/physics/Body.ts @@ -270,9 +270,10 @@ module Phaser.Physics { this.parent.texture.context.fillStyle = color; this.parent.texture.context.fillText('Sprite: (' + this.parent.frameBounds.width + ' x ' + this.parent.frameBounds.height + ')', x, y); //this.parent.texture.context.fillText('x: ' + this._parent.frameBounds.x.toFixed(1) + ' y: ' + this._parent.frameBounds.y.toFixed(1) + ' rotation: ' + this._parent.rotation.toFixed(1), x, y + 14); - this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(1), x, y + 14); + this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(0), x, y + 14); this.parent.texture.context.fillText('vx: ' + this.velocity.x.toFixed(1) + ' vy: ' + this.velocity.y.toFixed(1), x, y + 28); - this.parent.texture.context.fillText('ax: ' + this.acceleration.x.toFixed(1) + ' ay: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('acx: ' + this.acceleration.x.toFixed(1) + ' acy: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('angVx: ' + this.angularVelocity.toFixed(1) + ' angAc: ' + this.angularAcceleration.toFixed(1), x, y + 56); } diff --git a/Phaser/renderers/CanvasRenderer.ts b/Phaser/renderers/CanvasRenderer.ts index ae96be96..51f9bece 100644 --- a/Phaser/renderers/CanvasRenderer.ts +++ b/Phaser/renderers/CanvasRenderer.ts @@ -36,12 +36,18 @@ module Phaser { private _camera: Camera; private _groupLength: number; + private _count: number; + + public renderTotal: number; + public render() { // Get a list of all the active cameras this._cameraList = this._game.world.getAllCameras(); + this._count = 0; + // Then iterate through world.group on them all (where not blacklisted, etc) for (var c = 0; c < this._cameraList.length; c++) { @@ -49,11 +55,48 @@ module Phaser { this._camera.preRender(); - this._game.world.group.render(this, this._camera); + this._game.world.group.render(this._camera); this._camera.postRender(); } + this.renderTotal = this._count; + + } + + public renderGameObject(object) { + + if (object.type == Types.SPRITE) + { + this.renderSprite(this._camera, object); + } + else if (object.type == Types.SCROLLZONE) + { + this.renderScrollZone(this._camera, object); + } + + } + + /** + * Check whether this object is visible in a specific camera rectangle. + * @param camera {Rectangle} The rectangle you want to check. + * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. + */ + public inCamera(camera: Camera, sprite: Sprite): bool { + + // Object fixed in place regardless of the camera scrolling? Then it's always visible + if (sprite.scrollFactor.x == 0 && sprite.scrollFactor.y == 0) + { + return true; + } + + this._dx = sprite.frameBounds.x - camera.worldView.x; + this._dy = sprite.frameBounds.y - camera.worldView.y; + this._dw = sprite.frameBounds.width * sprite.scale.x; + this._dh = sprite.frameBounds.height * sprite.scale.y; + + return (camera.worldView.right > this._dx) && (camera.worldView.x < this._dx + this._dw) && (camera.worldView.bottom > this._dy) && (camera.worldView.y < this._dy + this._dh); + } /** @@ -63,12 +106,13 @@ module Phaser { */ public renderSprite(camera: Camera, sprite: Sprite): bool { - // Render checks (needs inCamera check added) - if (sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1) + if (sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1 || this.inCamera(camera, sprite) == false) { return false; } + this._count++; + // Reset our temp vars this._ga = -1; this._sx = 0; @@ -193,12 +237,13 @@ module Phaser { public renderScrollZone(camera: Camera, scrollZone: ScrollZone): bool { - // Render checks (needs inCamera check added) - if (scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1) + if (scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1 || this.inCamera(camera, scrollZone) == false) { return false; } + this._count++; + // Reset our temp vars this._ga = -1; this._sx = 0; diff --git a/Phaser/renderers/HeadlessRenderer.ts b/Phaser/renderers/HeadlessRenderer.ts index d6c7ef9d..86a48b92 100644 --- a/Phaser/renderers/HeadlessRenderer.ts +++ b/Phaser/renderers/HeadlessRenderer.ts @@ -17,6 +17,9 @@ module Phaser { public render() {} + public renderGameObject(object) { + } + public renderSprite(camera: Camera, sprite: Sprite): bool { return true; } diff --git a/Phaser/renderers/IRenderer.ts b/Phaser/renderers/IRenderer.ts index b6e60eb6..af0ab3bb 100644 --- a/Phaser/renderers/IRenderer.ts +++ b/Phaser/renderers/IRenderer.ts @@ -5,6 +5,7 @@ module Phaser { export interface IRenderer { render(); + renderGameObject(object); renderSprite(camera: Camera, sprite: Sprite): bool; renderScrollZone(camera: Camera, sprite: ScrollZone): bool; diff --git a/Phaser/utils/SpriteUtils.ts b/Phaser/utils/SpriteUtils.ts index c9237efb..5aa0f128 100644 --- a/Phaser/utils/SpriteUtils.ts +++ b/Phaser/utils/SpriteUtils.ts @@ -3,6 +3,7 @@ /// /// /// +/// /** * Phaser - SpriteUtils @@ -154,28 +155,27 @@ module Phaser { * * @return Whether or not the point overlaps this object. */ - /* - static overlapsPoint(point: Point, inScreenSpace: bool = false, camera: Camera = null): bool { + static overlapsPoint(sprite: Sprite, point: Point, inScreenSpace: bool = false, camera: Camera = null): bool { if (!inScreenSpace) { - return (point.x > this.x) && (point.x < this.x + this.width) && (point.y > this.y) && (point.y < this.y + this.height); + return Phaser.RectangleUtils.containsPoint(sprite.body.bounds, point); + //return (point.x > sprite.x) && (point.x < sprite.x + sprite.width) && (point.y > sprite.y) && (point.y < sprite.y + sprite.height); } if (camera == null) { - camera = this._game.camera; + camera = sprite.game.camera; } - var X: number = point.x - camera.scroll.x; - var Y: number = point.y - camera.scroll.y; + //var x: number = point.x - camera.scroll.x; + //var y: number = point.y - camera.scroll.y; - this.getScreenXY(this._point, camera); + //this.getScreenXY(this._point, camera); - return (X > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); + //return (x > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); } - */ /** * Check and see if this object is currently on screen. @@ -240,28 +240,6 @@ module Phaser { } */ - /** - * Check whether this object is visible in a specific camera rectangle. - * @param camera {Rectangle} The rectangle you want to check. - * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. - */ - static inCamera(camera: Rectangle, cameraOffsetX: number, cameraOffsetY: number): bool { - - // Object fixed in place regardless of the camera scrolling? Then it's always visible - if (this.scrollFactor.x == 0 && this.scrollFactor.y == 0) - { - return true; - } - - this._dx = (this.frameBounds.x - camera.x); - this._dy = (this.frameBounds.y - camera.y); - this._dw = this.frameBounds.width * this.scale.x; - this._dh = this.frameBounds.height * this.scale.y; - - return (camera.right > this._dx) && (camera.x < this._dx + this._dw) && (camera.bottom > this._dy) && (camera.y < this._dy + this._dh); - - } - /** * Handy for reviving game objects. * Resets their existence flags and position. @@ -283,6 +261,19 @@ module Phaser { } + static setOriginToCenter(sprite: Sprite, fromFrameBounds: bool = true, fromBody?: bool = false) { + + if (fromFrameBounds) + { + sprite.origin.setTo(sprite.frameBounds.halfWidth, sprite.frameBounds.halfHeight); + } + else if (fromBody) + { + sprite.origin.setTo(sprite.body.bounds.halfWidth, sprite.body.bounds.halfHeight); + } + + } + /** * Set the world bounds that this GameObject can exist within. By default a GameObject can exist anywhere * in the world. But by setting the bounds (which are given in world dimensions, not screen dimensions) diff --git a/README.md b/README.md index 7409c5b0..7c9025bb 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ V1.0.0 * Removed Sprite.rotation - use Sprite.angle instead * Optimised separateX/Y and overlap so they don't use any temporary vars any more. * Added the new Physics.Body object to all Sprites. Used for all physics calculations in-game. Will be extended for Fixtures/Joints in future. +* Added SpriteUtils.setOriginToCenter to quickly set the origin of a sprite based on either frameBounds or body.bounds + V0.9.6 diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index fe6fc110..32501693 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -71,6 +71,10 @@ graphic emitter.ts + + + mousetrail.ts + multiple streams.ts @@ -97,6 +101,10 @@ ballscroller.ts + + + blasteroids.ts + parallax.ts diff --git a/Tests/particles/graphic emitter.js b/Tests/particles/graphic emitter.js index b86f9bd3..ae89a8fc 100644 --- a/Tests/particles/graphic emitter.js +++ b/Tests/particles/graphic emitter.js @@ -8,7 +8,7 @@ } function create() { emitter = game.add.emitter(game.stage.centerX, game.stage.centerY); - emitter.makeParticles('jet', 50, false, 0); - emitter.start(false, 10, 0.1); + emitter.makeParticles('jet', 100, false, 0); + emitter.start(false, 20, 0.1); } })(); diff --git a/Tests/particles/graphic emitter.ts b/Tests/particles/graphic emitter.ts index 705e0dfd..1f35f41d 100644 --- a/Tests/particles/graphic emitter.ts +++ b/Tests/particles/graphic emitter.ts @@ -17,8 +17,8 @@ function create() { emitter = game.add.emitter(game.stage.centerX, game.stage.centerY); - emitter.makeParticles('jet', 50, false, 0); - emitter.start(false, 10, 0.1); + emitter.makeParticles('jet', 100, false, 0); + emitter.start(false, 20, 0.1); } diff --git a/Tests/particles/mousetrail.js b/Tests/particles/mousetrail.js new file mode 100644 index 00000000..fd7738b0 --- /dev/null +++ b/Tests/particles/mousetrail.js @@ -0,0 +1,29 @@ +/// +(function () { + var game = new Phaser.Game(this, 'game', 800, 600, init, create, update); + var emitter; + function init() { + game.loader.addImageFile('jet', 'assets/sprites/particle1.png'); + game.loader.addImageFile('starfield', 'assets/misc/starfield.jpg'); + game.loader.load(); + } + var scroller; + var emitter; + function create() { + scroller = game.add.scrollZone('starfield', 0, 0, 1024, 1024); + scroller.setSpeed(0, -1); + emitter = game.add.emitter(game.stage.centerX, game.stage.centerY); + emitter.makeParticles('jet', 200); + emitter.globalCompositeOperation = 'lighter'; + emitter.gravity = 300; + emitter.setXSpeed(-50, 50); + emitter.setYSpeed(-50, -100); + emitter.setRotation(0, 0); + emitter.start(false, 50, 0.02); + } + function update() { + emitter.x = game.input.x; + emitter.y = game.input.y; + //emitter.em + } +})(); diff --git a/Tests/particles/mousetrail.ts b/Tests/particles/mousetrail.ts new file mode 100644 index 00000000..eae2a213 --- /dev/null +++ b/Tests/particles/mousetrail.ts @@ -0,0 +1,46 @@ +/// + +(function () { + + var game = new Phaser.Game(this, 'game', 800, 600, init, create, update); + + var emitter: Phaser.Emitter; + + function init() { + + game.loader.addImageFile('jet', 'assets/sprites/particle1.png'); + game.loader.addImageFile('starfield', 'assets/misc/starfield.jpg'); + game.loader.load(); + + } + + var scroller: Phaser.ScrollZone; + var emitter: Phaser.Emitter; + + function create() { + + scroller = game.add.scrollZone('starfield', 0, 0, 1024, 1024); + scroller.setSpeed(0, -1); + + emitter = game.add.emitter(game.stage.centerX, game.stage.centerY); + emitter.makeParticles('jet', 200); + + emitter.globalCompositeOperation = 'lighter'; + + emitter.gravity = 300; + emitter.setXSpeed(-50, 50); + emitter.setYSpeed(-50, -100); + emitter.setRotation(0, 0); + emitter.start(false, 50, 0.02); + + } + + function update() { + + emitter.x = game.input.x; + emitter.y = game.input.y; + //emitter.em + + } + +})(); diff --git a/Tests/phaser.js b/Tests/phaser.js index fc768976..6fb5dc32 100644 --- a/Tests/phaser.js +++ b/Tests/phaser.js @@ -1337,7 +1337,7 @@ var Phaser; * Calls render on all members of this Group who have a status of visible=true and exists=true * You can also call Object.render directly, which will bypass the visible/exists check. */ - function (renderer, camera) { + function (camera) { if(camera.isHidden(this) == true) { return; } @@ -1353,14 +1353,10 @@ var Phaser; while(this._i < this.length) { this._member = this.members[this._i++]; if(this._member != null && this._member.exists && this._member.visible && camera.isHidden(this._member) == false) { - //this._member.render.call(renderer, camera, this._member); - // call = context first, then parameters if(this._member.type == Phaser.Types.GROUP) { - //console.log('group rend'); - this._member.render.call(this._member, renderer, camera, this._member); - //this._member.render.call(this, renderer, camera, this._member); - } else { - this._member.render.call(renderer, camera, this._member); + this._member.render(camera); + } else { + this.game.renderer.renderGameObject(this._member); } } } @@ -5053,6 +5049,7 @@ var Phaser; /// /// /// +/// /** * Phaser - SpriteUtils * @@ -5074,7 +5071,7 @@ var Phaser; out.push(new Phaser.Point(sprite.x, sprite.y + sprite.height)); return out; }; - SpriteUtils.onScreen = /** + SpriteUtils.overlapsPoint = /** * Checks to see if some GameObject overlaps this GameObject or Group. * If the group has a LOT of things in it, it might be faster to use Collision.overlaps(). * WARNING: Currently tilemaps do NOT support screen space overlap checks! @@ -5190,29 +5187,22 @@ var Phaser; * * @return Whether or not the point overlaps this object. */ - /* - static overlapsPoint(point: Point, inScreenSpace: bool = false, camera: Camera = null): bool { - - if (!inScreenSpace) - { - return (point.x > this.x) && (point.x < this.x + this.width) && (point.y > this.y) && (point.y < this.y + this.height); - } - - if (camera == null) - { - camera = this._game.camera; - } - - var X: number = point.x - camera.scroll.x; - var Y: number = point.y - camera.scroll.y; - - this.getScreenXY(this._point, camera); - - return (X > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); - - } - */ - /** + function overlapsPoint(sprite, point, inScreenSpace, camera) { + if (typeof inScreenSpace === "undefined") { inScreenSpace = false; } + if (typeof camera === "undefined") { camera = null; } + if(!inScreenSpace) { + return Phaser.RectangleUtils.containsPoint(sprite.body.bounds, point); + //return (point.x > sprite.x) && (point.x < sprite.x + sprite.width) && (point.y > sprite.y) && (point.y < sprite.y + sprite.height); + } + if(camera == null) { + camera = sprite.game.camera; + } + //var x: number = point.x - camera.scroll.x; + //var y: number = point.y - camera.scroll.y; + //this.getScreenXY(this._point, camera); + //return (x > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); + }; + SpriteUtils.onScreen = /** * Check and see if this object is currently on screen. * * @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera. @@ -5250,7 +5240,7 @@ var Phaser; point.y += (point.y > 0) ? 0.0000001 : -0.0000001; return point; }; - SpriteUtils.inCamera = /** + SpriteUtils.reset = /** * 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 @@ -5264,22 +5254,6 @@ var Phaser; } */ /** - * Check whether this object is visible in a specific camera rectangle. - * @param camera {Rectangle} The rectangle you want to check. - * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. - */ - function inCamera(camera, cameraOffsetX, cameraOffsetY) { - // Object fixed in place regardless of the camera scrolling? Then it's always visible - if(this.scrollFactor.x == 0 && this.scrollFactor.y == 0) { - return true; - } - this._dx = (this.frameBounds.x - camera.x); - this._dy = (this.frameBounds.y - camera.y); - this._dw = this.frameBounds.width * this.scale.x; - this._dh = this.frameBounds.height * this.scale.y; - return (camera.right > this._dx) && (camera.x < this._dx + this._dw) && (camera.bottom > this._dy) && (camera.y < this._dy + this._dh); - }; - SpriteUtils.reset = /** * Handy for reviving game objects. * Resets their existence flags and position. * @@ -5297,6 +5271,15 @@ var Phaser; sprite.body.position.x = x; sprite.body.position.y = y; }; + SpriteUtils.setOriginToCenter = function setOriginToCenter(sprite, fromFrameBounds, fromBody) { + if (typeof fromFrameBounds === "undefined") { fromFrameBounds = true; } + if (typeof fromBody === "undefined") { fromBody = false; } + if(fromFrameBounds) { + sprite.origin.setTo(sprite.frameBounds.halfWidth, sprite.frameBounds.halfHeight); + } else if(fromBody) { + sprite.origin.setTo(sprite.body.bounds.halfWidth, sprite.body.bounds.halfHeight); + } + }; SpriteUtils.setBounds = /** * Set the world bounds that this GameObject can exist within. By default a GameObject can exist anywhere * in the world. But by setting the bounds (which are given in world dimensions, not screen dimensions) @@ -5968,9 +5951,10 @@ var Phaser; this.parent.texture.context.fillStyle = color; this.parent.texture.context.fillText('Sprite: (' + this.parent.frameBounds.width + ' x ' + this.parent.frameBounds.height + ')', x, y); //this.parent.texture.context.fillText('x: ' + this._parent.frameBounds.x.toFixed(1) + ' y: ' + this._parent.frameBounds.y.toFixed(1) + ' rotation: ' + this._parent.rotation.toFixed(1), x, y + 14); - this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(1), x, y + 14); + this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(0), x, y + 14); this.parent.texture.context.fillText('vx: ' + this.velocity.x.toFixed(1) + ' vy: ' + this.velocity.y.toFixed(1), x, y + 28); - this.parent.texture.context.fillText('ax: ' + this.acceleration.x.toFixed(1) + ' ay: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('acx: ' + this.acceleration.x.toFixed(1) + ' acy: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('angVx: ' + this.angularVelocity.toFixed(1) + ' angAc: ' + this.angularAcceleration.toFixed(1), x, y + 56); }; return Body; })(); @@ -6030,7 +6014,6 @@ var Phaser; this.angleOffset = 0; this.game = game; this.type = Phaser.Types.SPRITE; - this.render = game.renderer.renderSprite; this.exists = true; this.active = true; this.visible = true; @@ -6042,6 +6025,8 @@ var Phaser; this.y = y; this.z = 0// not used yet ; + // If a texture has been given the body will be set to that size, otherwise 16x16 + this.body = new Phaser.Physics.Body(this, bodyType); this.animations = new Phaser.Components.AnimationManager(this); this.texture = new Phaser.Components.Texture(this, key); this.cameraBlacklist = []; @@ -6049,8 +6034,6 @@ var Phaser; this.origin = new Phaser.Vec2(0, 0); this.scale = new Phaser.Vec2(1, 1); this.skew = new Phaser.Vec2(0, 0); - // If a texture has been given the body will be set to that size, otherwise 16x16 - this.body = new Phaser.Physics.Body(this, bodyType); } Object.defineProperty(Sprite.prototype, "angle", { get: /** @@ -7627,7 +7610,6 @@ var Phaser; * You can override this to add custom behavior like a sound or AI or something. */ function () { - console.log('particle emitted', this.width, this.height); }; return Particle; })(Phaser.Sprite); @@ -7731,13 +7713,6 @@ var Phaser; if(multiple) { /* randomFrame = this.game.math.random()*totalFrames; - if(BakedRotations > 0) - particle.loadRotatedGraphic(Graphics,BakedRotations,randomFrame); - else - { - particle.loadGraphic(Graphics,true); - particle.frame = randomFrame; - } */ } else { if(graphics) { @@ -7753,7 +7728,7 @@ var Phaser; particle.body.allowCollisions = Phaser.Types.NONE; } particle.exists = false; - // Center it + // Center the origin for rotation assistance particle.origin.setTo(particle.body.bounds.halfWidth, particle.body.bounds.halfHeight); this.add(particle); i++; @@ -8108,7 +8083,6 @@ var Phaser; if (typeof height === "undefined") { height = 0; } _super.call(this, game, x, y, key); this.type = Phaser.Types.SCROLLZONE; - this.render = game.renderer.renderScrollZone; this.regions = []; if(this.texture.loaded) { if(width > this.width || height > this.height) { @@ -14278,6 +14252,8 @@ var Phaser; } HeadlessRenderer.prototype.render = function () { }; + HeadlessRenderer.prototype.renderGameObject = function (object) { + }; HeadlessRenderer.prototype.renderSprite = function (camera, sprite) { return true; }; @@ -14316,13 +14292,38 @@ var Phaser; CanvasRenderer.prototype.render = function () { // Get a list of all the active cameras this._cameraList = this._game.world.getAllCameras(); + this._count = 0; // Then iterate through world.group on them all (where not blacklisted, etc) for(var c = 0; c < this._cameraList.length; c++) { this._camera = this._cameraList[c]; this._camera.preRender(); - this._game.world.group.render(this, this._camera); + this._game.world.group.render(this._camera); this._camera.postRender(); } + this.renderTotal = this._count; + }; + CanvasRenderer.prototype.renderGameObject = function (object) { + if(object.type == Phaser.Types.SPRITE) { + this.renderSprite(this._camera, object); + } else if(object.type == Phaser.Types.SCROLLZONE) { + this.renderScrollZone(this._camera, object); + } + }; + CanvasRenderer.prototype.inCamera = /** + * Check whether this object is visible in a specific camera rectangle. + * @param camera {Rectangle} The rectangle you want to check. + * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. + */ + function (camera, sprite) { + // Object fixed in place regardless of the camera scrolling? Then it's always visible + if(sprite.scrollFactor.x == 0 && sprite.scrollFactor.y == 0) { + return true; + } + this._dx = sprite.frameBounds.x - camera.worldView.x; + this._dy = sprite.frameBounds.y - camera.worldView.y; + this._dw = sprite.frameBounds.width * sprite.scale.x; + this._dh = sprite.frameBounds.height * sprite.scale.y; + return (camera.worldView.right > this._dx) && (camera.worldView.x < this._dx + this._dw) && (camera.worldView.bottom > this._dy) && (camera.worldView.y < this._dy + this._dh); }; CanvasRenderer.prototype.renderSprite = /** * Render this sprite to specific camera. Called by game loop after update(). @@ -14330,10 +14331,10 @@ var Phaser; * @return {boolean} Return false if not rendered, otherwise return true. */ function (camera, sprite) { - // Render checks (needs inCamera check added) - if(sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1) { + if(sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1 || this.inCamera(camera, sprite) == false) { return false; } + this._count++; // Reset our temp vars this._ga = -1; this._sx = 0; @@ -14425,10 +14426,10 @@ var Phaser; return true; }; CanvasRenderer.prototype.renderScrollZone = function (camera, scrollZone) { - // Render checks (needs inCamera check added) - if(scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1) { + if(scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1 || this.inCamera(camera, scrollZone) == false) { return false; } + this._count++; // Reset our temp vars this._ga = -1; this._sx = 0; diff --git a/Tests/scrollzones/blasteroids.js b/Tests/scrollzones/blasteroids.js new file mode 100644 index 00000000..9ca845d8 --- /dev/null +++ b/Tests/scrollzones/blasteroids.js @@ -0,0 +1,99 @@ +/// +/// +(function () { + var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render); + function init() { + game.loader.addImageFile('nashwan', 'assets/sprites/xenon2_ship.png'); + game.loader.addImageFile('starfield', 'assets/misc/starfield.jpg'); + game.loader.addImageFile('jet', 'assets/sprites/particle1.png'); + game.loader.addImageFile('bullet', 'assets/misc/bullet1.png'); + game.loader.load(); + } + var scroller; + var emitter; + var ship; + var bullets; + var speed = 0; + var fireRate = 0; + var shipMotion; + function create() { + scroller = game.add.scrollZone('starfield', 0, 0, 1024, 1024); + emitter = game.add.emitter(game.stage.centerX + 16, game.stage.centerY + 12); + emitter.makeParticles('jet', 250, false, 0); + emitter.setRotation(0, 0); + // Looks like a smoke trail! + //emitter.globalCompositeOperation = 'xor'; + // Looks way cool :) + emitter.globalCompositeOperation = 'lighter'; + bullets = game.add.group(50); + // Create our bullet pool + for(var i = 0; i < 50; i++) { + var tempBullet = new Phaser.Sprite(game, game.stage.centerX, game.stage.centerY, 'bullet'); + tempBullet.exists = false; + tempBullet.angleOffset = 90; + //tempBullet.setBounds(-100, -100, 900, 700); + //tempBullet.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; + bullets.add(tempBullet); + } + ship = game.add.sprite(game.stage.centerX, game.stage.centerY, 'nashwan', Phaser.Types.BODY_DYNAMIC); + Phaser.SpriteUtils.setOriginToCenter(ship); + // We do this because the ship was drawn facing up, but 0 degrees is pointing to the right + ship.angleOffset = 90; + game.input.onDown.add(test, this); + } + function test(event) { + game.stage.scale.startFullScreen(); + } + function update() { + ship.body.angularVelocity = 0; + if(game.input.keyboard.isDown(Phaser.Keyboard.LEFT)) { + ship.body.angularVelocity = -200; + } else if(game.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) { + ship.body.angularVelocity = 200; + } + if(game.input.keyboard.isDown(Phaser.Keyboard.UP)) { + speed += 0.1; + if(speed > 10) { + speed = 10; + } + } else { + speed -= 0.1; + if(speed < 0) { + speed = 0; + } + } + shipMotion = game.motion.velocityFromAngle(ship.angle, speed); + scroller.setSpeed(shipMotion.x, shipMotion.y); + // emit particles + if(speed > 2) { + // We use the opposite of the motion because the jets emit out the back of the ship + // The 20 and 30 values just keep them nice and fast + emitter.setXSpeed(-(shipMotion.x * 20), -(shipMotion.x * 30)); + emitter.setYSpeed(-(shipMotion.y * 20), -(shipMotion.y * 30)); + emitter.emitParticle(); + } + if(game.input.keyboard.isDown(Phaser.Keyboard.SPACEBAR)) { + fire(); + } + } + function render() { + ship.body.renderDebugInfo(32, 32); + } + function recycleBullet(bullet) { + if(bullet.exists && bullet.x < -40 || bullet.x > 840 || bullet.y < -40 || bullet.y > 640) { + bullet.exists = false; + } + } + function fire() { + if(game.time.now > fireRate) { + var b = bullets.getFirstAvailable(); + b.x = ship.x; + b.y = ship.y - 26; + var bulletMotion = game.motion.velocityFromAngle(ship.angle, 400); + b.revive(); + b.angle = ship.angle; + b.body.velocity.setTo(bulletMotion.x, bulletMotion.y); + fireRate = game.time.now + 100; + } + } +})(); diff --git a/Tests/scrollzones/blasteroids.ts b/Tests/scrollzones/blasteroids.ts new file mode 100644 index 00000000..e2e199c8 --- /dev/null +++ b/Tests/scrollzones/blasteroids.ts @@ -0,0 +1,158 @@ +/// +/// + +(function () { + + var game = new Phaser.Game(this, 'game', 800, 600, init, create, update, render); + + function init() { + + game.loader.addImageFile('nashwan', 'assets/sprites/xenon2_ship.png'); + game.loader.addImageFile('starfield', 'assets/misc/starfield.jpg'); + game.loader.addImageFile('jet', 'assets/sprites/particle1.png'); + game.loader.addImageFile('bullet', 'assets/misc/bullet1.png'); + + game.loader.load(); + + } + + var scroller: Phaser.ScrollZone; + var emitter: Phaser.Emitter; + var ship: Phaser.Sprite; + var bullets: Phaser.Group; + + var speed: number = 0; + var fireRate: number = 0; + var shipMotion: Phaser.Point; + + function create() { + + scroller = game.add.scrollZone('starfield', 0, 0, 1024, 1024); + + emitter = game.add.emitter(game.stage.centerX + 16, game.stage.centerY + 12); + emitter.makeParticles('jet', 250, false, 0); + emitter.setRotation(0, 0); + + // Looks like a smoke trail! + //emitter.globalCompositeOperation = 'xor'; + + // Looks way cool :) + emitter.globalCompositeOperation = 'lighter'; + + bullets = game.add.group(50); + + // Create our bullet pool + for (var i = 0; i < 50; i++) + { + var tempBullet = new Phaser.Sprite(game, game.stage.centerX, game.stage.centerY, 'bullet'); + tempBullet.exists = false; + tempBullet.angleOffset = 90; + //tempBullet.setBounds(-100, -100, 900, 700); + //tempBullet.outOfBoundsAction = Phaser.GameObject.OUT_OF_BOUNDS_KILL; + bullets.add(tempBullet); + } + + ship = game.add.sprite(game.stage.centerX, game.stage.centerY, 'nashwan', Phaser.Types.BODY_DYNAMIC); + Phaser.SpriteUtils.setOriginToCenter(ship); + + // We do this because the ship was drawn facing up, but 0 degrees is pointing to the right + ship.angleOffset = 90; + + game.input.onDown.add(test, this); + + } + + function test(event) { + + game.stage.scale.startFullScreen(); + + } + + function update() { + + ship.body.angularVelocity = 0; + + if (game.input.keyboard.isDown(Phaser.Keyboard.LEFT)) + { + ship.body.angularVelocity = -200; + } + else if (game.input.keyboard.isDown(Phaser.Keyboard.RIGHT)) + { + ship.body.angularVelocity = 200; + } + + if (game.input.keyboard.isDown(Phaser.Keyboard.UP)) + { + speed += 0.1; + + if (speed > 10) + { + speed = 10; + } + } + else + { + speed -= 0.1; + + if (speed < 0) { + speed = 0; + } + } + + shipMotion = game.motion.velocityFromAngle(ship.angle, speed); + + scroller.setSpeed(shipMotion.x, shipMotion.y); + + // emit particles + if (speed > 2) + { + // We use the opposite of the motion because the jets emit out the back of the ship + // The 20 and 30 values just keep them nice and fast + emitter.setXSpeed(-(shipMotion.x * 20), -(shipMotion.x * 30)); + emitter.setYSpeed(-(shipMotion.y * 20), -(shipMotion.y * 30)); + emitter.emitParticle(); + } + + if (game.input.keyboard.isDown(Phaser.Keyboard.SPACEBAR)) + { + fire(); + } + + } + + function render() { + + ship.body.renderDebugInfo(32, 32); + + } + + function recycleBullet(bullet:Phaser.Sprite) { + + if (bullet.exists && bullet.x < -40 || bullet.x > 840 || bullet.y < -40 || bullet.y > 640) + { + bullet.exists = false; + } + + } + + function fire() { + + if (game.time.now > fireRate) + { + var b:Phaser.Sprite = bullets.getFirstAvailable(); + + b.x = ship.x; + b.y = ship.y - 26; + + var bulletMotion = game.motion.velocityFromAngle(ship.angle, 400); + + b.revive(); + b.angle = ship.angle; + b.body.velocity.setTo(bulletMotion.x, bulletMotion.y); + + fireRate = game.time.now + 100; + } + + } + +})(); diff --git a/Tests/sprites/create sprite 1.js b/Tests/sprites/create sprite 1.js index 20145d1a..06892ec1 100644 --- a/Tests/sprites/create sprite 1.js +++ b/Tests/sprites/create sprite 1.js @@ -2,11 +2,13 @@ (function () { var game = new Phaser.Game(this, 'game', 800, 600, init, create); function init() { + console.log('>>>>>>>>>>>>>>>>>>>>>>>> init'); // Using Phasers asset loader we load up a PNG from the assets folder game.loader.addImageFile('bunny', 'assets/sprites/bunny.png'); game.loader.load(); } function create() { + console.log('>>>>>>>>>>>>>>>>>>>>>>>> create'); // This will create a Sprite positioned at the top-left of the game (0,0) // Try changing the 0, 0 values game.add.sprite(0, 0, 'bunny'); diff --git a/Tests/sprites/create sprite 1.ts b/Tests/sprites/create sprite 1.ts index d1725201..d654ba7e 100644 --- a/Tests/sprites/create sprite 1.ts +++ b/Tests/sprites/create sprite 1.ts @@ -6,6 +6,8 @@ function init() { + console.log('>>>>>>>>>>>>>>>>>>>>>>>> init'); + // Using Phasers asset loader we load up a PNG from the assets folder game.loader.addImageFile('bunny', 'assets/sprites/bunny.png'); game.loader.load(); @@ -14,6 +16,8 @@ function create() { + console.log('>>>>>>>>>>>>>>>>>>>>>>>> create'); + // This will create a Sprite positioned at the top-left of the game (0,0) // Try changing the 0, 0 values game.add.sprite(0, 0, 'bunny'); diff --git a/build/phaser.d.ts b/build/phaser.d.ts index 32a5f43c..23071e25 100644 --- a/build/phaser.d.ts +++ b/build/phaser.d.ts @@ -248,10 +248,6 @@ module Phaser { */ type: number; /** - * Reference to the Renderer.renderSprite method. Can be overriden by custom classes. - */ - render; - /** * Controls if both update and render are called by the core game loop. */ exists: bool; @@ -975,7 +971,7 @@ module Phaser { * Calls render on all members of this Group who have a status of visible=true and exists=true * You can also call Object.render directly, which will bypass the visible/exists check. */ - public render(renderer: IRenderer, camera: Camera): void; + public render(camera: Camera): void; /** * The maximum capacity of this group. Default is 0, meaning no max capacity, and the group can just grow. */ @@ -3050,6 +3046,16 @@ module Phaser { static _tempPoint: Point; static getAsPoints(sprite: Sprite): Point[]; /** + * Checks to see if a point in 2D world space overlaps this GameObject. + * + * @param point {Point} The point in world space you want to check. + * @param inScreenSpace {boolean} Whether to take scroll factors into account when checking for overlap. + * @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera. + * + * @return Whether or not the point overlaps this object. + */ + static overlapsPoint(sprite: Sprite, point: Point, inScreenSpace?: bool, camera?: Camera): bool; + /** * Check and see if this object is currently on screen. * * @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera. @@ -3067,12 +3073,6 @@ module Phaser { */ static getScreenXY(sprite: Sprite, point?: Point, camera?: Camera): Point; /** - * Check whether this object is visible in a specific camera rectangle. - * @param camera {Rectangle} The rectangle you want to check. - * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. - */ - static inCamera(camera: Rectangle, cameraOffsetX: number, cameraOffsetY: number): bool; - /** * Handy for reviving game objects. * Resets their existence flags and position. * @@ -3080,6 +3080,7 @@ module Phaser { * @param y {number} The new Y position of this object. */ static reset(sprite: Sprite, x: number, y: number): void; + static setOriginToCenter(sprite: Sprite, fromFrameBounds?: bool, fromBody?: bool): void; /** * Set the world bounds that this GameObject can exist within. By default a GameObject can exist anywhere * in the world. But by setting the bounds (which are given in world dimensions, not screen dimensions) @@ -3468,10 +3469,6 @@ module Phaser { */ public type: number; /** - * Reference to the Renderer.renderSprite method. Can be overriden by custom classes. - */ - public render; - /** * Controls if both update and render are called by the core game loop. */ public exists: bool; @@ -7727,6 +7724,7 @@ module Phaser { module Phaser { interface IRenderer { render(); + renderGameObject(object); renderSprite(camera: Camera, sprite: Sprite): bool; renderScrollZone(camera: Camera, sprite: ScrollZone): bool; } @@ -7739,6 +7737,7 @@ module Phaser { */ private _game; public render(): void; + public renderGameObject(object): void; public renderSprite(camera: Camera, sprite: Sprite): bool; public renderScrollZone(camera: Camera, scrollZone: ScrollZone): bool; } @@ -7766,7 +7765,16 @@ module Phaser { private _cameraList; private _camera; private _groupLength; + private _count; + public renderTotal: number; public render(): void; + public renderGameObject(object): void; + /** + * Check whether this object is visible in a specific camera rectangle. + * @param camera {Rectangle} The rectangle you want to check. + * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. + */ + public inCamera(camera: Camera, sprite: Sprite): bool; /** * Render this sprite to specific camera. Called by game loop after update(). * @param camera {Camera} Camera this sprite will be rendered to. diff --git a/build/phaser.js b/build/phaser.js index fc768976..6fb5dc32 100644 --- a/build/phaser.js +++ b/build/phaser.js @@ -1337,7 +1337,7 @@ var Phaser; * Calls render on all members of this Group who have a status of visible=true and exists=true * You can also call Object.render directly, which will bypass the visible/exists check. */ - function (renderer, camera) { + function (camera) { if(camera.isHidden(this) == true) { return; } @@ -1353,14 +1353,10 @@ var Phaser; while(this._i < this.length) { this._member = this.members[this._i++]; if(this._member != null && this._member.exists && this._member.visible && camera.isHidden(this._member) == false) { - //this._member.render.call(renderer, camera, this._member); - // call = context first, then parameters if(this._member.type == Phaser.Types.GROUP) { - //console.log('group rend'); - this._member.render.call(this._member, renderer, camera, this._member); - //this._member.render.call(this, renderer, camera, this._member); - } else { - this._member.render.call(renderer, camera, this._member); + this._member.render(camera); + } else { + this.game.renderer.renderGameObject(this._member); } } } @@ -5053,6 +5049,7 @@ var Phaser; /// /// /// +/// /** * Phaser - SpriteUtils * @@ -5074,7 +5071,7 @@ var Phaser; out.push(new Phaser.Point(sprite.x, sprite.y + sprite.height)); return out; }; - SpriteUtils.onScreen = /** + SpriteUtils.overlapsPoint = /** * Checks to see if some GameObject overlaps this GameObject or Group. * If the group has a LOT of things in it, it might be faster to use Collision.overlaps(). * WARNING: Currently tilemaps do NOT support screen space overlap checks! @@ -5190,29 +5187,22 @@ var Phaser; * * @return Whether or not the point overlaps this object. */ - /* - static overlapsPoint(point: Point, inScreenSpace: bool = false, camera: Camera = null): bool { - - if (!inScreenSpace) - { - return (point.x > this.x) && (point.x < this.x + this.width) && (point.y > this.y) && (point.y < this.y + this.height); - } - - if (camera == null) - { - camera = this._game.camera; - } - - var X: number = point.x - camera.scroll.x; - var Y: number = point.y - camera.scroll.y; - - this.getScreenXY(this._point, camera); - - return (X > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); - - } - */ - /** + function overlapsPoint(sprite, point, inScreenSpace, camera) { + if (typeof inScreenSpace === "undefined") { inScreenSpace = false; } + if (typeof camera === "undefined") { camera = null; } + if(!inScreenSpace) { + return Phaser.RectangleUtils.containsPoint(sprite.body.bounds, point); + //return (point.x > sprite.x) && (point.x < sprite.x + sprite.width) && (point.y > sprite.y) && (point.y < sprite.y + sprite.height); + } + if(camera == null) { + camera = sprite.game.camera; + } + //var x: number = point.x - camera.scroll.x; + //var y: number = point.y - camera.scroll.y; + //this.getScreenXY(this._point, camera); + //return (x > this._point.x) && (X < this._point.x + this.width) && (Y > this._point.y) && (Y < this._point.y + this.height); + }; + SpriteUtils.onScreen = /** * Check and see if this object is currently on screen. * * @param camera {Camera} Specify which game camera you want. If null getScreenXY() will just grab the first global camera. @@ -5250,7 +5240,7 @@ var Phaser; point.y += (point.y > 0) ? 0.0000001 : -0.0000001; return point; }; - SpriteUtils.inCamera = /** + SpriteUtils.reset = /** * 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 @@ -5264,22 +5254,6 @@ var Phaser; } */ /** - * Check whether this object is visible in a specific camera rectangle. - * @param camera {Rectangle} The rectangle you want to check. - * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. - */ - function inCamera(camera, cameraOffsetX, cameraOffsetY) { - // Object fixed in place regardless of the camera scrolling? Then it's always visible - if(this.scrollFactor.x == 0 && this.scrollFactor.y == 0) { - return true; - } - this._dx = (this.frameBounds.x - camera.x); - this._dy = (this.frameBounds.y - camera.y); - this._dw = this.frameBounds.width * this.scale.x; - this._dh = this.frameBounds.height * this.scale.y; - return (camera.right > this._dx) && (camera.x < this._dx + this._dw) && (camera.bottom > this._dy) && (camera.y < this._dy + this._dh); - }; - SpriteUtils.reset = /** * Handy for reviving game objects. * Resets their existence flags and position. * @@ -5297,6 +5271,15 @@ var Phaser; sprite.body.position.x = x; sprite.body.position.y = y; }; + SpriteUtils.setOriginToCenter = function setOriginToCenter(sprite, fromFrameBounds, fromBody) { + if (typeof fromFrameBounds === "undefined") { fromFrameBounds = true; } + if (typeof fromBody === "undefined") { fromBody = false; } + if(fromFrameBounds) { + sprite.origin.setTo(sprite.frameBounds.halfWidth, sprite.frameBounds.halfHeight); + } else if(fromBody) { + sprite.origin.setTo(sprite.body.bounds.halfWidth, sprite.body.bounds.halfHeight); + } + }; SpriteUtils.setBounds = /** * Set the world bounds that this GameObject can exist within. By default a GameObject can exist anywhere * in the world. But by setting the bounds (which are given in world dimensions, not screen dimensions) @@ -5968,9 +5951,10 @@ var Phaser; this.parent.texture.context.fillStyle = color; this.parent.texture.context.fillText('Sprite: (' + this.parent.frameBounds.width + ' x ' + this.parent.frameBounds.height + ')', x, y); //this.parent.texture.context.fillText('x: ' + this._parent.frameBounds.x.toFixed(1) + ' y: ' + this._parent.frameBounds.y.toFixed(1) + ' rotation: ' + this._parent.rotation.toFixed(1), x, y + 14); - this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(1), x, y + 14); + this.parent.texture.context.fillText('x: ' + this.bounds.x.toFixed(1) + ' y: ' + this.bounds.y.toFixed(1) + ' angle: ' + this.angle.toFixed(0), x, y + 14); this.parent.texture.context.fillText('vx: ' + this.velocity.x.toFixed(1) + ' vy: ' + this.velocity.y.toFixed(1), x, y + 28); - this.parent.texture.context.fillText('ax: ' + this.acceleration.x.toFixed(1) + ' ay: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('acx: ' + this.acceleration.x.toFixed(1) + ' acy: ' + this.acceleration.y.toFixed(1), x, y + 42); + this.parent.texture.context.fillText('angVx: ' + this.angularVelocity.toFixed(1) + ' angAc: ' + this.angularAcceleration.toFixed(1), x, y + 56); }; return Body; })(); @@ -6030,7 +6014,6 @@ var Phaser; this.angleOffset = 0; this.game = game; this.type = Phaser.Types.SPRITE; - this.render = game.renderer.renderSprite; this.exists = true; this.active = true; this.visible = true; @@ -6042,6 +6025,8 @@ var Phaser; this.y = y; this.z = 0// not used yet ; + // If a texture has been given the body will be set to that size, otherwise 16x16 + this.body = new Phaser.Physics.Body(this, bodyType); this.animations = new Phaser.Components.AnimationManager(this); this.texture = new Phaser.Components.Texture(this, key); this.cameraBlacklist = []; @@ -6049,8 +6034,6 @@ var Phaser; this.origin = new Phaser.Vec2(0, 0); this.scale = new Phaser.Vec2(1, 1); this.skew = new Phaser.Vec2(0, 0); - // If a texture has been given the body will be set to that size, otherwise 16x16 - this.body = new Phaser.Physics.Body(this, bodyType); } Object.defineProperty(Sprite.prototype, "angle", { get: /** @@ -7627,7 +7610,6 @@ var Phaser; * You can override this to add custom behavior like a sound or AI or something. */ function () { - console.log('particle emitted', this.width, this.height); }; return Particle; })(Phaser.Sprite); @@ -7731,13 +7713,6 @@ var Phaser; if(multiple) { /* randomFrame = this.game.math.random()*totalFrames; - if(BakedRotations > 0) - particle.loadRotatedGraphic(Graphics,BakedRotations,randomFrame); - else - { - particle.loadGraphic(Graphics,true); - particle.frame = randomFrame; - } */ } else { if(graphics) { @@ -7753,7 +7728,7 @@ var Phaser; particle.body.allowCollisions = Phaser.Types.NONE; } particle.exists = false; - // Center it + // Center the origin for rotation assistance particle.origin.setTo(particle.body.bounds.halfWidth, particle.body.bounds.halfHeight); this.add(particle); i++; @@ -8108,7 +8083,6 @@ var Phaser; if (typeof height === "undefined") { height = 0; } _super.call(this, game, x, y, key); this.type = Phaser.Types.SCROLLZONE; - this.render = game.renderer.renderScrollZone; this.regions = []; if(this.texture.loaded) { if(width > this.width || height > this.height) { @@ -14278,6 +14252,8 @@ var Phaser; } HeadlessRenderer.prototype.render = function () { }; + HeadlessRenderer.prototype.renderGameObject = function (object) { + }; HeadlessRenderer.prototype.renderSprite = function (camera, sprite) { return true; }; @@ -14316,13 +14292,38 @@ var Phaser; CanvasRenderer.prototype.render = function () { // Get a list of all the active cameras this._cameraList = this._game.world.getAllCameras(); + this._count = 0; // Then iterate through world.group on them all (where not blacklisted, etc) for(var c = 0; c < this._cameraList.length; c++) { this._camera = this._cameraList[c]; this._camera.preRender(); - this._game.world.group.render(this, this._camera); + this._game.world.group.render(this._camera); this._camera.postRender(); } + this.renderTotal = this._count; + }; + CanvasRenderer.prototype.renderGameObject = function (object) { + if(object.type == Phaser.Types.SPRITE) { + this.renderSprite(this._camera, object); + } else if(object.type == Phaser.Types.SCROLLZONE) { + this.renderScrollZone(this._camera, object); + } + }; + CanvasRenderer.prototype.inCamera = /** + * Check whether this object is visible in a specific camera rectangle. + * @param camera {Rectangle} The rectangle you want to check. + * @return {boolean} Return true if bounds of this sprite intersects the given rectangle, otherwise return false. + */ + function (camera, sprite) { + // Object fixed in place regardless of the camera scrolling? Then it's always visible + if(sprite.scrollFactor.x == 0 && sprite.scrollFactor.y == 0) { + return true; + } + this._dx = sprite.frameBounds.x - camera.worldView.x; + this._dy = sprite.frameBounds.y - camera.worldView.y; + this._dw = sprite.frameBounds.width * sprite.scale.x; + this._dh = sprite.frameBounds.height * sprite.scale.y; + return (camera.worldView.right > this._dx) && (camera.worldView.x < this._dx + this._dw) && (camera.worldView.bottom > this._dy) && (camera.worldView.y < this._dy + this._dh); }; CanvasRenderer.prototype.renderSprite = /** * Render this sprite to specific camera. Called by game loop after update(). @@ -14330,10 +14331,10 @@ var Phaser; * @return {boolean} Return false if not rendered, otherwise return true. */ function (camera, sprite) { - // Render checks (needs inCamera check added) - if(sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1) { + if(sprite.scale.x == 0 || sprite.scale.y == 0 || sprite.texture.alpha < 0.1 || this.inCamera(camera, sprite) == false) { return false; } + this._count++; // Reset our temp vars this._ga = -1; this._sx = 0; @@ -14425,10 +14426,10 @@ var Phaser; return true; }; CanvasRenderer.prototype.renderScrollZone = function (camera, scrollZone) { - // Render checks (needs inCamera check added) - if(scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1) { + if(scrollZone.scale.x == 0 || scrollZone.scale.y == 0 || scrollZone.texture.alpha < 0.1 || this.inCamera(camera, scrollZone) == false) { return false; } + this._count++; // Reset our temp vars this._ga = -1; this._sx = 0;