2013-04-18 13:16:18 +00:00
|
|
|
/// <reference path="../Game.ts" />
|
|
|
|
/// <reference path="easing/Back.ts" />
|
|
|
|
/// <reference path="easing/Bounce.ts" />
|
|
|
|
/// <reference path="easing/Circular.ts" />
|
|
|
|
/// <reference path="easing/Cubic.ts" />
|
|
|
|
/// <reference path="easing/Elastic.ts" />
|
|
|
|
/// <reference path="easing/Exponential.ts" />
|
|
|
|
/// <reference path="easing/Linear.ts" />
|
|
|
|
/// <reference path="easing/Quadratic.ts" />
|
|
|
|
/// <reference path="easing/Quartic.ts" />
|
|
|
|
/// <reference path="easing/Quintic.ts" />
|
|
|
|
/// <reference path="easing/Sinusoidal.ts" />
|
|
|
|
|
|
|
|
/**
|
2013-04-18 15:49:08 +00:00
|
|
|
* Phaser - Tween
|
|
|
|
*
|
|
|
|
* Based heavily on tween.js by sole (https://github.com/sole/tween.js) converted to TypeScript and integrated into Phaser
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
|
|
|
|
module Phaser {
|
|
|
|
|
|
|
|
export class Tween {
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Tween constructor
|
|
|
|
* Create a new <code>Tween</code>.
|
|
|
|
*
|
|
|
|
* @param object {object} Target object will be affected by this tween.
|
|
|
|
* @param game {Phaser.Game} Current game instance.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
constructor(object, game:Phaser.Game) {
|
|
|
|
|
|
|
|
this._object = object;
|
|
|
|
|
|
|
|
this._game = game;
|
|
|
|
this._manager = this._game.tweens;
|
|
|
|
this._interpolationFunction = this._game.math.linearInterpolation;
|
|
|
|
this._easingFunction = Phaser.Easing.Linear.None;
|
|
|
|
|
2013-04-29 01:41:19 +00:00
|
|
|
this._chainedTweens = [];
|
2013-04-18 13:16:18 +00:00
|
|
|
this.onStart = new Phaser.Signal();
|
|
|
|
this.onUpdate = new Phaser.Signal();
|
|
|
|
this.onComplete = new Phaser.Signal();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Local private reference to game.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _game: Phaser.Game;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Manager of this tween.
|
|
|
|
* @type {Phaser.TweenManager}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _manager: Phaser.TweenManager;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Reference to the target object.
|
|
|
|
* @type {object}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _object = null;
|
|
|
|
private _pausedTime: number = 0;
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Start values container.
|
|
|
|
* @type {object}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _valuesStart = {};
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* End values container.
|
|
|
|
* @type {object}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _valuesEnd = {};
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* How long this tween will perform.
|
|
|
|
* @type {number}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _duration = 1000;
|
|
|
|
private _delayTime = 0;
|
|
|
|
private _startTime = null;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Easing function which actually updating this tween.
|
|
|
|
* @type {function}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _easingFunction;
|
|
|
|
private _interpolationFunction;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Contains chained tweens.
|
|
|
|
* @type {Tweens[]}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
private _chainedTweens = [];
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Signal to be dispatched when this tween start.
|
|
|
|
* @type {Phaser.Signal}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public onStart: Phaser.Signal;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Signal to be dispatched when this tween updating.
|
|
|
|
* @type {Phaser.Signal}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public onUpdate: Phaser.Signal;
|
2013-05-14 02:37:38 +00:00
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Signal to be dispatched when this tween completed.
|
|
|
|
* @type {Phaser.Signal}
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public onComplete: Phaser.Signal;
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Config the tween result.
|
|
|
|
* @param properties {object} Propertis you want to tween.
|
2013-05-04 16:18:45 +00:00
|
|
|
* @param [duration] {number} duration of this tween.
|
2013-05-04 11:56:33 +00:00
|
|
|
* @param ease {any} Easing function.
|
|
|
|
* @param autoStart {boolean} Whether this tween will start automatically or not.
|
|
|
|
* @return {Tween} Itself.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public to(properties, duration?: number = 1000, ease?: any = null, autoStart?: bool = false) {
|
|
|
|
|
|
|
|
this._duration = duration;
|
|
|
|
|
|
|
|
// If properties isn't an object this will fail, sanity check it here somehow?
|
|
|
|
this._valuesEnd = properties;
|
|
|
|
|
|
|
|
if (ease !== null)
|
|
|
|
{
|
|
|
|
this._easingFunction = ease;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (autoStart === true)
|
|
|
|
{
|
|
|
|
return this.start();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Start to tween.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public start() {
|
|
|
|
|
|
|
|
if (this._game === null || this._object === null)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
this._manager.add(this);
|
|
|
|
|
|
|
|
this.onStart.dispatch(this._object);
|
|
|
|
|
|
|
|
this._startTime = this._game.time.now + this._delayTime;
|
|
|
|
|
|
|
|
for (var property in this._valuesEnd)
|
|
|
|
{
|
|
|
|
// This prevents the interpolation of null values or of non-existing properties
|
|
|
|
if (this._object[property] === null || !(property in this._object))
|
|
|
|
{
|
|
|
|
throw Error('Phaser.Tween interpolation of null value of non-existing property');
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// check if an Array was provided as property value
|
|
|
|
if (this._valuesEnd[property] instanceof Array)
|
|
|
|
{
|
|
|
|
if (this._valuesEnd[property].length === 0)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// create a local copy of the Array with the start value at the front
|
|
|
|
this._valuesEnd[property] = [this._object[property]].concat(this._valuesEnd[property]);
|
|
|
|
}
|
|
|
|
|
|
|
|
this._valuesStart[property] = this._object[property];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Stop tweening.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public stop() {
|
|
|
|
|
|
|
|
if (this._manager !== null)
|
|
|
|
{
|
|
|
|
this._manager.remove(this);
|
|
|
|
}
|
|
|
|
|
2013-04-29 01:41:19 +00:00
|
|
|
this.onComplete.dispose();
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public set parent(value:Phaser.Game) {
|
|
|
|
|
|
|
|
this._game = value;
|
|
|
|
this._manager = this._game.tweens;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public set delay(amount:number) {
|
|
|
|
this._delayTime = amount;
|
|
|
|
}
|
|
|
|
|
|
|
|
public get delay(): number {
|
|
|
|
return this._delayTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
public set easing(easing) {
|
|
|
|
this._easingFunction = easing;
|
|
|
|
}
|
|
|
|
|
|
|
|
public get easing():any {
|
|
|
|
return this._easingFunction;
|
|
|
|
}
|
|
|
|
|
|
|
|
public set interpolation(interpolation) {
|
|
|
|
this._interpolationFunction = interpolation;
|
|
|
|
}
|
|
|
|
|
|
|
|
public get interpolation():any {
|
|
|
|
return this._interpolationFunction;
|
|
|
|
}
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Add another chained tween, which will start automatically when the one before it completes.
|
|
|
|
* @param tween {Phaser.Tween} Tween object you want to chain with this.
|
|
|
|
* @return {Phaser.Tween} Itselfe.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public chain(tween:Phaser.Tween) {
|
|
|
|
|
|
|
|
this._chainedTweens.push(tween);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Debug value?
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public debugValue;
|
|
|
|
|
2013-05-04 11:56:33 +00:00
|
|
|
/**
|
|
|
|
* Update tweening.
|
|
|
|
* @param time {number} Current time from game clock.
|
|
|
|
* @return {boolean} Return false if this completed and no need to update, otherwise return true.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
public update(time) {
|
|
|
|
|
|
|
|
if (this._game.paused == true)
|
|
|
|
{
|
|
|
|
if (this._pausedTime == 0)
|
|
|
|
{
|
|
|
|
this._pausedTime = time;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Ok we aren't paused, but was there some time gained?
|
|
|
|
if (this._pausedTime > 0)
|
|
|
|
{
|
|
|
|
this._startTime += (time - this._pausedTime);
|
|
|
|
this._pausedTime = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (time < this._startTime)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
var elapsed = (time - this._startTime) / this._duration;
|
|
|
|
elapsed = elapsed > 1 ? 1 : elapsed;
|
|
|
|
|
|
|
|
var value = this._easingFunction(elapsed);
|
|
|
|
|
|
|
|
for (var property in this._valuesStart)
|
|
|
|
{
|
|
|
|
// Add checks for object, array, numeric up front
|
|
|
|
if (this._valuesEnd[property] instanceof Array)
|
|
|
|
{
|
|
|
|
this._object[property] = this._interpolationFunction(this._valuesEnd[property], value);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this._object[property] = this._valuesStart[property] + (this._valuesEnd[property] - this._valuesStart[property]) * value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.onUpdate.dispatch(this._object, value);
|
|
|
|
|
|
|
|
if (elapsed == 1)
|
|
|
|
{
|
|
|
|
this.onComplete.dispatch(this._object);
|
|
|
|
|
|
|
|
for (var i = 0; i < this._chainedTweens.length; i++)
|
|
|
|
{
|
|
|
|
this._chainedTweens[i].start();
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|