///
module es {
/**
* 对任何与Transform相关的属性tweens都是有用的枚举
*/
export enum TransformTargetType {
position,
localPosition,
scale,
localScale,
rotationDegrees,
localRotationDegrees,
}
/**
* 这是一个特殊的情况,因为Transform是迄今为止最被ween的对象。
* 我们将Tween和ITweenTarget封装在一个单一的、可缓存的类中
*/
export class TransformVector2Tween extends Vector2Tween implements ITweenTarget {
private _transform: Transform;
private _targetType: TransformTargetType;
public setTweenedValue(value: Vector2) {
switch (this._targetType) {
case TransformTargetType.position:
this._transform.position = value;
break;
case TransformTargetType.localPosition:
this._transform.localPosition = value;
break;
case TransformTargetType.scale:
this._transform.scale = value;
break;
case TransformTargetType.localScale:
this._transform.localScale = value;
break;
case TransformTargetType.rotationDegrees:
this._transform.rotationDegrees = value.x;
case TransformTargetType.localRotationDegrees:
this._transform.localRotationDegrees = value.x;
break;
}
}
public getTweenedValue(): Vector2 {
switch (this._targetType) {
case TransformTargetType.position:
return this._transform.position;
case TransformTargetType.localPosition:
return this._transform.localPosition;
case TransformTargetType.scale:
return this._transform.scale;
case TransformTargetType.localScale:
return this._transform.localScale;
case TransformTargetType.rotationDegrees:
return new Vector2(this._transform.rotationDegrees, this._transform.rotationDegrees);
case TransformTargetType.localRotationDegrees:
return new Vector2(this._transform.localRotationDegrees, 0);
}
}
public getTargetObject() {
return this._transform;
}
public setTargetAndType(transform: Transform, targetType: TransformTargetType) {
this._transform = transform;
this._targetType = targetType;
}
protected updateValue() {
// 非相对角勒普的特殊情况,使他们采取尽可能短的旋转
if ((this._targetType == TransformTargetType.rotationDegrees ||
this._targetType == TransformTargetType.localRotationDegrees) && !this._isRelative) {
this.setTweenedValue(Lerps.easeAngle(this._easeType, this._fromValue, this._toValue, this._elapsedTime, this._duration));
} else {
this.setTweenedValue(Lerps.ease(this._easeType, this._fromValue, this._toValue, this._elapsedTime, this._duration));
}
}
public recycleSelf() {
if (this._shouldRecycleTween) {
this._target = null;
this._nextTween = null;
this._transform = null;
Pool.free(Vector2Tween, this);
}
}
}
}