說到群落,很難不引用craig reynolds和他的"boilds"模擬系統。reynolds很牛的將乙個看似非常恐怖的複雜過程,拆成了幾個比較簡單的行為。
想想鳥群,它含有三個主要角色:
首先,鳥們都保持在同乙個區域。如果有只鳥離隊伍遠了,就該馬上歸隊。這叫凝聚。如圖
其次,儘管鳥們都在一起飛,但是要避免不會互相碰到。為此,它們各自都有乙個空間來預防其它鳥太接近。這叫分離。
最後,鳥們飛行在同乙個方向。當然各自的角度不一定相同,但是大方向是差不多的。這叫佇列。
這三個行為凝聚、分離和佇列組成了複雜的群落行為。
當考慮鳥群時,就以整個群落是一條心去想象,或者認為每個鳥都充分認識群中的其它鳥。我不想為此去爭論什麼,但我要說,當開始理解這三個行為,何以促成群落 行為時,你會發現,每個鳥根本不需要知道多少東西,也不需要什麼民主集中一條心來指揮群落。實際上,每個鳥就只需要看看臨近的幾隻夥伴。如果靠太近就離遠 點,如果方向差太多就轉過來點,最終以此形成了傳說中的群落行為。
儘管群落行為技術上被拆成了三個子行為,然而它們幾乎總是**出現的。一般不太會只對角色使用其中一兩個行為,所以就把這仨放於同乙個函式中好了。這樣效率也高,避免要做三次迴圈。
public void flock(listvehicles) }}
if (insightcount>0)
}
首先,傳遞乙個持有機車的陣列。通過遍歷這個陣列找出進入視野的其它機車。把進入視野的機車的速度和位置都加起來,然後統計次數,最後以此求得平均值。如果機車靠太近,用避開函式離開之,以此實現分離。唯一要注意的地方就是處理過程中對自身的忽略。
當走完整個陣列,算出平均速度和位置後,尋找平均位置,疊加平均轉向力即完成任務。
似乎沒啥了不起,不過有幾個函式我們還沒介紹呢,視野中(insight)和太接近(tooclose):
insight 函式判定乙個機車是否能看到另乙個機車。為此,先要檢測兩者間距離是否在視野範圍內,如果不是就返回false。接著用向量的數**算判斷機車的前後關 系,這裡採用的實現方式比較死板,只認前方的機車,在後面就當作看不見。這個做做例子夠用了,如果要作改進,可以先考慮做乙個可變化的視野範圍。窄的視野 範圍意味著角色只能沿著視野方向,注意不到兩邊,寬的視野意味著角色可以看到邊上的一些東西。不同的視野範圍,會導致不同的群落模式。
再來是tooclose函式,這個簡單的不想說了。
private double _insightdist = 200;
private double _tooclosedist = 60;
private bool tooclose(vehicle vehicle)
private bool insight(vehicle vehicle)
vector2d heading = _velocity.clone().normalize();
vector2d difference = vehicle.position.subtract(_postion);
double dotprod = difference.dotprod(heading);
if (dotprod<0)
return true;
}
測試:
public partial class flocktest : usercontrol
void flocktest_loaded(object sender, routedeventargs e)
compositiontarget.rendering += new eventhandler(compositiontarget_rendering);
}void compositiontarget_rendering(object sender, eventargs e)}}
Silverlight初級教程 動畫
在這一節裡將要用到在 認識工作區 中提到的時間抽了。這裡將和學習flash的過程一樣做乙個最簡單的動畫。silverlight中的動畫是以 storyboard 的形式表現出來。storyboard 你可以認為是flash中的時間軸。flash中只有乙個時間軸,而在silverlight中卻可以有多...
Silverlight製作逐幀動畫
打算用sl來製作乙個遊戲,我曾經有flash開發遊戲的經驗.現在想用sl來做.打算記錄下我開發遊戲探索的過程.開啟 這個 這裡有很多遊戲的gif動畫.選乙個存到本地用fireworks開啟.將其中的不同幀的取出做成乙個png的圖形.如下圖所示 用vs08建立sl專案.新建立資料夾controls.在...
Silverlight實現星星閃爍動畫
原理很簡單,生成1000個圓,從隨機數來布置它們的位置,通過動畫來處理它們的透明度,動畫時長也是隨機生成。1 建立圖形陣列並設定背景透明,漸變筆觸,大小等,而後加入到grid元素的子元素集中 2 建立動畫時間線 3 載入完成後播程式設計客棧放動畫 4 每一輪動畫 完畢後,重新隨機生成一下圖形的mar...