Gry w odróżnieniu do aplikacji „biznesowych” często wydają z siebie dźwięki i muzykę. W wytycznych certyfikacji na Windows Phone Marketplace znajdziemy zapisy, które regulują co w kwestii dźwięków jest wymagane z naszej strony. Poniżej przedstawię przydatną klasę SoundProvider, która uprości nam zarządzanie dźwiękiem.
Ten wpis jest częścią cyklu o moich przygodach w tworzeniu gier XNA dla Windows Phone.
WP Marketplace wymaga m.in od nas aby użytkownik mógł wyłączyć efekty dźwiękowe i muzykę (dodatkowo można regulować poziom głośności muzyki).
Mój SoundProvider jest połączeniem repozytorium dźwięków i managera, który je odtwarza. I pewnie można by go rozdzielić na dwie klasy, bo w sumie robi 2 różne rzeczy. Ale w tym przykładzie niech zostanie tak jak jest, bo dźwieków mam mało do grania. Oczywiście w większym projekcie będzie można pomyśleć o jakimś refaktoringu.
SoundProvider zawiera szereg statycznych pół, które są typu SoundEffect (klasa z frameworka XNA), które są instancjami poszczególnych efektów dźwiękowych. Podobnie jak we wcześniej opisywanej klasie Texture musimy mieć możliwość załadowania dźwieków do pamięci. Metodę LoadSounds wywołujemy odpowiednio wcześniej.
using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; namespace SpaceBridge { public static class SoundProvider { public static SoundEffect AstronautMove; public static SoundEffect AstronautCrash; public static SoundEffect Score; public static SoundEffect ButtonPressed; public static void LoadSounds(ContentManager contentManager) { AstronautMove = contentManager.Load("Sounds/Move"); AstronautCrash = contentManager.Load("Sounds/Crash"); Score = contentManager.Load("Sounds/Score"); ButtonPressed = contentManager.Load("Sounds/button_pressed"); } public static void Play(SoundEffect sound) { Play(sound, Settings.Sound.Volume, 0f, 0f); } public static void Play(SoundEffect sound, float volume, float pitch, float pan) { if (Settings.Sound.Enabled) sound.Play(volume, pitch, pan); } } }
Na końcu klasy widzimy metodę Play (jej 2 przeciążenia). Play pozwala na odtworzenie wskazanego w parametrze dźwięku, ale dodatkowo uwzględnia ustawienia dźwięku w naszej aplikacji. Klasa Settings (również wcześniej opisywana) przechowuje informację o tym, czy dźwięk jest włączony czy wyłączony. Poziom głośności dźwieku również pobierany jest z ustawień. Czyli mamy wygodny wrapper, który zajmuje się wszystkim co istotne.
Teraz kod wywołujący dźwięk jest bardzo prosty:
private void ChangeGameStateToLifeLost() { SoundProvider.Play(SoundProvider.AstronautCrash); game.State = GameState.LifeLost; }
Zachęcam do komentowania. Wszelkie uwagi, pytania, wasze rozwiązania czy znalezione u mnie błędy bardzo mile widziane 🙂
Pingback: WP XNA 0: Wstęp | Wojciech Poniatowski [PL]
Pingback: dotnetomaniak.pl