_tweenF = tweenF;
}
public void Update(double elapsedTime)
{
_totalTimePassed += elapsedTime;
_current = _tweenF(_totalTimePassed, _original, _distance,
_totalDuration);
if (_totalTimePassed > _totalDuration)
{
_current = _original + _distance;
_finished = true;
}
}
}
Tween类有两个构造函数,它们都调用了Construct方法。构造函数允许用户指定补间函数的类型,或者使用默认的随时间线性变化。补间函数通过TweenFunction委托定义。TweenFunction委托在这个类中的唯一实现是Linear函数。在默认构造函数中可以看到它的用法。
Construct(start, end, time, Tween.Linear);
Construct方法记录了补间的初始值、最终值和执行补间操作的时间。也可以传入一个补间函数来确定值随时间如何变化。Construct方法可记录这些值,并计算出从初始值到最终值之间的距离。该距离将被传递给相关的补间函数。
Tween对象将在每一帧中更新,经过的时间在每一次更新调用中将被累加。这样Tween对象就知道补间的进度。补间函数的委托会修改补间的当前值。最后,更新函数会检查补间是否结束,如果结束,则将结束标记设为true。
如果只有一个线性函数,Tween类就没有那么有价值了。下面列出了其他一些可以添加到Tween类的函数,图8-20中也显示了它们。
public static double EaseOutExpo(double timePassed, double start, double
distance, double duration)
{
if (timePassed == duration)
{
return start + distance;
}
return distance * (-Math.Pow(2, -10 * timePassed / duration) + 1) + start;
}
public static double EaseInExpo(double timePassed, double start, double
distance, double duration)
{
if (timePassed == 0)
{
return start;
}
else
{
return distance * Math.Pow(2, 10 * (timePassed / duration - 1)) + start;
}
}
public static double EaseOutCirc(double timePassed, double start, double
distance, double duration)
{
return distance * Math.Sqrt(1 - (timePassed = timePassed / duration - 1) *
timePassed) + start;
}
public static double EaseInCirc(double timePassed, double start, double
distance, double duration)
{
return -distance * (Math.Sqrt(1 - (timePassed /= duration) * timePassed)
- 1) + start;
}