Skip to content

Commit 3d6b1a3

Browse files
committed
Stopped the Camera Shake effect from changing the World position, as it screws up Arcade Physics, Sprite deltas and some input handling. Instead moved the effect to be render applied only. On Canvas it updates the context.setTransform call, and on WebGL the renderSession offset property.
1 parent 62d135c commit 3d6b1a3

8 files changed

Lines changed: 33 additions & 13 deletions

File tree

src/core/Camera.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,8 +518,10 @@ Phaser.Camera.prototype = {
518518
this._shake.y = Math.floor(this._shake.y);
519519
}
520520

521-
this.displayObject.position.x = -(this.view.x + this._shake.x);
522-
this.displayObject.position.y = -(this.view.y + this._shake.y);
521+
// this.displayObject.position.x = -(this.view.x + this._shake.x);
522+
// this.displayObject.position.y = -(this.view.y + this._shake.y);
523+
this.displayObject.position.x = -this.view.x;
524+
this.displayObject.position.y = -this.view.y;
523525

524526
},
525527

src/pixi/display/Sprite.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,16 +430,19 @@ PIXI.Sprite.prototype._renderCanvas = function(renderSession, matrix)
430430
var dx = (this.texture.trim) ? this.texture.trim.x - this.anchor.x * this.texture.trim.width : this.anchor.x * -this.texture.frame.width;
431431
var dy = (this.texture.trim) ? this.texture.trim.y - this.anchor.y * this.texture.trim.height : this.anchor.y * -this.texture.frame.height;
432432

433+
var tx = (wt.tx * renderSession.resolution) + renderSession.shakeX;
434+
var ty = (wt.ty * renderSession.resolution) + renderSession.shakeY;
435+
433436
// Allow for pixel rounding
434437
if (renderSession.roundPixels)
435438
{
436-
renderSession.context.setTransform(wt.a, wt.b, wt.c, wt.d, (wt.tx * renderSession.resolution) | 0, (wt.ty * renderSession.resolution) | 0);
439+
renderSession.context.setTransform(wt.a, wt.b, wt.c, wt.d, tx | 0, ty | 0);
437440
dx |= 0;
438441
dy |= 0;
439442
}
440443
else
441444
{
442-
renderSession.context.setTransform(wt.a, wt.b, wt.c, wt.d, wt.tx * renderSession.resolution, wt.ty * renderSession.resolution);
445+
renderSession.context.setTransform(wt.a, wt.b, wt.c, wt.d, tx, ty);
443446
}
444447

445448
var cw = this.texture.crop.width;

src/pixi/display/SpriteBatch.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ PIXI.SpriteBatch.prototype._renderCanvas = function(renderSession)
139139
frame.y,
140140
frame.width,
141141
frame.height,
142-
((child.anchor.x) * (-frame.width * child.scale.x) + child.position.x + 0.5) | 0,
143-
((child.anchor.y) * (-frame.height * child.scale.y) + child.position.y + 0.5) | 0,
142+
((child.anchor.x) * (-frame.width * child.scale.x) + child.position.x + 0.5 + renderSession.shakeX) | 0,
143+
((child.anchor.y) * (-frame.height * child.scale.y) + child.position.y + 0.5 + renderSession.shakeY) | 0,
144144
frame.width * child.scale.x,
145145
frame.height * child.scale.y);
146146
}
@@ -151,16 +151,18 @@ PIXI.SpriteBatch.prototype._renderCanvas = function(renderSession)
151151
child.displayObjectUpdateTransform();
152152

153153
var childTransform = child.worldTransform;
154+
var tx = (childTransform.tx * renderSession.resolution) + renderSession.shakeX;
155+
var ty = (childTransform.ty * renderSession.resolution) + renderSession.shakeY;
154156

155157
// allow for trimming
156158

157159
if (renderSession.roundPixels)
158160
{
159-
context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, childTransform.tx | 0, childTransform.ty | 0);
161+
context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, tx | 0, ty | 0);
160162
}
161163
else
162164
{
163-
context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, childTransform.tx, childTransform.ty);
165+
context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, tx, ty);
164166
}
165167

166168
context.drawImage(texture.baseTexture.source,

src/pixi/extras/Strip.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,16 @@ PIXI.Strip.prototype._renderCanvas = function(renderSession)
213213

214214
var transform = this.worldTransform;
215215

216+
var tx = (transform.tx * renderSession.resolution) + renderSession.shakeX;
217+
var ty = (transform.ty * renderSession.resolution) + renderSession.shakeY;
218+
216219
if (renderSession.roundPixels)
217220
{
218-
context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx | 0, transform.ty | 0);
221+
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx | 0, ty | 0);
219222
}
220223
else
221224
{
222-
context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);
225+
context.setTransform(transform.a, transform.b, transform.c, transform.d, tx, ty);
223226
}
224227

225228
if (this.drawMode === PIXI.Strip.DrawModes.TRIANGLE_STRIP)

src/pixi/extras/TilingSprite.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,10 @@ PIXI.TilingSprite.prototype._renderCanvas = function(renderSession)
238238

239239
var wt = this.worldTransform;
240240
var resolution = renderSession.resolution;
241+
var tx = (wt.tx * resolution) + renderSession.shakeX;
242+
var ty = (wt.ty * resolution) + renderSession.shakeY;
241243

242-
context.setTransform(wt.a * resolution, wt.b * resolution, wt.c * resolution, wt.d * resolution, wt.tx * resolution, wt.ty * resolution);
244+
context.setTransform(wt.a * resolution, wt.b * resolution, wt.c * resolution, wt.d * resolution, tx, ty);
243245

244246
if (this.refreshTexture)
245247
{

src/pixi/primitives/Graphics.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -804,13 +804,15 @@ PIXI.Graphics.prototype._renderCanvas = function(renderSession)
804804
}
805805

806806
var resolution = renderSession.resolution;
807+
var tx = (transform.tx * renderSession.resolution) + renderSession.shakeX;
808+
var ty = (transform.ty * renderSession.resolution) + renderSession.shakeY;
807809

808810
context.setTransform(transform.a * resolution,
809811
transform.b * resolution,
810812
transform.c * resolution,
811813
transform.d * resolution,
812-
transform.tx * resolution,
813-
transform.ty * resolution);
814+
tx,
815+
ty);
814816

815817
PIXI.CanvasGraphics.renderGraphics(this, context);
816818

src/pixi/renderers/canvas/CanvasRenderer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ PIXI.CanvasRenderer.prototype.render = function (stage) {
164164
this.context.globalAlpha = 1;
165165

166166
this.renderSession.currentBlendMode = 0;
167+
this.renderSession.shakeX = this.game.camera._shake.x;
168+
this.renderSession.shakeY = this.game.camera._shake.y;
169+
167170
this.context.globalCompositeOperation = 'source-over';
168171

169172
if (navigator.isCocoonJS && this.view.screencanvas)

src/pixi/renderers/webgl/WebGLRenderer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,9 @@ PIXI.WebGLRenderer.prototype.render = function(stage)
272272
gl.clear(gl.COLOR_BUFFER_BIT);
273273
}
274274

275+
this.offset.x = this.game.camera._shake.x;
276+
this.offset.y = this.game.camera._shake.y;
277+
275278
this.renderDisplayObject(stage, this.projection);
276279
};
277280

0 commit comments

Comments
 (0)