Muzyka gra

W tym wpisie zajmiemy się muzyką odtwarzaną w menu oraz podczas rozgrywki, a także efektami dźwiękowymi jakie będą się pojawiać, gdy gracz odda strzał lub gdy zbierze prezent. Biblioteka libGDX do tego celu posiada specjalnie przygotowane klasy, posiadające odpowiednie metody, takie jak: play(), stop() czy pause(). Klasy o których mowa to Music oraz Sound.

Music jest odpowiedzialna za odtwarzanie długich plików muzycznych.

Sound wykorzystywany jest do odtwarzania krótkich plików audio, które mogą być odtwarzane wiele razy równolegle.

Warto pamiętać, że po zakończeniu odtwarzania, należy, korzystając z metody dispose() oczyścić pamięć.

Pliki audio

Muzyka będzie odtwarzana w chwili, gdy jesteś w menu oraz podczas rozgrywki. Będą to dwa różne pliki muzyczne.

Efekty dźwiękowe będą towarzyszyć nam podczas rozgrywki, gdy gracz odda strzał oraz gdy zbierze prezent.

Implementacja

Muzyka

Na początek zajmiemy się odtwarzaniem muzyki w naszej grze. Przejdźmy zatem do klasy Game.java i tam utwórzmy nowe pole z interesującą nas klasą.

Podczas rozgrywki

private Music atackMusic;

Następnie w konstruktorze musimy w argumencie przekazać uchwyt do pliku z rozszerzeniem .wav, .ogg oraz .mp3.

atackMusic = Gdx.audio.newMusic(Gdx.files.internal("music/atack.ogg"));

Metodą play() mamy możliwość uruchomienia muzyki, co też robimy w konstruktorze.

atackMusic.play();

Musimy jednak pamiętać, że muzyka musi być zatrzymana, gdy gracz przegra. Dlatego znajdujemy kod odpowiedzialny za wczytanie ekranu kończącego rozgrywkę i dodajemy tam metodę stop().

if(player.getHp() < 1 || baza.getHp() < 1) {
   atackMusic.stop();
   game.setScreen(new End(game, player));
}

W ten sposób obsłużyliśmy muzykę odtwarzaną podczas potyczki. Teraz czas na muzykę, którą będziemy słyszeć w menu.

W menu

Przechodzimy teraz do klasy UWar.java, czyli klasy odpowiedzialnej za wczytanie klasy Menu.java.

Dodajemy nowe pole.

private Music music;

Inicjalizujemy je w podobny sposób jak miało to miejsce wcześniej.

music = Gdx.audio.newMusic(Gdx.files.internal("music/menu.ogg"));

Z tą różnicą, że teraz przekazujemy instancję wczytanej muzyki do klasy Menu.java. Zatem nasza klasa odpowiedzialna za wyświetlanie menu głównego, zyskała nowy parametr klasy Music.

Przekazujemy referencję do obiektu, ze względu na to, żeby w momencie zmiany menu np. wchodząc do sceny wyświetlającej autora gry, powracając do menu głównego, mieć dalej nad nim kontrolę, aby móc go wyłączyć po wybraniu przycisku Graj.

Dlatego konstruktor w pliku Author.java, również ma nowy parametr klasy Music.

Przystępując do dalszej implementacji, w pliku Game.java dodajemy nowe pole.

private Music menuMusic;

Inicjalizujemy w konstruktorze nową zmienną i puszczamy muzykę.

menuMusic = music; menuMusic.play();

W momencie kliknięcia przycisku Graj, wyłączamy muzykę, wywołując metodę stop().

menuMusic.stop();

Zaś, gdy gracz kliknie przycisk Autor, musimy przekazać referencję przez argument.

game.setScreen(new Author(game, menuMusic));

Podobny zabieg tworzymy w pliku Author.java.

Dodajemy nowe pole.

private Music music;

Inicjalizujemy je wartością z parametru.

this.music = music;

I przekazujemy w momencie kliknięcia przycisku Wróć.

game.setScreen(new Menu(game, music));

W klasie End.java również odtwarzamy dźwięk, ten sam, który jest odtwarzany w menu. Jednak tam nie musimy przekazywać przez parametr, ponieważ nie wiemy jak długo będzie toczyła się potyczka gracza.

Z tego powodu, muzyka tam odtwarzana, będzie w taki sam sposób jak miało to miejsce w przypadku muzyki podczas rozgrywki, dlatego nie będę tego elementu opisywał.

Efekty dźwiękowe

Przyszedł czas na dodanie efektów dźwiękowych. Jak już wspominałem wcześniej, jeden z nich będzie odtwarzany przy strzale bohatera, zaś drugi w momencie zebrania prezentu.

Strzał

Teraz zajmiemy się dźwiękiem strzałów.

Do klasy Game.java dodajemy nowe pole.

private Sound shootSound;

Inicjalizujemy je, podając uchwyt pliku jako argument konstruktora.

shootSound = Gdx.audio.newSound(Gdx.files.internal("sound/shoot2.wav"));

Znajdujemy kod odpowiedzialny za dodanie strzału do naszej kolekcji i dam uruchamiamy nasz dźwięk.

(Cały warunek na dodanie strzału)

if(timeShoot > 0.2){ 
   strzaly.add(new Shoot(player.x + player.getTexture().getWidth() / 2 - 5, player.y + player.getTexture().getHeight() / 2 - 5, 1, player.getDirection())); 
   timeShoot = 0; shootSound.play(); 
}

Prezent

W podobny sposób teraz dodajemy kod odpowiedzialny za odtworzenie dźwięku podczas zebrania prezentu.

Nowe pole.

private Sound giftSound;

Inicjalizacja nowego pola.

giftSound = Gdx.audio.newSound(Gdx.files.internal("sound/gift.wav"));

Warunek kolizji bohatera z prezentem. W chwili kolizji zostaje odtworzony dźwięk.

      for(Iterator<Gift> it = giftLinkedList.iterator(); it.hasNext();) {
            Gift gift = it.next();
            Rectangle rec = new Rectangle(player.x - player.radius, player.y - player.radius, player.radius * 2,player.radius * 2);
            if(gift.overlaps(rec)){
                if(player.getGiftType() == -1){
                        player.setGiftTime(15);
                        player.setGiftType(gift.getType());
                        giftSound.play();
                    it.remove();
                    gift.getGift(player, potwory, strzaly,strzalyPotworow, myinterface);
                }
            }
        }

Prezentacja

Podsumowanie

W prosty sposób dodaliśmy do naszej gry muzykę oraz efekty dźwiękowe, które poprawiają jakość odbioru naszej produkcji. To kolejny krok w drodze do ukończenia naszego projektu i podzielenia się nim z Wami, czytelnicy.

Pozdrawiam,

sirmarbug

Podziel się ze znajomymi