接著,我將自己寫好的曼哈頓A*尋徑所有代碼封裝在QX.Game.PathFinder這個命名空間中,那麼到此才進入本文的關鍵,如何通過C#來模擬角色尋路:
首先當然是引用:using QX.Game.PathFinder;
接著我們初始化需要的變量:
Rectangle rect;
private IPathFinder PathFinder = null;
private byte[,] Matrix = new byte[1024, 1024]; //尋路用二維矩陣
private int GridSize = 20; //單位格子大小
private System.Drawing.Point Start = System.Drawing.Point.Empty; //移動起點坐標
private System.Drawing.Point End = System.Drawing.Point.Empty; //移動終點坐標
這裡要特別講解一下GridSize這個變量,它定義了窗口坐標系中以多大一個尺寸來確定游戲坐標系的一個單元格(大家可以這樣理解這兩種不同的坐標系:假如游戲窗口大小為800*600像素,那麼窗口坐標系中的(80,100)這個坐標,根據GridSize = 20來換算,在游戲坐標系中的坐標則為(80/20,100/20)=(4,5))。大家同時可以聯想一下SLG類型游戲,人物處於的每個單元格都是由N*N像素組成的方塊,GridSize就相當於N了;而該格子在游戲坐標系中的顯示坐標則為((N/20), (N/20)),這樣應該很好理解了吧。這樣根據不同的需要來使用GridSize對坐標系進行縮小(/GridSize)和放大(*GridSize)操作,從而可以非常方便的實現各種效果並且被不同的情況所調用,後面的內容及章節會涉及到相關知識。
那麼接下來我們在窗體構造函數中初始化二維矩陣,代碼如下:
public Window7() {
InitializeComponent();
ResetMatrix(); //初始化二維矩陣
}
private void ResetMatrix() {
for (int y = 0; y < Matrix.GetUpperBound(1); y++) {
for (int x = 0; x < Matrix.GetUpperBound(0); x++) {
//默認值可以通過(非障礙物)在矩陣中用1表示
Matrix[x, y] = 1;
}
}
//構建障礙物(舉例)
for (int i = 0; i < 18; i++) {
//障礙物在矩陣中用0表示
Matrix[i, 12] = 0;
rect = new Rectangle();
rect.Fill = new SolidColorBrush(Colors.Red);
rect.Width = GridSize;
rect.Height = GridSize;
CarrIEr.Children.Add(rect);
Canvas.SetLeft(rect, i * GridSize);
Canvas.SetTop(rect, 12 * GridSize);
}
//構建其他障礙物……(省略)
Start = new System.Drawing.Point(1, 1); //設置起點坐標
}
那麼有了我們前面6節的知識基礎並結合相應的注釋,這些代碼應該很容易可以接受。主要作用是定義起點,初始化矩陣中所有元素(默認都是可以通行的賦值1),然後我們可以設置些障礙物來測試我們尋徑的效果,即根據需要將矩陣中需要變成障礙物的元素賦值0,這樣我們就將所有的准備工作做好了。