XNA-存檔與載入

XNA-存檔與載入

要儲存檔案和載入檔案必須先將GamerServicesComponent加入Component內,如下程式碼:

 


public Game1() {
	graphics = new GraphicsDeviceManager(this);
	Content.RootDirectory = "Content";

	Components.Add(new GamerServicesComponent(this));
}

這個GamerServicesComponent不只關係到儲存裝置,也和XBOX360網路功能有關係,加入之後會出現下面的登入畫面:

image 

然後在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的檔案。

至於對檔案的處理方式就和一般應用程式一樣了,你想存什麼都可以,這裡就不多說。