_tweenF = tweenF;
}
public void Update(double elapsedTime)
{
_totalTimePassed += elapsedTime;
_current = _tweenF(_totalTimePassed, _original, _distance,
_totalDuration);
if (_totalTimePassed > _totalDuration)
{
_current = _original + _distance;
_finished = true;
}
}
}
Tween類有兩個構(gòu)造函數(shù),它們都調(diào)用了Construct方法。構(gòu)造函數(shù)允許用戶指定補間函數(shù)的類型,或者使用默認(rèn)的隨時間線性變化。補間函數(shù)通過TweenFunction委托定義。TweenFunction委托在這個類中的唯一實現(xiàn)是Linear函數(shù)。在默認(rèn)構(gòu)造函數(shù)中可以看到它的用法。
Construct(start, end, time, Tween.Linear);
Construct方法記錄了補間的初始值、最終值和執(zhí)行補間操作的時間。也可以傳入一個補間函數(shù)來確定值隨時間如何變化。Construct方法可記錄這些值,并計算出從初始值到最終值之間的距離。該距離將被傳遞給相關(guān)的補間函數(shù)。
Tween對象將在每一幀中更新,經(jīng)過的時間在每一次更新調(diào)用中將被累加。這樣Tween對象就知道補間的進度。補間函數(shù)的委托會修改補間的當(dāng)前值。最后,更新函數(shù)會檢查補間是否結(jié)束,如果結(jié)束,則將結(jié)束標(biāo)記設(shè)為true。
如果只有一個線性函數(shù),Tween類就沒有那么有價值了。下面列出了其他一些可以添加到Tween類的函數(shù),圖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;
}