XNA-存檔與載入
要儲存檔案和載入檔案必須先將GamerServicesComponent加入Component內,如下程式碼:
public Game1() {
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
Components.Add(new GamerServicesComponent(this));
}
這個GamerServicesComponent不只關係到儲存裝置,也和XBOX360網路功能有關係,加入之後會出現下面的登入畫面:
然後在Update函式內加入下面的程式碼片段:
KeyboardState ks = Keyboard.GetState();
if (!Guide.IsVisible) {
if (ks.IsKeyDown(Keys.S)) {
Guide.BeginShowStorageDeviceSelector(FindStorageDevice, null);
}
}
Guide.BeginShowStorageDeviceSelector第一個參數是回呼函式,第二的參數是要傳給此函式的物件,
呼叫他時,在XBOX360的情況下會開啟dialog,並在dialog關閉後,呼叫回呼函式。
因為他是非同步的,所以dialog開啟時遊戲依然繼續進行,所以我們要藉由Guide.IsVisible檢查是不是已經開啟了。
此例中當dialog關閉後,會呼叫FindStorageDevice函式,他的程式碼如下:
private void FindStorageDevice(IAsyncResult result) {
StorageDevice sd = Guide.EndShowStorageDeviceSelector(result);
if (sd != null) {
StorageContainer container = sd.OpenContainer("SaveDemo");
string filePath = Path.Combine(container.Path, "save001.sav");
File.WriteAllText(filePath, "存檔的內容");
}
}
StorageDevice就是我們選擇的儲存裝置,
OpenContainer會以傳入的參數為名稱,建立一個目錄,然後根據呼叫Guide.BeginShowStorageDeviceSelector時決定的玩家順序在建立一個目錄,
但是因為我們在呼叫的時候沒有告訴他是幾號玩家,所以檔案會存在AllPlayers的目錄裡,然後我們就可以再此目錄下做檔案的存取。
若是要分開每個玩家的檔案,呼叫Guide.BeginShowStorageDeviceSelector的時候傳入玩家順序就可以。
在windows環境下,存檔位置會統一在My Document\SavedGames的目錄下。
所以此例最終會在My Document\SavedGames\SaveDemo\AllPlayers此目錄下存了一個save001.sav的檔案。
至於對檔案的處理方式就和一般應用程式一樣了,你想存什麼都可以,這裡就不多說。