@@ -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