[Silverlight动画]转向行为 - 转向机车
轉(zhuǎn)向機(jī)車類繼承機(jī)車類并增加轉(zhuǎn)向行為。每個(gè)行為都被定義成公開函數(shù),在每幀或者一段時(shí)間間隔內(nèi)調(diào)用以實(shí)現(xiàn)對(duì)應(yīng)的轉(zhuǎn)向力。通常所有轉(zhuǎn)向力在調(diào)用之后再調(diào)用機(jī)車的update函數(shù)。
轉(zhuǎn)向函數(shù)都是這樣工作的:不管什么時(shí)候調(diào)用了一個(gè)轉(zhuǎn)向函數(shù),都會(huì)計(jì)算轉(zhuǎn)向力,這個(gè)力用來確定機(jī)車是順時(shí)針旋轉(zhuǎn)還是逆時(shí)針旋轉(zhuǎn)。比如,seek(尋找)函數(shù)會(huì) 計(jì)算出一個(gè)力,確保機(jī)車能從當(dāng)前方向直接面向目標(biāo)點(diǎn)。這或許會(huì)受到不止一個(gè)擁有轉(zhuǎn)向行為的機(jī)車的影響,起初的尋找點(diǎn),會(huì)在考慮避開或躲避后而改變。當(dāng)這些 力疊加后,update函數(shù)才被調(diào)用,最終把一切都反應(yīng)在機(jī)車上,并導(dǎo)致其速度的改變(方向和大小)。
public class SteeredVehicle:Vehicle{private double _maxForce = 1;private Vector2D _steeringForce;public SteeredVehicle(){_steeringForce = new Vector2D(0, 0); }public double maxForce{get{return _maxForce;}set{_maxForce = value;}}public override void update(){_steeringForce.truncate(_maxForce);_steeringForce = _steeringForce.divide(_mass);_velocity = _velocity.add(_steeringForce);_steeringForce = new Vector2D(0, 0);base.update();}}立刻進(jìn)入眼簾的是_steeringForce屬性,它是一個(gè)2D向量。該屬性作為每個(gè)行為疊加后的轉(zhuǎn)向合力。同時(shí)留意此處還有一個(gè)_maxForce屬 性,因?yàn)楝F(xiàn)實(shí)中不會(huì)有什么旋轉(zhuǎn)是一瞬間完成的,所以要對(duì)旋轉(zhuǎn)力加以限制,使其在一幀里的大小不會(huì)太離譜。可以通過公maxForce賦值對(duì)maxForce的修正,會(huì)使機(jī)車旋轉(zhuǎn)更急劇,移動(dòng)更快速,走位更準(zhǔn)確,或是出現(xiàn)一個(gè)很牛x的大甩尾。
現(xiàn)在,讓我們解剖update函數(shù)。先假設(shè)有一堆轉(zhuǎn)向行為已經(jīng)被調(diào)用,那么此時(shí)的_steeringForce屬性即是一個(gè)有意義的向量。第一個(gè) truncate(截?cái)?#xff09;函數(shù)是不讓_steeringForce超過最大作用力。然后除以(divide)機(jī)車的質(zhì)量(mass)。在現(xiàn)實(shí)中,越重的物 體有著越大的動(dòng)力,旋轉(zhuǎn)的角度也越大,而較輕的物體則旋轉(zhuǎn)更快速。接著把轉(zhuǎn)向力疊加于機(jī)車的當(dāng)前速度上,再把_steeringForce設(shè)回零向量,以 便于下一輪作用力的疊加。最終調(diào)用父類已經(jīng)實(shí)現(xiàn)的update函數(shù)。
該是了解行為實(shí)現(xiàn)的時(shí)候了,從尋找(seek)行為開始。每個(gè)行為都是轉(zhuǎn)向機(jī)車類的一個(gè)公開函數(shù),某些行為會(huì)需要新的屬性和額外的函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的[Silverlight动画]转向行为 - 转向机车的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今天微软的office 2010终于发布
- 下一篇: 用什么来评价