Loads of issues reported on Github resolved (sprite crop, music resume, etc).

This commit is contained in:
photonstorm
2013-10-24 04:27:28 +01:00
parent e4621aafdd
commit a6fac64248
17 changed files with 538 additions and 774 deletions
+35 -13
View File
@@ -406,33 +406,55 @@ Object.defineProperty(Phaser.Animation.prototype, "frame", {
*
* @method Phaser.Animation.generateFrameNames
* @param {string} prefix - The start of the filename. If the filename was 'explosion_0001-large' the prefix would be 'explosion_'.
* @param {number} min - The number to start sequentially counting from. If your frames are named 'explosion_0001' to 'explosion_0034' the min is 1.
* @param {number} max - The number to count up to. If your frames are named 'explosion_0001' to 'explosion_0034' the max is 34.
* @param {number} start - The number to start sequentially counting from. If your frames are named 'explosion_0001' to 'explosion_0034' the start is 1.
* @param {number} stop - The number to count to. If your frames are named 'explosion_0001' to 'explosion_0034' the stop value is 34.
* @param {string} [suffix=''] - The end of the filename. If the filename was 'explosion_0001-large' the prefix would be '-large'.
* @param {number} [zeroPad=0] - The number of zeroes to pad the min and max values with. If your frames are named 'explosion_0001' to 'explosion_0034' then the zeroPad is 4.
*/
Phaser.Animation.generateFrameNames = function (prefix, min, max, suffix, zeroPad) {
Phaser.Animation.generateFrameNames = function (prefix, start, stop, suffix, zeroPad) {
if (typeof suffix == 'undefined') { suffix = ''; }
var output = [];
var frame = '';
for (var i = min; i <= max; i++)
if (start < stop)
{
if (typeof zeroPad == 'number')
for (var i = start; i <= stop; i++)
{
// str, len, pad, dir
frame = Phaser.Utils.pad(i.toString(), zeroPad, '0', 1);
if (typeof zeroPad == 'number')
{
// str, len, pad, dir
frame = Phaser.Utils.pad(i.toString(), zeroPad, '0', 1);
}
else
{
frame = i.toString();
}
frame = prefix + frame + suffix;
output.push(frame);
}
else
}
else
{
for (var i = start; i >= stop; i--)
{
frame = i.toString();
if (typeof zeroPad == 'number')
{
// str, len, pad, dir
frame = Phaser.Utils.pad(i.toString(), zeroPad, '0', 1);
}
else
{
frame = i.toString();
}
frame = prefix + frame + suffix;
output.push(frame);
}
frame = prefix + frame + suffix;
output.push(frame);
}
return output;
+4
View File
@@ -426,6 +426,10 @@ Phaser.Game.prototype = {
*/
destroy: function () {
this.raf.stop();
this.input.destroy();
this.state.destroy();
this.state = null;
+83 -61
View File
@@ -144,20 +144,6 @@ Phaser.Sprite = function (game, x, y, key, frame) {
*/
this.anchor = new Phaser.Point();
/**
* @property {Description} _cropUUID - Description.
* @private
* @default
*/
this._cropUUID = null;
/**
* @property {Description} _cropUUID - Description.
* @private
* @default
*/
this._cropRect = null;
/**
* @property {number} x - Description.
*/
@@ -225,7 +211,10 @@ Phaser.Sprite = function (game, x, y, key, frame) {
boundsX: 0, boundsY: 0,
// If this sprite visible to the camera (regardless of being set to visible or not)
cameraVisible: true
cameraVisible: true,
// Crop cache
cropX: 0, cropY: 0, cropWidth: this.currentFrame.sourceSizeW, cropHeight: this.currentFrame.sourceSizeH
};
@@ -305,6 +294,9 @@ Phaser.Sprite = function (game, x, y, key, frame) {
*/
this.fixedToCamera = false;
this.crop = new Phaser.Rectangle(0, 0, this._cache.width, this._cache.height);
this.cropEnabled = false;
};
// Needed to keep the PIXI.Sprite constructor in the prototype chain (as the core pixi renderer uses an instanceof check sadly)
@@ -352,6 +344,11 @@ Phaser.Sprite.prototype.preUpdate = function() {
this.updateCache();
this.updateAnimation();
if (this.cropEnabled)
{
this.updateCrop();
}
// Re-run the camera visibility check
if (this._cache.dirty)
{
@@ -436,6 +433,37 @@ Phaser.Sprite.prototype.updateAnimation = function() {
}
Phaser.Sprite.prototype.updateCrop = function() {
// This only runs if crop is enabled
if (this.crop.width != this._cache.cropWidth || this.crop.height != this._cache.cropHeight || this.crop.x != this._cache.cropX || this.crop.y != this._cache.cropY)
{
this.crop.floorAll();
this._cache.cropX = this.crop.x;
this._cache.cropY = this.crop.y;
this._cache.cropWidth = this.crop.width;
this._cache.cropHeight = this.crop.height;
this.texture.frame = this.crop;
this.texture.width = this.crop.width;
this.texture.height = this.crop.height;
this.texture.updateFrame = true;
PIXI.Texture.frameUpdates.push(this.texture);
}
}
Phaser.Sprite.prototype.resetCrop = function() {
this.crop = new Phaser.Rectangle(0, 0, this._cache.width, this._cache.height);
this.texture.setFrame(this.crop);
this.cropEnabled = false;
}
Phaser.Sprite.prototype.postUpdate = function() {
if (this.exists)
@@ -586,9 +614,20 @@ Phaser.Sprite.prototype.destroy = function() {
this.group.remove(this);
}
this.input.destroy();
this.events.destroy();
this.animations.destroy();
if (this.input)
{
this.input.destroy();
}
if (this.events)
{
this.events.destroy();
}
if (this.animations)
{
this.animations.destroy();
}
this.alive = false;
this.exists = false;
@@ -847,56 +886,39 @@ Object.defineProperty(Phaser.Sprite.prototype, "inCamera", {
});
/**
* Get the input enabled state of this Sprite.
* @returns {Description}
*//**
* Set the ability for this sprite to receive input events.
* @param {Description} value - Description
*/
Object.defineProperty(Phaser.Sprite.prototype, "crop", {
get: function () {
return this._cropRect;
* The width of the sprite, setting this will actually modify the scale to acheive the value set
*
* @property width
* @type Number
*/
Object.defineProperty(Phaser.Sprite.prototype, 'width', {
get: function() {
return this.scale.x * this.currentFrame.width;
},
set: function (value) {
set: function(value) {
this.scale.x = value / this.currentFrame.width
this._width = value;
}
if (value instanceof Phaser.Rectangle)
{
if (this._cropUUID == null)
{
this._cropUUID = this.game.rnd.uuid();
});
PIXI.TextureCache[this._cropUUID] = new PIXI.Texture(PIXI.BaseTextureCache[this.key], {
x: Math.floor(value.x),
y: Math.floor(value.y),
width: Math.floor(value.width),
height: Math.floor(value.height)
});
}
else
{
PIXI.TextureCache[this._cropUUID].frame = value;
}
/**
* The height of the sprite, setting this will actually modify the scale to acheive the value set
*
* @property height
* @type Number
*/
Object.defineProperty(Phaser.Sprite.prototype, 'height', {
this._cropRect = value;
this.setTexture(PIXI.TextureCache[this._cropUUID]);
}
else
{
this._cropRect = null;
get: function() {
return this.scale.y * this.currentFrame.height;
},
if (this.animations.isLoaded)
{
this.animations.refreshFrame();
}
else
{
this.setTexture(PIXI.TextureCache[this.key]);
}
}
set: function(value) {
this.scale.y = value / this.currentFrame.height
this._height = value;
}
});
+13
View File
@@ -103,6 +103,19 @@ Phaser.Rectangle.prototype = {
},
/**
* Runs Math.floor() on the x, y, width and height values of this Rectangle.
* @method Phaser.Rectangle#floorAll
**/
floorAll: function () {
this.x = Math.floor(this.x);
this.y = Math.floor(this.y);
this.width = Math.floor(this.width);
this.height = Math.floor(this.height);
},
/**
* Copies the x, y, width and height properties from any given object to this Rectangle.
* @method Phaser.Rectangle#copyFrom
+13 -22
View File
@@ -395,6 +395,19 @@ Phaser.Input.prototype = {
this.mspointer.start();
this.mousePointer.active = true;
},
/**
* Stops all of the Input Managers from running.
* @method Phaser.Input#destroy
*/
destroy: function () {
this.mouse.stop();
this.keyboard.stop();
this.touch.stop();
this.mspointer.stop();
},
/**
@@ -681,28 +694,6 @@ Phaser.Input.prototype = {
return null;
},
/**
* Get the distance between two Pointer objects.
* @method Phaser.Input#getDistance
* @param {Pointer} pointer1
* @param {Pointer} pointer2
* @return {Description} Description.
*/
getDistance: function (pointer1, pointer2) {
// return Phaser.Vec2Utils.distance(pointer1.position, pointer2.position);
},
/**
* Get the angle between two Pointer objects.
* @method Phaser.Input#getAngle
* @param {Pointer} pointer1
* @param {Pointer} pointer2
* @return {Description} Description.
*/
getAngle: function (pointer1, pointer2) {
// return Phaser.Vec2Utils.angle(pointer1.position, pointer2.position);
}
};
+9 -3
View File
@@ -306,10 +306,13 @@ Phaser.InputHandler.prototype = {
if (this.enabled)
{
this.enabled = false;
this.game.input.interactiveItems.remove(this);
this.stop();
// Null everything
this.sprite = null;
// etc
}
},
@@ -615,7 +618,10 @@ Phaser.InputHandler.prototype = {
this.game.stage.canvas.style.cursor = "default";
}
this.sprite.events.onInputOut.dispatch(this.sprite, pointer);
if (this.sprite && this.sprite.events)
{
this.sprite.events.onInputOut.dispatch(this.sprite, pointer);
}
},
+2 -2
View File
@@ -281,7 +281,7 @@ Phaser.Pointer.prototype = {
this.game.input.x = this.x * this.game.input.scale.x;
this.game.input.y = this.y * this.game.input.scale.y;
this.game.input.position.setTo(this.x, this.y);
this.game.input.onDown.dispatch(this);
this.game.input.onDown.dispatch(this, event);
this.game.input.resetSpeed(this.x, this.y);
}
@@ -506,7 +506,7 @@ Phaser.Pointer.prototype = {
if (this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0))
{
this.game.input.onUp.dispatch(this);
this.game.input.onUp.dispatch(this, event);
// Was it a tap?
if (this.duration >= 0 && this.duration <= this.game.input.tapRate)
+5 -4
View File
@@ -161,6 +161,7 @@ Phaser.Loader.prototype = {
}
sprite.crop = this.preloadSprite.crop;
sprite.cropEnabled = true;
},
@@ -935,7 +936,7 @@ Phaser.Loader.prototype = {
break;
case 'text':
file.data = this._xhr.response;
file.data = this._xhr.responseText;
this.game.cache.addText(file.key, file.url, file.data);
break;
}
@@ -955,7 +956,7 @@ Phaser.Loader.prototype = {
*/
jsonLoadComplete: function (key) {
var data = JSON.parse(this._xhr.response);
var data = JSON.parse(this._xhr.responseText);
var file = this._fileList[key];
if (file.type == 'tilemap')
@@ -979,7 +980,7 @@ Phaser.Loader.prototype = {
*/
csvLoadComplete: function (key) {
var data = this._xhr.response;
var data = this._xhr.responseText;
var file = this._fileList[key];
this.game.cache.addTilemap(file.key, file.url, data, file.format);
@@ -1014,7 +1015,7 @@ Phaser.Loader.prototype = {
*/
xmlLoadComplete: function (key) {
var data = this._xhr.response;
var data = this._xhr.responseText;
var xml;
try
+25 -4
View File
@@ -118,8 +118,7 @@ Phaser.Sound = function (game, key, volume, loop) {
/**
* Description.
* @property {number} autoplay
* @default
* @property {number} stopTime
*/
this.stopTime = 0;
@@ -130,6 +129,18 @@ Phaser.Sound = function (game, key, volume, loop) {
*/
this.paused = false;
/**
* Description.
* @property {number} pausedPosition
*/
this.pausedPosition = 0;
/**
* Description.
* @property {number} pausedTime
*/
this.pausedTime = 0;
/**
* Description.
* @property {boolean} isPlaying
@@ -627,10 +638,13 @@ Phaser.Sound.prototype = {
this.stop();
this.isPlaying = false;
this.paused = true;
this.pausedPosition = this.currentTime;
this.pausedTime = this.game.time.now;
this.onPause.dispatch(this);
}
},
/**
* Resumes the sound
* @method Phaser.Sound#resume
@@ -641,14 +655,20 @@ Phaser.Sound.prototype = {
{
if (this.usingWebAudio)
{
var p = this.position + (this.pausedPosition / 1000);
this._sound = this.context.createBufferSource();
this._sound.buffer = this._buffer;
this._sound.connect(this.gainNode);
if (typeof this._sound.start === 'undefined')
{
this._sound.noteGrainOn(0, this.position, this.duration);
this._sound.noteGrainOn(0, p, this.duration);
//this._sound.noteOn(0); // the zero is vitally important, crashes iOS6 without it
}
else
{
this._sound.start(0, this.position, this.duration);
this._sound.start(0, p, this.duration);
}
}
else
@@ -658,6 +678,7 @@ Phaser.Sound.prototype = {
this.isPlaying = true;
this.paused = false;
this.startTime += (this.game.time.now - this.pausedTime);
this.onResume.dispatch(this);
}