4)障礙物數組的導出與導入:
我們可以事先制作好一個XML模板用於存放地圖中的障礙物信息:
<?XML version="1.0" encoding="utf-8" ?>
<Item ID="Obstruction" Value="" />
當繪制出滿意的地圖障礙物並通過A*模擬測試無誤後即可將此時的障礙物數組信息進行導出保存:
//導出障礙物信息文件
private void outputMatrix_FileOk(object sender, CancelEventArgs e) {
SaveFileDialog outputMatrix = sender as SaveFileDialog;
string result = "";
for (int y = 0; y <= ObstructionMatrix.GetUpperBound(1); y++) {
for (int x = 0; x <= ObstructionMatrix.GetUpperBound(0); x++) {
if (ObstructionMatrix[x, y] == 0) {
result = string.Format("{0}{1}", result, string.Format("{0}_{1},", x, y));
}
}
}
SetXMLValue(Data, "Item", "ID", "Obstruction", "Value", result.TrimEnd(','));
Data.Save(outputMatrix.FileName);
MessageBox.Show("導出成功!");
}
以上圖為例,該圖中的障礙物信息導出後的文件內容如下:
這些障礙物數據以x_y的形式命名,並以,號間隔,因此對其重新載入也是非常容易的事:
//導入障礙物信息文件
private void loadMatrix_FileOk(object sender, CancelEventArgs e) {
OpenFileDialog loadMatrix = sender as OpenFileDialog;
try{
XElement XML = XElement.Load(string.Format(@"{0}", loadMatrix.FileName));
if (XML.HasAttributes) {
ClearGrid();
RemoveRect();
string[] matrix = GetXmlValue(XML, "Item", "ID", "Obstruction", "Value").Split(',');
for (int i = 0; i < matrix.Count(); i++) {
SetRect(string.Format("Rect_{0}", matrix[i]), new SolidColorBrush(Colors.Yellow), new SolidColorBrush(Colors.Black), GridWidthSlider.Value, GridHeightSlider.Value, 0, 0, Convert.ToInt32(matrix[i].Split('_')[0]), Convert.ToInt32(matrix[i].Split('_')[1]));
}
}
} catch {
MessageBox.Show("導入失敗!請檢文件是否匹配");
e.Cancel = true;
}
}
至於這些障礙物數據該如何才能為本教程示例游戲所用?嘿嘿~且聽下回分解。
地圖編輯器通過以上的構造及功能設置已初具雛形,但是離真正完整功能的編輯器還是有著非常大的距離。後續教程中我會根據需要,在此編輯器的基礎上不斷添加新功能,目的只有一個:使游戲設計更輕松,更快速。一定要關注哦!