Engine.MultiTransformTweener = class
{
constructor()
{
this.finalCallback = null;
this.transforms = null;
this.tweens = new Engine.ObjectPool(Engine.SimpleTween);
this.currentTweens = [];//new List<Engine.SimpleTween>();
this.currentTransform = null;
this.drawable = null;
this.timeFactor = 1;
this.moveFactor = 1;
this.completeTweenCounter = 0;
this.position = 0;
}
/// <summary>
/// Initialize the values for use
/// </summary>
/// <param name="drawable"></param>
/// <param name="transforms"></param>
init(drawable /*IAnimationActor*/, transforms /*List<Transform>*/, moveFactor /*float*/, timeFactor /*float*/)
{
if (moveFactor === undefined) moveFactor = 1;
if (timeFactor === undefined) timeFactor = 1;
this.finalCallback = null;
this.position = 0;
this.transforms = transforms;
this.currentTransform = transforms[this.position];
this.moveFactor = moveFactor;
this.timeFactor = timeFactor;
this.drawable = drawable;
this.applyTransform(this.currentTransform);
this.createNextTweens();
}
/// <summary>
/// Apply the transform to the item we are workign with
/// </summary>
/// <param name="transform"></param>
applyTransform(transform /*Transform*/)
{
if (transform.x != null) this.drawable.x = transform.x;
if (transform.y != null) this.drawable.y = transform.y;
if (transform.scaleX != null) this.drawable.scale.x = transform.scaleX;
if (transform.scaleY != null) this.drawable.scale.y = transform.scaleY;
if (transform.rotation != null) this.drawable.rotation = transform.rotation;
}
/// <summary>
/// Generate the tweens for the current pair of transforms (currentTransform and nextTransform)
/// Dequeues the next Transform from the list of transforms.
/// Also registers all the tweens to check if al lthe tweens are done to create the next tweens
/// </summary>
createNextTweens()
{
if (this.transforms.length - 1 == this.position)
{
if (this.finalCallback != null) this.finalCallback();
return;
}
// clear the list of current tweens (maybe wait for completion)
while (this.currentTweens.length > 0)
{
var done = this.currentTweens[0];
this.currentTweens.splice(0, 1);
this.tweens.returnObject(done);
}
this.completeTweenCounter = 0;
// get the next transform
this.position++;
var nextTransform = this.transforms[this.position];
var timeDiff = nextTransform.time - this.currentTransform.time;
timeDiff *= this.timeFactor;
// Check each thing that could be tweened to see if it will be tweened
if (nextTransform.x != null && nextTransform.x != this.currentTransform.x)
{
var tween = this.tweens.getNextObject();
tween.init((x) => this.drawable.x = x, Engine.SimpleTween.easeLinear, this.currentTransform.x, nextTransform.x * this.moveFactor, timeDiff);
tween.onFinish = () => this.checkAllTweensComplete();
this.currentTweens.push(tween);
}
if (nextTransform.y != null && nextTransform.y != this.currentTransform.y)
{
var tween = this.tweens.getNextObject();
tween.init((y) => this.drawable.y = y, Engine.SimpleTween.easeLinear, this.currentTransform.y, nextTransform.y * this.moveFactor, timeDiff);
tween.onFinish = () => this.checkAllTweensComplete();
this.currentTweens.push(tween);
}
if (nextTransform.scaleX != null && nextTransform.scaleX != this.currentTransform.scaleX)
{
var tween = this.tweens.getNextObject();
tween.init((scaleX) => this.drawable.scale.x = scaleX, Engine.SimpleTween.easeLinear, this.currentTransform.scaleX, nextTransform.scaleX, timeDiff);
tween.onFinish = () => this.checkAllTweensComplete();
this.currentTweens.push(tween);
}
if (nextTransform.scaleY != null && nextTransform.scaleY != this.currentTransform.scaleY)
{
var tween = this.tweens.getNextObject();
tween.init((scaleY) => this.drawable.scale.y = scaleY, Engine.SimpleTween.easeLinear, this.currentTransform.scaleY, nextTransform.scaleY, timeDiff);
tween.onFinish = () => this.checkAllTweensComplete();
this.currentTweens.push(tween);
}
if (nextTransform.rotation != null && nextTransform.rotation != this.currentTransform.rotation)
{
var tween = this.tweens.getNextObject();
tween.init((rotation) => this.drawable.rotation = rotation, Engine.SimpleTween.easeLinear, this.currentTransform.rotation, nextTransform.rotation, timeDiff);
tween.onFinish = () => this.checkAllTweensComplete();
this.currentTweens.push(tween);
}
// Set currnet to next now that calculation is done
this.currentTransform = nextTransform;
}
goToEnd(drawable /*IAnimationActor*/, transforms /*List<Transform>*/)
{
this.drawable = drawable;
this.transforms = transforms;
if (transforms.length > 0)
{
this.applyTransform(transforms[transforms.length - 1]);
}
}
checkAllTweensComplete()
{
this.completeTweenCounter++;
if (this.completeTweenCounter >= this.currentTweens.length)
{
this.createNextTweens();
}
}
}
Engine.MultiTransformTweener.Transform = class
{
constructor(time /*float*/, x /*float?*/, y /*float?*/, scaleX /*float?*/, scaleY /*float?*/, rotation /*float?*/)
{
this.x = x != undefined ? x : 1/30;
this.y = y != undefined ? y : null;
this.scaleX = scaleX != undefined ? scaleX : null;
this.scaleY = scaleY != undefined ? scaleY : null;
this.rotation = rotation != undefined ? rotation : null;
this.time = time;
}
}