程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十六)(1)

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十六)(1)

編輯:關於C語言

C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十六) 牽引式地圖移動模式②

精靈控件讓游戲開發更美好!有了它,離完善牽引式地圖移動模式可謂一步之遙。只剩下最後一個環節了,大家加油吧。

上一節,(C#開發WPF/Silverlight動畫及游戲系列教程(Game Course):(十五) 精靈控件橫空出世!② )我在界面線程中通過時時設置Canvas.SetLeft(Spirit, mapleft + Spirit.X);和Canvas.SetTop(Spirit, maptop + Spirit.Y);來實現主角跟隨著地圖移動。從該公式我們可以分析出影響主角在窗口中顯示位置的兩個因素:第一個為地圖圖片(Image Map)相對於窗口的位置(Canvas.GetLeft(Map),Canvas.GetTop(Map)),它是在鼠標牽引地圖移動的時候時時改變的,與主角在地圖上的走動無關;第二個則為主角自身的X,Y坐標屬性(Spirit.X,Spirit.Y),當主角在地圖上走動時,它是時時更改的。由此可以得到一個結論:要實現主角在此模式地圖上的移動,只需要在它走路的時候時時更新它的坐標Spirit.X和Spirit.Y即可,這樣界面線程中會同步更新主角在窗口中的位置而達到完美的游戲動畫銜接。

找到了切入點,那麼實現起來就簡單多了。

這裡,我們首先需要對前面章節中的A*尋路方法進行一些改進。在前面的章節中,由於地圖是固定死不動的,且尺寸相當於窗口大小,這樣我們簡單的將地圖和窗口示為一體。因此,在A*尋路過程(AStarMove())中同時實現了主角相對於地圖的移動,即基於對象依賴屬性為PropertyPath("Canvas.Left"), PropertyPath("Canvas.Top")的Storyboard動畫。但是在牽引式地圖移動模式中就不能這樣做了,根據前面分析的原理,則必須改為基於對象依賴屬性為PropertyPath("X"),PropertyPath("Y")的Storyboard動畫。此時的動畫或許將之理解為從尋路得到的路徑序列點中連續取出坐標的計時器更加貼切,因為它只負責改變Spirit的X,Y屬性而不負責在界面中更新Spirit的位置實現動畫。但是這已經足夠了,因為它已經滿足了原理中更新精靈坐標Spirit.X和Spirit.Y的目的(剩下的任務交由界面線程去做就好了,代碼與上一節中的一樣,我們不需要理會)。那好,接下來就看我如何對A*尋路再次進行改造(可別怕,目前的A*尋路Storyboard動畫方法已經是很成熟的了,只需要對它的幾個關節進行修改即可以達到不同的使用目的,其實在第九節、第十節中已經對其進行過修改了)。

首先定義兩個函數SpiritGameX、SpiritGameY用於將主角在地圖坐標系中的坐標換算成游戲尋路坐標系中的坐標:

int GridSize = 20; //單位格子大小
int SpiritCenterX = 4; //主角腳底離主角圖片左邊的距離(尋路坐標系中)
int SpiritCenterY = 5; //主角腳底離主角頂部的距離(尋路坐標系中)
//將主角的坐標換算成游戲坐標系中的坐標(縮小操作)
int GameSystemX {
 get { return ((int)(Spirit.X) / GridSize) + SpiritCenterX; }
}
int GameSystemY {
 get { return ((int)(Spirit.Y) / GridSize) + SpiritCenterY; }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved