Podstawy XNA - Odtwarzanie dźwięków  Udostępnij na: Facebook

Autor: Norbert Blandzi

Opublikowano: 2012-03-28

Typowym zadaniem, podczas projektowania gier, jest dodawanie utworów muzycznych oraz efektów dźwiękowych. XNA dostarcza sposoby, którymi możemy posłużyć się przy dodawaniu plików audio do projektu. Możemy wykorzystać:

  • klasę SoundEffect,
  • klasę MediaPlayer oraz Song.

Przed wykonaniem zadań powinieneś:

Po wykonaniu zadań nauczysz się:

  • dodawać efekt dźwiękowy i go odtwarzać,
  • dodawać podkład muzyczny, odtwarzać go, a także zmieniać poziom głośności.

Implementacja

Twoim zadaniem będzie utworzenie aplikacji w XNA 4.0, odtwarzającej efekt dźwiękowy oraz utwór muzyczny, a także umożliwiającej manipulowanie poziomem głośności.

Dodanie plików dźwiękowych do projektu

  1. Otwórz Visual Studio i utwórz nowy projekt XNA 4.0 o nazwie Audio.
  2. Utwórz folder:
  • dodając pliki audio do projektu, warto zgromadzić je w jednym folderze, dlatego w pierwszej kolejności utwórz nowy folder, klikając na AudioContent (Content) w Solution Explorerze, a następnie wybierz Add->New Folder i nazwij go "Muzyka".
  1. Dodaj dwa pliki audio:
  • jeden z nich niech będzie efektem dźwiękowym w formacie .wav, aby go dodać kliknij prawym przyciskiem na nowo utworzony folder, a następnie wybierając Add->Existing Item w oknie, które się pojawi, kliknij dwukrotnie na pliku, który chcesz dodać. Przykładowy plik .wav możesz znaleźć w zasobach Windows, a dokładnie w folderze Windows\Media, znajdującym się na dysku systemowym,
  • drugi plik będzie piosenką w formacie .mp3, aby go dodać kliknij prawym przyciskiem na nowo utworzony folder, a następnie wybierając Add->Existing Item w oknie, które się pojawi, kliknij dwukrotnie na pliku, który chcesz dodać. Jako piosenkę .mp3 możesz wykorzystać jeden z utworów, które domyślnie znajdują się w folderze "Przykładowa muzyka", w systemie Windows,
  • po dodaniu plików, Solution Explorer powinien wyglądać, w twoim projekcie, podobnie jak ten przedstawiony na Rys. 1.

Rys. 1. Widok Solution Explorer po dodaniu plików audio.

Odtwarzanie efektów dźwiękowych

Ze względu na konieczność minimalizacji opóźnień przy rozpoczęciu odtwarzania, efekt dźwiękowy najczęściej zapisany zostaje w nieskompresowanym formacie .wav. Pliki takie są zwykle wykorzystywane, aby odtworzyć m.in. dźwięk strzału z pistoletu, ryku silnika, płynącego strumyka, a także wielu innych. W XNA znajdziemy dedykowaną klasę SoundEffect do odtworzenia pliku w tym formacie.

  1. Dodawanie efektu:
  • przejdź do metody LoadContent(), i po linijce // TODO wpisz następujący kod:
SoundEffect efekt = Content.Load<SoundEffect>(@"Muzyka/whistle");
efekt.Play();
  • teraz wystarczy skompilować i uruchomić projekt, naciskając przycisk F5, i jeżeli wszystko wykonałeś poprawnie, to usłyszysz dodany dźwięk.

Odtwarzanie piosenek

Pojedyncze efekty dźwiękowe oczywiście nie wystarczą. Każda dobra gra posiada muzykę w tle. W XNA, do tego celu zostały zaproponowane klasy Song oraz MediaPlayer. Klasa Song pozwala na dołączenie utworów w formatach .wav, .wma oraz .mp3. Natomiast klasa MediaPlayer pozwala na ich odtwarzanie.

Dodawanie i odtwarzanie utworów muzycznych:

  • skomentuj dwie dodane przed chwilą linijki, stawiając przed nimi "//", zaznaczając je i wykorzystując skrót Ctrl+K+C,
  • pod skomentowanym kodem dodaj:
Song piosenka = Content.Load<Song>(@"Muzyka/Kalimba");
MediaPlayer.Play(piosenka);
  • teraz wystarczy skompilować i uruchomić projekt, naciskając przycisk F5, i jeżeli wszystko wykonałeś poprawnie, to usłyszysz dodaną piosenkę.

Zmiana głośności

Klasa MediaPlayer pozwala na zmianę głośności odtwarzanej piosenki. Wykorzystamy to i dodamy efekt „falowania” głośności, od minimalnej do maksymalnej wartości.

  1. Dodaj pole do klasy Game1:
  • w klasie Game1, poniżej linii SpriteBatch spriteBatch; dodaj:
bool UpDown;
  1. Zainicjalizuj UpDown:
  • w metodzie Initialize(), po linijce //To DO: dodaj:
UpDown=true;
  1. Dodaj kod odpowiedzialny za falowanie dźwięku:
  • w metodzie Update(), po linijce //To DO: dodaj:
if(UpDown)
{         
    MediaPlayer.Volume += 0.01f;
    if (MediaPlayer.Volume == 1)
    {
        UpDown = false;
    }
}else  
{
    MediaPlayer.Volume -= 0.01f;
    if (MediaPlayer.Volume == 0)
    {
        UpDown = true;
    }
}
Informacja
Te dwa warunki odpowiedzialne są za zmianę wartości głośności w zakresie (0,1). Gdy wartość odpowiedzialna za poziom głośności równa jest 1, zmieniamy wartość pola UpDown na false, co powoduje, iż przy następnych wywołaniach metody Update(), wartość poziomu głośności zostanie zmniejszona, aż do wartości 0. Wtedy zmieniamy wartość pola UpDown na true, i cały proces jest powtarzany. Metoda Update() jest wywoływana 60 razy na sekundę (30 razy w przypadku aplikacji na Windows Phone).
  • teraz wystarczy skompilować i uruchomić projekt, naciskając przycisk F5, i jeżeli wszystko zostało zrobione poprawnie, usłyszysz dodaną piosenkę ze zmieniającą się głośnością.

Podsumowanie

W tym artykule nauczyliśmy się dodawać i odtwarzać efekty dźwiękowe oraz piosenki w XNA, a także zmieniać poziom ich głośności.

W kolejnym artykule nauczymy się, jak poruszyć świat w XNA.

Zadanie

W celu sprawdzenia swoich umiejętności, spróbuj odtworzyć piosenkę w XNA z możliwością zmiany poziomu głośności, wykorzystując strzałki w górę i w dół, oraz z możliwością wstrzymywania i wznawiania piosenki poprzez naciśnięcie klawisza ENTER.

Aby zobaczyć podpowiedzi i rozwiązania zadań przełącz widok tej strony na >> klasyczny <<.

  • do sprawdzenia wciśniętego klawisza wykorzystaj metodę Keyboard.GetState().IsKeyDown(klawisz), zwracającą wartość true lub false, w zależności czy wciśnięto oczekiwany klawisz (strzałka w górę = Keys.Up, strzałka w dół = Keys.Down, klawisz ENTER = Keys.Enter).
  • wykorzystaj klasę MediaPlayer,
  • klasa MediaPlayer posiada metody Pause() oraz Resume(),
  • do sprawdzenia aktualnego stanu odtwarzania zastosuj klasę MediaState i jej właściwość Playing.
  • dodaj do metody Initialize():
Song efekt = Content.Load<Song>(@"Muzyka/Kalimba");
MediaPlayer.Play(efekt);
  • dodaj w metodzie Update():
if(Keyboard.GetState().IsKeyDown(Keys.Down))
{
    MediaPlayer.Volume -= 0.01f;
    if (MediaPlayer.Volume < 0)
    {
        MediaPlayer.Volume = 0;
    }
}else if (Keyboard.GetState().IsKeyDown(Keys.Up))
    {
        MediaPlayer.Volume += 0.01f;
        if (MediaPlayer.Volume > 1)
        {
            MediaPlayer.Volume = 1;
        }
}else if (Keyboard.GetState().IsKeyDown(Keys.Enter))
{
    if (MediaPlayer.State == MediaState.Playing)
    {
        MediaPlayer.Pause();
    }else
    {
        MediaPlayer.Resume();
    }
}