Skip to content

Commit 1f8c809

Browse files
committed
cameraView working for center rotated sprites, just need to handle any point of rotation.
1 parent 3b93867 commit 1f8c809

10 files changed

Lines changed: 236 additions & 198 deletions

File tree

Phaser/components/Transform.ts

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,15 @@ module Phaser.Components {
2727

2828
}
2929

30-
public local: Mat3;
31-
3230
private _sin: number;
3331
private _cos: number;
3432

35-
public update() {
33+
public local: Mat3;
3634

37-
// 0 a = scale x
38-
// 3 b = skew x
39-
// 1 c = skew y
40-
// 4 d = scale y
41-
// 2 e = translate x
42-
// 5 f = translate y
35+
public update() {
4336

4437
// Scale & Skew
4538

46-
// if (sprite.texture.renderRotation == true && (sprite.rotation !== 0 || sprite.transform.rotationOffset !== 0))
47-
4839
this._sin = 0;
4940
this._cos = 1;
5041

@@ -56,30 +47,22 @@ module Phaser.Components {
5647

5748
if (this.parent.texture.flippedX)
5849
{
59-
//this.local.data[0] = GameMath.cosA[this.rotation + this.rotationOffset] * -this.scale.x;
60-
//this.local.data[3] = (GameMath.sinA[this.rotation + this.rotationOffset] * -this.scale.x) + this.skew.x;
6150
this.local.data[0] = this._cos * -this.scale.x;
6251
this.local.data[3] = (this._sin * -this.scale.x) + this.skew.x;
6352
}
6453
else
6554
{
66-
//this.local.data[0] = GameMath.cosA[this.rotation + this.rotationOffset] * this.scale.x;
67-
//this.local.data[3] = (GameMath.sinA[this.rotation + this.rotationOffset] * this.scale.x) + this.skew.x;
6855
this.local.data[0] = this._cos * this.scale.x;
6956
this.local.data[3] = (this._sin * this.scale.x) + this.skew.x;
7057
}
7158

7259
if (this.parent.texture.flippedY)
7360
{
74-
//this.local.data[4] = GameMath.cosA[this.rotation + this.rotationOffset] * -this.scale.y;
75-
//this.local.data[1] = -(GameMath.sinA[this.rotation + this.rotationOffset] * -this.scale.y) + this.skew.y;
7661
this.local.data[4] = this._cos * -this.scale.y;
7762
this.local.data[1] = -(this._sin * -this.scale.y) + this.skew.y;
7863
}
7964
else
8065
{
81-
//this.local.data[4] = GameMath.cosA[this.rotation + this.rotationOffset] * this.scale.y;
82-
//this.local.data[1] = -(GameMath.sinA[this.rotation + this.rotationOffset] * this.scale.y) + this.skew.y;
8366
this.local.data[4] = this._cos * this.scale.y;
8467
this.local.data[1] = -(this._sin * this.scale.y) + this.skew.y;
8568
}
@@ -90,14 +73,6 @@ module Phaser.Components {
9073

9174
}
9275

93-
public get calculatedX(): number {
94-
return this.origin.x * this.scale.x;
95-
}
96-
97-
public get calculatedY(): number {
98-
return this.origin.y * this.scale.y;
99-
}
100-
10176
/**
10277
* Reference to Phaser.Game
10378
*/

Phaser/gameobjects/Sprite.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ module Phaser {
7070

7171
this.body = new Phaser.Physics.Body(this, bodyType);
7272
this.worldView = new Rectangle(x, y, this.width, this.height);
73+
this.cameraView = new Rectangle(x, y, this.width, this.height);
7374

7475
}
7576

@@ -145,6 +146,12 @@ module Phaser {
145146
*/
146147
public worldView: Phaser.Rectangle;
147148

149+
/**
150+
* A Rectangle that maps to the placement of this sprite with respect to a specific Camera.
151+
* This value is constantly updated and modified during the internal render pass, it is not meant to be accessed directly.
152+
*/
153+
public cameraView: Phaser.Rectangle;
154+
148155
/**
149156
* A boolean representing if the Sprite has been modified in any way via a scale, rotate, flip or skew.
150157
*/
@@ -236,12 +243,8 @@ module Phaser {
236243

237244
this.transform.update();
238245

239-
//this.worldView.x = this.x * this.transform.scrollFactor.x;
240-
//this.worldView.y = this.y * this.transform.scrollFactor.y;
241-
this.worldView.x = this.x;
242-
this.worldView.y = this.y;
243-
//this.worldView.x = this.x - this.transform.origin.x;
244-
//this.worldView.y = this.y - this.transform.origin.y;
246+
this.worldView.x = this.x * this.transform.scrollFactor.x;
247+
this.worldView.y = this.y * this.transform.scrollFactor.y;
245248
this.worldView.width = this.width;
246249
this.worldView.height = this.height;
247250

Phaser/renderers/CanvasRenderer.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,9 @@ module Phaser {
221221
return true;
222222
}
223223

224-
return RectangleUtils.intersects(sprite.worldView, camera.worldView);
224+
Phaser.SpriteUtils.updateCameraView(camera, sprite);
225+
226+
return RectangleUtils.intersects(sprite.cameraView, camera.screenView);
225227

226228
}
227229

@@ -441,6 +443,8 @@ module Phaser {
441443
*/
442444
public renderSprite(camera: Camera, sprite: Sprite): bool {
443445

446+
Phaser.SpriteUtils.updateCameraView(camera, sprite);
447+
444448
if (sprite.transform.scale.x == 0 || sprite.transform.scale.y == 0 || sprite.texture.alpha < 0.1 || this.inCamera(camera, sprite) == false)
445449
{
446450
//return false;

Phaser/utils/DebugUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ module Phaser {
3131
DebugUtils.game.stage.context.fillText('wx: ' + sprite.worldView.x + ' wy: ' + sprite.worldView.y + ' ww: ' + sprite.worldView.width.toFixed(1) + ' wh: ' + sprite.worldView.height.toFixed(1) + ' wb: ' + sprite.worldView.bottom + ' wr: ' + sprite.worldView.right, x, y + 28);
3232
DebugUtils.game.stage.context.fillText('sx: ' + sprite.transform.scale.x.toFixed(1) + ' sy: ' + sprite.transform.scale.y.toFixed(1), x, y + 42);
3333
DebugUtils.game.stage.context.fillText('tx: ' + sprite.texture.width.toFixed(1) + ' ty: ' + sprite.texture.height.toFixed(1), x, y + 56);
34-
DebugUtils.game.stage.context.fillText('inCamera: ' + DebugUtils.game.renderer.inCamera(DebugUtils.game.camera, sprite), x, y + 70);
34+
DebugUtils.game.stage.context.fillText('cx: ' + sprite.cameraView.x + ' cy: ' + sprite.cameraView.y + ' cw: ' + sprite.cameraView.width + ' ch: ' + sprite.cameraView.height + ' cb: ' + sprite.cameraView.bottom + ' cr: ' + sprite.cameraView.right, x, y + 70);
35+
DebugUtils.game.stage.context.fillText('inCamera: ' + DebugUtils.game.renderer.inCamera(DebugUtils.game.camera, sprite), x, y + 84);
3536

3637
}
3738

Phaser/utils/SpriteUtils.ts

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,78 @@ module Phaser {
1616
export class SpriteUtils {
1717

1818
static _tempPoint: Point;
19+
static _sin: number;
20+
static _cos: number;
1921

2022
/**
21-
* Check whether this object is visible in a specific camera Rectangle.
22-
* @param camera {Rectangle} The Rectangle you want to check.
23-
* @return {boolean} Return true if bounds of this sprite intersects the given Rectangle, otherwise return false.
23+
* Updates a Sprites cameraView Rectangle based on the given camera, sprite world position and rotation
24+
* @param camera {Camera} The Camera to use in the view
25+
* @param sprite {Sprite} The Sprite that will have its cameraView property modified
26+
* @return {Rectangle} A reference to the Sprite.cameraView property
2427
*/
25-
static inCamera(camera: Camera, sprite: Sprite): bool {
28+
static updateCameraView(camera: Camera, sprite: Sprite): Rectangle {
2629

27-
// Object fixed in place regardless of the camera scrolling? Then it's always visible
28-
if (sprite.transform.scrollFactor.x == 0 && sprite.transform.scrollFactor.y == 0)
30+
if (sprite.rotation == 0 || sprite.texture.renderRotation == false)
2931
{
30-
return true;
32+
// Easy out
33+
sprite.cameraView.x = Math.round(sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x) - (sprite.width * sprite.transform.origin.x));
34+
sprite.cameraView.y = Math.round(sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y) - (sprite.height * sprite.transform.origin.y));
35+
sprite.cameraView.width = sprite.width;
36+
sprite.cameraView.height = sprite.height;
37+
}
38+
else
39+
{
40+
// If the sprite is rotated around its center we can use this quicker method:
41+
42+
// Work out bounding box
43+
SpriteUtils._sin = Phaser.GameMath.sinA[sprite.rotation];
44+
SpriteUtils._cos = Phaser.GameMath.cosA[sprite.rotation];
45+
46+
if (SpriteUtils._sin < 0)
47+
{
48+
SpriteUtils._sin = -SpriteUtils._sin;
49+
}
50+
51+
if (SpriteUtils._cos < 0)
52+
{
53+
SpriteUtils._cos = -SpriteUtils._cos;
54+
}
55+
56+
sprite.cameraView.width = Math.round(sprite.height * SpriteUtils._sin + sprite.width * SpriteUtils._cos);
57+
sprite.cameraView.height = Math.round(sprite.height * SpriteUtils._cos + sprite.width * SpriteUtils._sin);
58+
59+
// if origin isn't 0.5 we need to work out the difference to apply to the x/y
60+
if (sprite.transform.origin.equals(0.5))
61+
{
62+
// Easy out
63+
sprite.cameraView.x = Math.round(sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x) - (sprite.cameraView.width * sprite.transform.origin.x));
64+
sprite.cameraView.y = Math.round(sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y) - (sprite.cameraView.height * sprite.transform.origin.y));
65+
}
66+
else
67+
{
68+
//var ax = sprite.cameraView.width * sprite.transform.origin.x;
69+
//var ay = sprite.cameraView.height * sprite.transform.origin.y;
70+
//var bx = sprite.cameraView.width * 0.5;
71+
//var by = sprite.cameraView.height * 0.5;
72+
//var c = sprite.game.math.distanceBetween(ax, ay, bx, by) / 2;
73+
74+
//console.log('actual x', ax, 'actual y', ay, 'cx', bx, 'cy', by);
75+
76+
sprite.cameraView.x = Math.round(sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x) - (sprite.cameraView.width * sprite.transform.origin.x));
77+
sprite.cameraView.y = Math.round(sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y) - (sprite.cameraView.height * sprite.transform.origin.y));
78+
}
79+
3180
}
3281

33-
var dx = sprite.x - (camera.worldView.x * sprite.transform.scrollFactor.x);
34-
var dy = sprite.y - (camera.worldView.y * sprite.transform.scrollFactor.y);
35-
var dw = sprite.width * sprite.transform.scale.x;
36-
var dh = sprite.height * sprite.transform.scale.y;
82+
if (sprite.animations.currentFrame !== null && sprite.animations.currentFrame.trimmed)
83+
{
84+
//sprite.cameraView.x += sprite.animations.currentFrame.spriteSourceSizeX;
85+
//sprite.cameraView.y += sprite.animations.currentFrame.spriteSourceSizeY;
86+
//this._dw = sprite.animations.currentFrame.spriteSourceSizeW;
87+
//this._dh = sprite.animations.currentFrame.spriteSourceSizeH;
88+
}
3789

38-
return (camera.screenView.x + camera.worldView.width > this._dx) && (camera.screenView.x < this._dx + this._dw) && (camera.screenView.y + camera.worldView.height > this._dy) && (camera.screenView.y < this._dy + this._dh);
90+
return sprite.cameraView;
3991

4092
}
4193

0 commit comments

Comments
 (0)