From 00fb20f8c2411f230ba979332267fdbebd74f363 Mon Sep 17 00:00:00 2001 From: Richard Davey Date: Tue, 23 Apr 2013 19:24:16 +0100 Subject: [PATCH] And ScrollRegions work too :) --- Phaser/gameobjects/ScrollRegion.ts | 69 ++++++++++++--------- Phaser/gameobjects/ScrollZone.ts | 8 +++ Phaser/geom/Quad.ts | 11 ++++ Tests/Tests.csproj | 4 ++ Tests/assets/pics/game14_angel_dawn.png | Bin 42412 -> 48750 bytes Tests/phaser.js | 76 ++++++++++++++++-------- Tests/scrollzones/parallax.js | 19 +++--- Tests/scrollzones/parallax.ts | 21 ++++--- Tests/scrollzones/region demo.js | 22 +++++++ Tests/scrollzones/region demo.ts | 37 ++++++++++++ build/phaser.js | 76 ++++++++++++++++-------- 11 files changed, 244 insertions(+), 99 deletions(-) create mode 100644 Tests/scrollzones/region demo.js create mode 100644 Tests/scrollzones/region demo.ts diff --git a/Phaser/gameobjects/ScrollRegion.ts b/Phaser/gameobjects/ScrollRegion.ts index 97ff5404..4f8370f6 100644 --- a/Phaser/gameobjects/ScrollRegion.ts +++ b/Phaser/gameobjects/ScrollRegion.ts @@ -15,16 +15,13 @@ module Phaser { constructor(x: number, y: number, width: number, height: number, speedX:number, speedY:number) { // Our seamless scrolling quads - this._A = new Quad(0, 0, width, height); - this._B = new Quad(); - this._C = new Quad(); - this._D = new Quad(); - + this._A = new Quad(x, y, width, height); + this._B = new Quad(x, y, width, height); + this._C = new Quad(x, y, width, height); + this._D = new Quad(x, y, width, height); this._scroll = new MicroPoint(); - this._offset = new MicroPoint(x, y); - + this._bounds = new Quad(x, y, width, height); this.scrollSpeed = new MicroPoint(speedX, speedY); - this.bounds = new Quad(0, 0, width, height); } @@ -33,59 +30,58 @@ module Phaser { private _C: Quad; private _D: Quad; + private _bounds: Quad; private _scroll: MicroPoint; - private _offset: MicroPoint; private _anchorWidth: number = 0; private _anchorHeight: number = 0; private _inverseWidth: number = 0; private _inverseHeight: number = 0; - public bounds: Quad; public visible: bool = true; public scrollSpeed: MicroPoint; public update(delta: number) { - this._scroll.x = Math.round(this._scroll.x + (this.scrollSpeed.x)); - this._scroll.y = Math.round(this._scroll.y + (this.scrollSpeed.y)); + this._scroll.x += this.scrollSpeed.x; + this._scroll.y += this.scrollSpeed.y; - if (this._scroll.x > this._offset.x + this.bounds.width) + if (this._scroll.x > this._bounds.right) { - this._scroll.x = this._offset.x; + this._scroll.x = this._bounds.x; } - if (this._scroll.x < this._offset.x) + if (this._scroll.x < this._bounds.x) { - this._scroll.x = this._offset.x + this.bounds.width; + this._scroll.x = this._bounds.right; } - if (this._scroll.y > this._offset.y + this.bounds.height) + if (this._scroll.y > this._bounds.bottom) { - this._scroll.y = this._offset.y; + this._scroll.y = this._bounds.y; } - if (this._scroll.y < this._offset.y) + if (this._scroll.y < this._bounds.y) { - this._scroll.y = this._offset.y + this.bounds.height; + this._scroll.y = this._bounds.bottom; } // Anchor Dimensions - this._anchorWidth = this.bounds.width - this._scroll.x; - this._anchorHeight = this.bounds.height - this._scroll.y; + this._anchorWidth = (this._bounds.width - this._scroll.x) + this._bounds.x; + this._anchorHeight = (this._bounds.height - this._scroll.y) + this._bounds.y; - if (this._anchorWidth > this.bounds.width) + if (this._anchorWidth > this._bounds.width) { - this._anchorWidth = this.bounds.width; + this._anchorWidth = this._bounds.width; } - if (this._anchorHeight > this.bounds.height) + if (this._anchorHeight > this._bounds.height) { - this._anchorHeight = this.bounds.height; + this._anchorHeight = this._bounds.height; } - this._inverseWidth = this.bounds.width - this._anchorWidth; - this._inverseHeight = this.bounds.height - this._anchorHeight; + this._inverseWidth = this._bounds.width - this._anchorWidth; + this._inverseHeight = this._bounds.height - this._anchorHeight; // Quad A this._A.setTo(this._scroll.x, this._scroll.y, this._anchorWidth, this._anchorHeight); @@ -113,11 +109,21 @@ module Phaser { return; } + // dx/dy are the world coordinates to render the FULL ScrollZone into. + // This ScrollRegion may be smaller than that and offset from the dx/dy coordinates. + this.crop(context, texture, this._A.x, this._A.y, this._A.width, this._A.height, dx, dy, dw, dh, 0, 0); this.crop(context, texture, this._B.x, this._B.y, this._B.width, this._B.height, dx, dy, dw, dh, this._A.width, 0); this.crop(context, texture, this._C.x, this._C.y, this._C.width, this._C.height, dx, dy, dw, dh, 0, this._A.height); this.crop(context, texture, this._D.x, this._D.y, this._D.width, this._D.height, dx, dy, dw, dh, this._C.width, this._A.height); + //context.fillStyle = 'rgb(255,255,255)'; + //context.font = '18px Arial'; + //context.fillText('QuadA: ' + this._A.toString(), 32, 450); + //context.fillText('QuadB: ' + this._B.toString(), 32, 480); + //context.fillText('QuadC: ' + this._C.toString(), 32, 510); + //context.fillText('QuadD: ' + this._D.toString(), 32, 540); + } private crop(context, texture, srcX, srcY, srcW, srcH, destX, destY, destW, destH, offsetX, offsetY) { @@ -135,6 +141,13 @@ module Phaser { srcH = (destY + destH) - offsetY; } + srcX = Math.floor(srcX); + srcY = Math.floor(srcY); + srcW = Math.floor(srcW); + srcH = Math.floor(srcH); + offsetX = Math.floor(offsetX + this._bounds.x); + offsetY = Math.floor(offsetY + this._bounds.y); + if (srcW > 0 && srcH > 0) { context.drawImage(texture, srcX, srcY, srcW, srcH, offsetX, offsetY, srcW, srcH); diff --git a/Phaser/gameobjects/ScrollZone.ts b/Phaser/gameobjects/ScrollZone.ts index 7d4094ed..75921852 100644 --- a/Phaser/gameobjects/ScrollZone.ts +++ b/Phaser/gameobjects/ScrollZone.ts @@ -64,6 +64,12 @@ module Phaser { public addRegion(x: number, y: number, width: number, height: number, speedX?:number = 0, speedY?:number = 0):ScrollRegion { + if (x > this.width || y > this.height || x < 0 || y < 0 || (x + width) > this.width || (y + height) > this.height) + { + throw Error('Invalid ScrollRegion defined. Cannot be larger than parent ScrollZone'); + return; + } + this.currentRegion = new ScrollRegion(x, y, width, height, speedX, speedY); this.regions.push(this.currentRegion); @@ -79,6 +85,8 @@ module Phaser { this.currentRegion.scrollSpeed.setTo(x, y); } + return this; + } public update() { diff --git a/Phaser/geom/Quad.ts b/Phaser/geom/Quad.ts index 45e889a1..88adc41d 100644 --- a/Phaser/geom/Quad.ts +++ b/Phaser/geom/Quad.ts @@ -82,6 +82,17 @@ module Phaser { } + /** + * Returns a string representation of this object. + * @method toString + * @return {string} a string representation of the object. + **/ + public toString(): string { + + return "[{Quad (x=" + this.x + " y=" + this.y + " width=" + this.width + " height=" + this.height + ")}]"; + + } + } } \ No newline at end of file diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index f1fd2fdb..7b988313 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -111,6 +111,10 @@ parallax.ts + + + region demo.ts + scroll window.ts diff --git a/Tests/assets/pics/game14_angel_dawn.png b/Tests/assets/pics/game14_angel_dawn.png index 146cb9525d4dc8de11ea28bbc971b3828e07971c..3d91158a4902a678fe67e315b5d2bf1435550daa 100644 GIT binary patch delta 46406 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 this.right + t || q.right < this.left - t || q.top > this.bottom + t || q.bottom < this.top - t); }; + Quad.prototype.toString = /** + * Returns a string representation of this object. + * @method toString + * @return {string} a string representation of the object. + **/ + function () { + return "[{Quad (x=" + this.x + " y=" + this.y + " width=" + this.width + " height=" + this.height + ")}]"; + }; return Quad; })(); Phaser.Quad = Quad; @@ -11603,41 +11611,40 @@ var Phaser; this._inverseHeight = 0; this.visible = true; // Our seamless scrolling quads - this._A = new Phaser.Quad(0, 0, width, height); - this._B = new Phaser.Quad(); - this._C = new Phaser.Quad(); - this._D = new Phaser.Quad(); + this._A = new Phaser.Quad(x, y, width, height); + this._B = new Phaser.Quad(x, y, width, height); + this._C = new Phaser.Quad(x, y, width, height); + this._D = new Phaser.Quad(x, y, width, height); this._scroll = new Phaser.MicroPoint(); - this._offset = new Phaser.MicroPoint(x, y); + this._bounds = new Phaser.Quad(x, y, width, height); this.scrollSpeed = new Phaser.MicroPoint(speedX, speedY); - this.bounds = new Phaser.Quad(0, 0, width, height); } ScrollRegion.prototype.update = function (delta) { - this._scroll.x = Math.round(this._scroll.x + (this.scrollSpeed.x)); - this._scroll.y = Math.round(this._scroll.y + (this.scrollSpeed.y)); - if(this._scroll.x > this._offset.x + this.bounds.width) { - this._scroll.x = this._offset.x; + this._scroll.x += this.scrollSpeed.x; + this._scroll.y += this.scrollSpeed.y; + if(this._scroll.x > this._bounds.right) { + this._scroll.x = this._bounds.x; } - if(this._scroll.x < this._offset.x) { - this._scroll.x = this._offset.x + this.bounds.width; + if(this._scroll.x < this._bounds.x) { + this._scroll.x = this._bounds.right; } - if(this._scroll.y > this._offset.y + this.bounds.height) { - this._scroll.y = this._offset.y; + if(this._scroll.y > this._bounds.bottom) { + this._scroll.y = this._bounds.y; } - if(this._scroll.y < this._offset.y) { - this._scroll.y = this._offset.y + this.bounds.height; + if(this._scroll.y < this._bounds.y) { + this._scroll.y = this._bounds.bottom; } // Anchor Dimensions - this._anchorWidth = this.bounds.width - this._scroll.x; - this._anchorHeight = this.bounds.height - this._scroll.y; - if(this._anchorWidth > this.bounds.width) { - this._anchorWidth = this.bounds.width; + this._anchorWidth = (this._bounds.width - this._scroll.x) + this._bounds.x; + this._anchorHeight = (this._bounds.height - this._scroll.y) + this._bounds.y; + if(this._anchorWidth > this._bounds.width) { + this._anchorWidth = this._bounds.width; } - if(this._anchorHeight > this.bounds.height) { - this._anchorHeight = this.bounds.height; + if(this._anchorHeight > this._bounds.height) { + this._anchorHeight = this._bounds.height; } - this._inverseWidth = this.bounds.width - this._anchorWidth; - this._inverseHeight = this.bounds.height - this._anchorHeight; + this._inverseWidth = this._bounds.width - this._anchorWidth; + this._inverseHeight = this._bounds.height - this._anchorHeight; // Quad A this._A.setTo(this._scroll.x, this._scroll.y, this._anchorWidth, this._anchorHeight); // Quad B @@ -11656,11 +11663,19 @@ var Phaser; if(this.visible == false) { return; } + // dx/dy are the world coordinates to render the FULL ScrollZone into. + // This ScrollRegion may be smaller than that and offset from the dx/dy coordinates. this.crop(context, texture, this._A.x, this._A.y, this._A.width, this._A.height, dx, dy, dw, dh, 0, 0); this.crop(context, texture, this._B.x, this._B.y, this._B.width, this._B.height, dx, dy, dw, dh, this._A.width, 0); this.crop(context, texture, this._C.x, this._C.y, this._C.width, this._C.height, dx, dy, dw, dh, 0, this._A.height); this.crop(context, texture, this._D.x, this._D.y, this._D.width, this._D.height, dx, dy, dw, dh, this._C.width, this._A.height); - }; + //context.fillStyle = 'rgb(255,255,255)'; + //context.font = '18px Arial'; + //context.fillText('QuadA: ' + this._A.toString(), 32, 450); + //context.fillText('QuadB: ' + this._B.toString(), 32, 480); + //context.fillText('QuadC: ' + this._C.toString(), 32, 510); + //context.fillText('QuadD: ' + this._D.toString(), 32, 540); + }; ScrollRegion.prototype.crop = function (context, texture, srcX, srcY, srcW, srcH, destX, destY, destW, destH, offsetX, offsetY) { offsetX += destX; offsetY += destY; @@ -11670,6 +11685,12 @@ var Phaser; if(srcH > (destY + destH) - offsetY) { srcH = (destY + destH) - offsetY; } + srcX = Math.floor(srcX); + srcY = Math.floor(srcY); + srcW = Math.floor(srcW); + srcH = Math.floor(srcH); + offsetX = Math.floor(offsetX + this._bounds.x); + offsetY = Math.floor(offsetY + this._bounds.y); if(srcW > 0 && srcH > 0) { context.drawImage(texture, srcX, srcY, srcW, srcH, offsetX, offsetY, srcW, srcH); } @@ -11729,6 +11750,10 @@ var Phaser; ScrollZone.prototype.addRegion = function (x, y, width, height, speedX, speedY) { if (typeof speedX === "undefined") { speedX = 0; } if (typeof speedY === "undefined") { speedY = 0; } + if(x > this.width || y > this.height || x < 0 || y < 0 || (x + width) > this.width || (y + height) > this.height) { + throw Error('Invalid ScrollRegion defined. Cannot be larger than parent ScrollZone'); + return; + } this.currentRegion = new Phaser.ScrollRegion(x, y, width, height, speedX, speedY); this.regions.push(this.currentRegion); return this.currentRegion; @@ -11737,6 +11762,7 @@ var Phaser; if(this.currentRegion) { this.currentRegion.scrollSpeed.setTo(x, y); } + return this; }; ScrollZone.prototype.update = function () { for(var i = 0; i < this.regions.length; i++) { diff --git a/Tests/scrollzones/parallax.js b/Tests/scrollzones/parallax.js index 07862c27..454e7910 100644 --- a/Tests/scrollzones/parallax.js +++ b/Tests/scrollzones/parallax.js @@ -7,22 +7,21 @@ myGame.loader.load(); } function create() { - // In this example we're creating a whole bunch of ScrollZones working on the same image var zone = myGame.createScrollZone('starray'); - var y = 10; - var speed = 6; - speed -= 0.3; + zone.currentRegion.visible = false; + var y = 0; + var speed = 16; // The image consists of 10px high scrolling layers, this creates them quickly (top = fastest, getting slower as we move down) - for(var z = 0; z < 31; z++) { + for(var z = 0; z < 32; z++) { zone.addRegion(0, y, 640, 10, speed); - if(z <= 14) { - speed -= 0.3; + if(z <= 15) { + speed -= 1; } else { - speed += 0.3; + speed += 1; } - if(z == 14) { + if(z == 15) { y = 240; - speed += 0.3; + speed += 1; } else { y += 10; } diff --git a/Tests/scrollzones/parallax.ts b/Tests/scrollzones/parallax.ts index 2b3760f6..3e6b0edc 100644 --- a/Tests/scrollzones/parallax.ts +++ b/Tests/scrollzones/parallax.ts @@ -15,32 +15,31 @@ function create() { - // In this example we're creating a whole bunch of ScrollZones working on the same image var zone: Phaser.ScrollZone = myGame.createScrollZone('starray'); - var y:number = 10; - var speed:number = 6; - - speed -= 0.3; + zone.currentRegion.visible = false; + + var y:number = 0; + var speed:number = 16; // The image consists of 10px high scrolling layers, this creates them quickly (top = fastest, getting slower as we move down) - for (var z:number = 0; z < 31; z++) + for (var z:number = 0; z < 32; z++) { zone.addRegion(0, y, 640, 10, speed); - if (z <= 14) + if (z <= 15) { - speed -= 0.3; + speed -= 1; } else { - speed += 0.3; + speed += 1; } - if (z == 14) + if (z == 15) { y = 240; - speed += 0.3; + speed += 1; } else { diff --git a/Tests/scrollzones/region demo.js b/Tests/scrollzones/region demo.js new file mode 100644 index 00000000..67f73fcd --- /dev/null +++ b/Tests/scrollzones/region demo.js @@ -0,0 +1,22 @@ +/// +/// +(function () { + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); + function init() { + myGame.loader.addImageFile('angelDawn', 'assets/pics/game14_angel_dawn.png'); + myGame.loader.load(); + } + var scroller; + function create() { + // This creates our ScrollZone centered in the middle of the stage. + scroller = myGame.createScrollZone('angelDawn', myGame.stage.centerX - 320, 100); + // By default we won't scroll the full image, but we will create 3 ScrollRegions within it: + // This creates a ScrollRegion which can be thought of as a rectangle within the ScrollZone that can be scrolled + // independantly - this one scrolls the image of the spacemans head + scroller.addRegion(32, 32, 352, 240, 0, 2); + // The head in the top right + scroller.addRegion(480, 30, 96, 96, 4, 0); + // The small piece of text + scroller.addRegion(466, 160, 122, 14, 0, -0.5); + } +})(); diff --git a/Tests/scrollzones/region demo.ts b/Tests/scrollzones/region demo.ts new file mode 100644 index 00000000..a5f3e3d1 --- /dev/null +++ b/Tests/scrollzones/region demo.ts @@ -0,0 +1,37 @@ +/// +/// + +(function () { + + var myGame = new Phaser.Game(this, 'game', 800, 600, init, create); + + function init() { + + myGame.loader.addImageFile('angelDawn', 'assets/pics/game14_angel_dawn.png'); + + myGame.loader.load(); + + } + + var scroller: Phaser.ScrollZone; + + function create() { + + // This creates our ScrollZone centered in the middle of the stage. + scroller = myGame.createScrollZone('angelDawn', myGame.stage.centerX - 320, 100); + + // By default we won't scroll the full image, but we will create 3 ScrollRegions within it: + + // This creates a ScrollRegion which can be thought of as a rectangle within the ScrollZone that can be scrolled + // independantly - this one scrolls the image of the spacemans head + scroller.addRegion(32, 32, 352, 240, 0, 2); + + // The head in the top right + scroller.addRegion(480, 30, 96, 96, 4, 0); + + // The small piece of text + scroller.addRegion(466, 160, 122, 14, 0, -0.5); + + } + +})(); diff --git a/build/phaser.js b/build/phaser.js index 150af5fe..e31ef067 100644 --- a/build/phaser.js +++ b/build/phaser.js @@ -11581,6 +11581,14 @@ var Phaser; if (typeof t === "undefined") { t = 0; } return !(q.left > this.right + t || q.right < this.left - t || q.top > this.bottom + t || q.bottom < this.top - t); }; + Quad.prototype.toString = /** + * Returns a string representation of this object. + * @method toString + * @return {string} a string representation of the object. + **/ + function () { + return "[{Quad (x=" + this.x + " y=" + this.y + " width=" + this.width + " height=" + this.height + ")}]"; + }; return Quad; })(); Phaser.Quad = Quad; @@ -11603,41 +11611,40 @@ var Phaser; this._inverseHeight = 0; this.visible = true; // Our seamless scrolling quads - this._A = new Phaser.Quad(0, 0, width, height); - this._B = new Phaser.Quad(); - this._C = new Phaser.Quad(); - this._D = new Phaser.Quad(); + this._A = new Phaser.Quad(x, y, width, height); + this._B = new Phaser.Quad(x, y, width, height); + this._C = new Phaser.Quad(x, y, width, height); + this._D = new Phaser.Quad(x, y, width, height); this._scroll = new Phaser.MicroPoint(); - this._offset = new Phaser.MicroPoint(x, y); + this._bounds = new Phaser.Quad(x, y, width, height); this.scrollSpeed = new Phaser.MicroPoint(speedX, speedY); - this.bounds = new Phaser.Quad(0, 0, width, height); } ScrollRegion.prototype.update = function (delta) { - this._scroll.x = Math.round(this._scroll.x + (this.scrollSpeed.x)); - this._scroll.y = Math.round(this._scroll.y + (this.scrollSpeed.y)); - if(this._scroll.x > this._offset.x + this.bounds.width) { - this._scroll.x = this._offset.x; + this._scroll.x += this.scrollSpeed.x; + this._scroll.y += this.scrollSpeed.y; + if(this._scroll.x > this._bounds.right) { + this._scroll.x = this._bounds.x; } - if(this._scroll.x < this._offset.x) { - this._scroll.x = this._offset.x + this.bounds.width; + if(this._scroll.x < this._bounds.x) { + this._scroll.x = this._bounds.right; } - if(this._scroll.y > this._offset.y + this.bounds.height) { - this._scroll.y = this._offset.y; + if(this._scroll.y > this._bounds.bottom) { + this._scroll.y = this._bounds.y; } - if(this._scroll.y < this._offset.y) { - this._scroll.y = this._offset.y + this.bounds.height; + if(this._scroll.y < this._bounds.y) { + this._scroll.y = this._bounds.bottom; } // Anchor Dimensions - this._anchorWidth = this.bounds.width - this._scroll.x; - this._anchorHeight = this.bounds.height - this._scroll.y; - if(this._anchorWidth > this.bounds.width) { - this._anchorWidth = this.bounds.width; + this._anchorWidth = (this._bounds.width - this._scroll.x) + this._bounds.x; + this._anchorHeight = (this._bounds.height - this._scroll.y) + this._bounds.y; + if(this._anchorWidth > this._bounds.width) { + this._anchorWidth = this._bounds.width; } - if(this._anchorHeight > this.bounds.height) { - this._anchorHeight = this.bounds.height; + if(this._anchorHeight > this._bounds.height) { + this._anchorHeight = this._bounds.height; } - this._inverseWidth = this.bounds.width - this._anchorWidth; - this._inverseHeight = this.bounds.height - this._anchorHeight; + this._inverseWidth = this._bounds.width - this._anchorWidth; + this._inverseHeight = this._bounds.height - this._anchorHeight; // Quad A this._A.setTo(this._scroll.x, this._scroll.y, this._anchorWidth, this._anchorHeight); // Quad B @@ -11656,11 +11663,19 @@ var Phaser; if(this.visible == false) { return; } + // dx/dy are the world coordinates to render the FULL ScrollZone into. + // This ScrollRegion may be smaller than that and offset from the dx/dy coordinates. this.crop(context, texture, this._A.x, this._A.y, this._A.width, this._A.height, dx, dy, dw, dh, 0, 0); this.crop(context, texture, this._B.x, this._B.y, this._B.width, this._B.height, dx, dy, dw, dh, this._A.width, 0); this.crop(context, texture, this._C.x, this._C.y, this._C.width, this._C.height, dx, dy, dw, dh, 0, this._A.height); this.crop(context, texture, this._D.x, this._D.y, this._D.width, this._D.height, dx, dy, dw, dh, this._C.width, this._A.height); - }; + //context.fillStyle = 'rgb(255,255,255)'; + //context.font = '18px Arial'; + //context.fillText('QuadA: ' + this._A.toString(), 32, 450); + //context.fillText('QuadB: ' + this._B.toString(), 32, 480); + //context.fillText('QuadC: ' + this._C.toString(), 32, 510); + //context.fillText('QuadD: ' + this._D.toString(), 32, 540); + }; ScrollRegion.prototype.crop = function (context, texture, srcX, srcY, srcW, srcH, destX, destY, destW, destH, offsetX, offsetY) { offsetX += destX; offsetY += destY; @@ -11670,6 +11685,12 @@ var Phaser; if(srcH > (destY + destH) - offsetY) { srcH = (destY + destH) - offsetY; } + srcX = Math.floor(srcX); + srcY = Math.floor(srcY); + srcW = Math.floor(srcW); + srcH = Math.floor(srcH); + offsetX = Math.floor(offsetX + this._bounds.x); + offsetY = Math.floor(offsetY + this._bounds.y); if(srcW > 0 && srcH > 0) { context.drawImage(texture, srcX, srcY, srcW, srcH, offsetX, offsetY, srcW, srcH); } @@ -11729,6 +11750,10 @@ var Phaser; ScrollZone.prototype.addRegion = function (x, y, width, height, speedX, speedY) { if (typeof speedX === "undefined") { speedX = 0; } if (typeof speedY === "undefined") { speedY = 0; } + if(x > this.width || y > this.height || x < 0 || y < 0 || (x + width) > this.width || (y + height) > this.height) { + throw Error('Invalid ScrollRegion defined. Cannot be larger than parent ScrollZone'); + return; + } this.currentRegion = new Phaser.ScrollRegion(x, y, width, height, speedX, speedY); this.regions.push(this.currentRegion); return this.currentRegion; @@ -11737,6 +11762,7 @@ var Phaser; if(this.currentRegion) { this.currentRegion.scrollSpeed.setTo(x, y); } + return this; }; ScrollZone.prototype.update = function () { for(var i = 0; i < this.regions.length; i++) {