Added Sprite.fixedToCamera, fixed Angular Velocity and Acceleration, fixed jittery Camera, added skipQuadTree flag and created lots more examples.

This commit is contained in:
photonstorm
2013-10-08 00:58:20 +01:00
parent 1bc6ac25fa
commit c307f79102
20 changed files with 444 additions and 61 deletions
+11 -7
View File
@@ -164,8 +164,7 @@ Phaser.Camera.prototype = {
*/
focusOnXY: function (x, y) {
this.view.x = Math.round(x - this.view.halfWidth);
this.view.y = Math.round(y - this.view.halfHeight);
this.setPosition(Math.round(x - this.view.halfWidth), Math.round(y - this.view.halfHeight));
},
@@ -185,6 +184,16 @@ Phaser.Camera.prototype = {
this.checkBounds();
}
if (this.view.x !== -this.displayObject.position.x)
{
this.displayObject.position.x = -this.view.x;
}
if (this.view.y !== -this.displayObject.position.y)
{
this.displayObject.position.y = -this.view.y;
}
},
updateTarget: function () {
@@ -283,9 +292,6 @@ Phaser.Camera.prototype = {
this.view.x = x;
this.view.y = y;
this.displayObject.x = -x;
this.displayObject.y = -y;
if (this.bounds)
{
this.checkBounds();
@@ -323,7 +329,6 @@ Object.defineProperty(Phaser.Camera.prototype, "x", {
set: function (value) {
this.view.x = value;
this.displayObject.position.x = -value;
if (this.bounds)
{
@@ -347,7 +352,6 @@ Object.defineProperty(Phaser.Camera.prototype, "y", {
set: function (value) {
this.view.y = value;
this.displayObject.position.y = -value;
if (this.bounds)
{
+2 -2
View File
@@ -71,8 +71,6 @@ Phaser.World.prototype.boot = function () {
*/
Phaser.World.prototype.update = function () {
this.camera.update();
this.currentRenderOrderID = 0;
if (this.game.stage._stage.first._iNext)
@@ -104,6 +102,8 @@ Phaser.World.prototype.update = function () {
*/
Phaser.World.prototype.postUpdate = function () {
this.camera.update();
if (this.game.stage._stage.first._iNext)
{
var currentNode = this.game.stage._stage.first._iNext;
+28 -6
View File
@@ -266,12 +266,12 @@ Phaser.Sprite = function (game, x, y, key, frame) {
/**
* @property {Description} velocity - Description.
*/
this.velocity = this.body.velocity;
// this.velocity = this.body.velocity;
/**
* @property {Description} acceleration - Description.
*/
this.acceleration = this.body.acceleration;
// this.acceleration = this.body.acceleration;
/**
* @property {Description} inWorld - World bounds check.
@@ -291,6 +291,13 @@ Phaser.Sprite = function (game, x, y, key, frame) {
*/
this._outOfBoundsFired = false;
/**
* A Sprite that is fixed to the camera ignores the position of any ancestors in the display list and uses its x/y coordinates as offsets from the top left of the camera.
* @property {boolean} fixedToCamera - Fixes this Sprite to the Camera.
* @default
*/
this.fixedToCamera = false;
};
// Needed to keep the PIXI.Sprite constructor in the prototype chain (as the core pixi renderer uses an instanceof check sadly)
@@ -428,8 +435,16 @@ Phaser.Sprite.prototype.postUpdate = function() {
this.body.postUpdate();
}
this._cache.x = this.x;
this._cache.y = this.y;
if (this.fixedToCamera)
{
this._cache.x = this.game.camera.view.x + this.x;
this._cache.y = this.game.camera.view.y + this.y;
}
else
{
this._cache.x = this.x;
this._cache.y = this.y;
}
if (this.position.x != this._cache.x || this.position.y != this._cache.y)
{
@@ -644,14 +659,21 @@ Phaser.Sprite.prototype.play = function (name, frameRate, loop) {
}
/**
* Indicates the rotation of the Sprite, in degrees, from its original orientation. Values from 0 to 180 represent clockwise rotation; values from 0 to -180 represent counterclockwise rotation.
* Values outside this range are added to or subtracted from 360 to obtain a value within the range. For example, the statement player.angle = 450 is the same as player.angle = 90.
* If you wish to work in radians instead of degrees use the property Sprite.rotation instead.
* @name Phaser.Sprite#angle
* @property {number} angle - Gets or sets the Sprites angle of rotation in degrees.
*/
Object.defineProperty(Phaser.Sprite.prototype, 'angle', {
get: function() {
return Phaser.Math.radToDeg(this.rotation);
return Phaser.Math.wrapAngle(Phaser.Math.radToDeg(this.rotation));
},
set: function(value) {
this.rotation = Phaser.Math.degToRad(value);
this.rotation = Phaser.Math.degToRad(Phaser.Math.wrapAngle(value));
}
});
+3 -3
View File
@@ -48,9 +48,9 @@ Phaser.Physics.Arcade.prototype = {
// If you're wondering why the velocity is halved and applied twice, read this: http://www.niksula.hut.fi/~hkankaan/Homepages/gravity.html
// Rotation
this._velocityDelta = (this.computeVelocity(0, false, body.angularVelocity, body.angularAcceleration, body.angularDrag, body.maxAngular) - body.angularVelocity) / 2;
this._velocityDelta = (this.computeVelocity(0, body, body.angularVelocity, body.angularAcceleration, body.angularDrag, body.maxAngular) - body.angularVelocity) / 2;
body.angularVelocity += this._velocityDelta;
body.rotation += body.angularVelocity * this.game.time.physicsElapsed;
body.rotation += (body.angularVelocity * this.game.time.physicsElapsed);
body.angularVelocity += this._velocityDelta;
// Horizontal
@@ -100,7 +100,7 @@ Phaser.Physics.Arcade.prototype = {
if (velocity - this._drag > 0)
{
velocity = velocity - this._drag;
velocity -= this._drag;
}
else if (velocity + this._drag < 0)
{
+17 -18
View File
@@ -9,6 +9,7 @@ Phaser.Physics.Arcade.Body = function (sprite) {
this.y = sprite.y;
this.preX = sprite.x;
this.preY = sprite.y;
this.preRotation = sprite.angle;
// un-scaled original size
this.sourceWidth = sprite.currentFrame.sourceSizeW;
@@ -37,6 +38,7 @@ Phaser.Physics.Arcade.Body = function (sprite) {
this.maxAngular = 1000;
this.mass = 1;
this.skipQuadTree = false;
this.quadTreeIDs = [];
this.quadTreeIndex = -1;
@@ -105,22 +107,23 @@ Phaser.Physics.Arcade.Body.prototype = {
this.preX = (this.sprite.worldTransform[2] - (this.sprite.anchor.x * this.width)) + this.offset.x;
this.preY = (this.sprite.worldTransform[5] - (this.sprite.anchor.y * this.height)) + this.offset.y;
this.rotation = this.sprite.angle;
this.preRotation = this.sprite.angle;
this.x = this.preX;
this.y = this.preY;
this.rotation = this.preRotation;
if (this.moves)
{
this.game.physics.updateMotion(this);
if (this.collideWorldBounds)
{
this.checkWorldBounds();
}
}
if (this.collideWorldBounds)
{
this.checkWorldBounds();
}
if (this.allowCollision.none == false && this.sprite.visible && this.sprite.alive)
if (this.skipQuadTree == false && this.allowCollision.none == false && this.sprite.visible && this.sprite.alive)
{
this.quadTreeIDs = [];
this.quadTreeIndex = -1;
@@ -159,20 +162,12 @@ Phaser.Physics.Arcade.Body.prototype = {
this.facing = Phaser.DOWN;
}
if (this.deltaX() != 0)
{
this.sprite.x += this.deltaX();
}
if (this.deltaY() != 0)
{
this.sprite.y += this.deltaY();
}
this.sprite.x += this.deltaX();
this.sprite.y += this.deltaY();
if (this.allowRotation)
{
// Needs to use rotation delta
// this.sprite.angle += this.rotation;
this.sprite.angle += this.deltaZ();
}
},
@@ -247,6 +242,10 @@ Phaser.Physics.Arcade.Body.prototype = {
deltaY: function () {
return this.y - this.preY;
},
deltaZ: function () {
return this.rotation - this.preRotation;
}
};
+1 -1
View File
@@ -120,7 +120,7 @@ Phaser.Tilemap = function (game, key, x, y, resizeWorld, tileWidth, tileHeight)
if (this.currentLayer && resizeWorld)
{
this.game.world.setSize(this.currentLayer.widthInPixels, this.currentLayer.heightInPixels, true);
this.game.world.setBounds(0, 0, this.currentLayer.widthInPixels, this.currentLayer.heightInPixels);
}
};