C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十四) 精靈控件橫空出世!①
在上一節中,我們實現了地圖牽引式移動,同時還遺留著一個小尾巴:主角和障礙物該如何跟隨著地圖的移動而移動?
上節中有點到,只要在地圖移動的同時,時時根據主角等對象物體的X,Y坐標進行相對於地圖的X,Y坐標移動即可達到目的。但是由此又引來了新問題:主角為Image控件,障礙物則為矩形控件,它們都沒有X,Y這兩個屬性,我們該如何對它們的坐標進行記錄呢?
最簡單且最直接的方法莫過於將它們的X,Y坐標通過分隔符連接然後記錄進Tag屬性中,在調用的時候再將它分離取出。例如我們可以在構建障礙物的時候這樣做:
//構建障礙物(本節只為演示,隨便建一個)
for (int y = 11; y <= 14; y++) {
for (int x = 31; x <= 40; x++) {
//障礙物在矩陣中用0表示
Matrix[x, y] = 0;
rect = new Rectangle();
//目前暫時不新創一個自定義控件,而把坐標儲存在Tag屬性中
rect.Tag = x + "," + y;
……
}
}
其中上圖中黃色的代碼即為將障礙物的X,Y坐標記錄進它的Tag屬性,然後我們可以通過下面的函數在需要的時候對Tag屬性進行分離調用:
//從矩形障礙物的Tag屬性中分離出它的坐標Point
private Point getPointFromTag(object tag) {
string[] str = tag.ToString().Split(new char[] { ',' });
return new Point(Convert.ToDouble(str[0]), Convert.ToDouble(str[1]));
}
但是,這樣做的效率是極其低下的;更主要的是它毫無擴展性可言。障礙物還好對付,如果是主角呢?它不光有X,Y兩個屬性,還有名字、門派、血條、藍條、金木水火土、力量、智慧……、線程參數、方向、裝備代號等等等等(暈了。。。列不完的),太多太多的五花八門的屬性,難不成全都要記錄進這一個Tag屬性中?將霸王龍關進籠子裡這是件很可怕的事情,裝也難,取也難!兩個字:恐怖。
讀者聲音:老大,那該怎麼辦?搞不定難道還要上吊呀?
作者:安啦,急什麼?下面才是重點。可要認真看呀,超大一個精華!!!
如果有做過游戲開發的朋友,或者說有了解過游戲開發相關內容的朋友一定會發現,游戲中除了地圖引擎外,最關鍵的莫過於精靈的創建。精靈是游戲中大家見得最多的對象物體,它可以是主角,可以是其他玩家,可以是NPC,可以是怪物及BOSS,甚至可以是坐騎、障礙物等等。很多初學的朋友往往在為如何使用外國人制作好的通用精靈而發愁(畢竟繁雜的英文專業術語及超量的對象屬性及方法是大多數人無法輕易弄通的)。幸運的是,在WPF/Silverlight中我們可以找到強大且使用簡單的相關支持,它就是下文中我將詳細講解的傳說中的精靈控件!
我們首先來看看如何在WPF/Silverlight中創建一個精靈控件。第一步要做的是在項目中添加一個文件夾(取名Controls)來歸類保存它,接下來在該文件夾上點右鍵添加一個用戶控件(取名叫QXSpirit.xaml,嘿嘿,當然其他名字都可啦,高興就好),如下圖。