WP XNA 1: Zapisywanie stanu gry/aplikacji (IsolatedStorageSettings)

Ten wpis jest częścią cyklu o moich przygodach w tworzeniu gier XNA dla Windows Phone.

Nie ma nic bardziej frustrującego dla zapalonego gracza, gdy po 2 godzinach grania mierzy się z ostatnim bossem, już prawie go zabija… gdy nagle… dzwoni mama! Gra zostaje przerwana i cały postęp gry leci w kosmos…

Wiem! Ktoś powie, że w Mango mamy Fast Application Switching (FAS) i stan aplikacji jest  w pamięci i gra zostanie automatycznie wznowiona. Tak, ale jeśli nasz przywołany gracz po rozmowie z mamą nie wróci do gry i będzie chciał ją dokończyć jutro, mamy niemal pewność, że naszej gry nie będzie już w pamięci i mamy problem.

Z pomocą przychodzi klasa IsolatedStorageSetting. W skrócie jest to słownik, do którego możemy wrzucać obiekty, a po ponownym uruchomieniu odczytać jego zawartość.

Ale aby jeszcze łatwiej używać tego mechanizmu proponuję utworzyć własną klasę (providera), który ułatwi odczyt i zapis do IsolatedStoregeSettings:

public static class IsolatedStorageSettingsProvider
{
	public static void SetValue(string key, T value)
	{
		if (IsolatedStorageSettings.ApplicationSettings.Contains(key))
			IsolatedStorageSettings.ApplicationSettings[key] = value;
		else
			IsolatedStorageSettings.ApplicationSettings.Add(key, value);
	}

	public static T GetValueOrDefault(string key, T defaultValue)
	{
		if (IsolatedStorageSettings.ApplicationSettings.Contains(key))
			return (T) IsolatedStorageSettings.ApplicationSettings[key];
		else
		{
			IsolatedStorageSettings.ApplicationSettings.Add(key, defaultValue);
			return defaultValue;
		}
	}
}

Nic odkrywczego. Powyższy kod pochodzi tak na prawdę z postu na blogu Maćka Grabka, ale jest to bardzo fajne i wygodne, że sam zacząłem używać.

Mając tak owrapowany IsolatedStorageSettings możemy np. utworzyć statyczną klasę Settings (do trzymania ustawień opcji użytkownika):

public static class Settings
{
	public static bool SoundEnabled
	{
		get { return IsolatedStorageSettingsProvider.GetValueOrDefault("SettingsSoundEnabled", true); }
		set { IsolatedStorageSettingsProvider.SetValue("SettingsSoundEnabled", value); }
	}

	public static float MusicVolume
	{
		get { return IsolatedStorageSettingsProvider.GetValueOrDefault("SettingsMusicVolume", 0.5f); }
		set { IsolatedStorageSettingsProvider.SetValue("SettingsMusicVolume", value); }
	}
}

To oczywiście tylko przykład. Zapisywać możesz nie tylko typy proste, ale i złożone klasy. Przykładowo jeśli masz stan całej gry w klasie Game, GameManager to zapisz go do IsolatedStorageSettings przy użyciu naszego providera.

Pamiętaj tylko, że zapisywana klasa musi się dać serializować!

Zachęcam do komentowania. Wszelkie uwagi, pytania, wasze rozwiązania czy znalezione u mnie błędy bardzo mile widziane 🙂

Reklamy

3 thoughts on “WP XNA 1: Zapisywanie stanu gry/aplikacji (IsolatedStorageSettings)

  1. Pingback: WP XNA: 0 Wstęp | Wojciech Poniatowski [PL]

  2. Pingback: dotnetomaniak.pl

  3. Pingback: WP XNA 2: Ustawienia (Settings) | Wojciech Poniatowski [PL]

Możliwość komentowania jest wyłączona.