From d55cc215eecb91d21bdfac9d71048bcdc8e4e991 Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Tue, 4 Oct 2016 00:58:52 +0100 Subject: [PATCH] Moving more rendering functionality over. --- src/gameobjects/Image.js | 2 +- .../canvas/gameobjects/SpriteBatch.js | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/renderer/canvas/gameobjects/SpriteBatch.js diff --git a/src/gameobjects/Image.js b/src/gameobjects/Image.js index 1a6f9e630..596c0c1eb 100644 --- a/src/gameobjects/Image.js +++ b/src/gameobjects/Image.js @@ -82,7 +82,7 @@ Phaser.Image.prototype.preUpdateCore = Phaser.Component.Core.preUpdate; * @method Phaser.Image#preUpdate * @memberof Phaser.Image */ -Phaser.Image.prototype.preUpdate = function() { +Phaser.Image.prototype.preUpdate = function () { if (!this.preUpdateInWorld()) { diff --git a/src/renderer/canvas/gameobjects/SpriteBatch.js b/src/renderer/canvas/gameobjects/SpriteBatch.js new file mode 100644 index 000000000..dd85d8b0a --- /dev/null +++ b/src/renderer/canvas/gameobjects/SpriteBatch.js @@ -0,0 +1,97 @@ +/** +* Note that 'this' in all functions here refer to the owning object. +* For example the Group, Stage, Sprite, etc. because the render function +* here is mapped to the prototype for the game object. +*/ +Phaser.Renderer.Canvas.GameObjects.Container = { + + render: function (renderer) + { + if (!this.visible || this.alpha <= 0 || !this.children.length) + { + return; + } + + var context = renderer.context; + + context.globalAlpha = this.worldAlpha; + + this.displayObjectUpdateTransform(); + + var transform = this.worldTransform; + + var isRotated = true; + + for (var i = 0; i < this.children.length; i++) + { + var child = this.children[i]; + + if (!child.visible) + { + continue; + } + + var texture = child.texture; + var frame = texture.frame; + + context.globalAlpha = this.worldAlpha * child.alpha; + + if (child.rotation % Phaser.Math.PI2 === 0) + { + // If rotation === 0 we can avoid setTransform + + if (isRotated) + { + context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty); + isRotated = false; + } + + context.drawImage( + texture.baseTexture.source, + frame.x, + frame.y, + frame.width, + frame.height, + ((child.anchor.x) * (-frame.width * child.scale.x) + child.position.x + 0.5 + renderSession.shakeX) | 0, + ((child.anchor.y) * (-frame.height * child.scale.y) + child.position.y + 0.5 + renderSession.shakeY) | 0, + frame.width * child.scale.x, + frame.height * child.scale.y); + } + else + { + if (!isRotated) + { + isRotated = true; + } + + child.displayObjectUpdateTransform(); + + var childTransform = child.worldTransform; + var tx = (childTransform.tx * renderSession.resolution) + renderSession.shakeX; + var ty = (childTransform.ty * renderSession.resolution) + renderSession.shakeY; + + // allow for trimming + + if (renderer.roundPixels) + { + context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, tx | 0, ty | 0); + } + else + { + context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, tx, ty); + } + + context.drawImage( + texture.baseTexture.source, + frame.x, + frame.y, + frame.width, + frame.height, + ((child.anchor.x) * (-frame.width) + 0.5) | 0, + ((child.anchor.y) * (-frame.height) + 0.5) | 0, + frame.width, + frame.height); + } + } + } +};