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