This is the Polish translation of In-Practice/2D-Game/Audio article of learnopengl.com tutorial series.
Bez względu na to, jak bardzo zwiększymy głośność gry, najprawdopodobniej nie usłyszymy dźwięku z gry; mamy już tak wiele do pokazania, ale bez żadnego dźwięku gra wciąż wydaje się nieco pusta. W tym samouczku naprawimy to.
OpenGL nie oferuje nam żadnej obsługi funkcji audio (jak wiele innych aspektów tworzenia gier). Musimy ręcznie załadować pliki audio do zbioru bajtów, przetworzyć je i skonwertować na strumień audio oraz odpowiednio zarządzać wieloma strumieniami audio w naszej grze. Jest to jednak nieco skomplikowane i wymaga niskopoziomowej wiedzy z zakresu inżynierii dźwięku.
Jeżeli czujesz się na siłach, możesz ręcznie załadować strumienie audio z kilku rozszerzeń plików audio. Będziemy jednak korzystać z biblioteki do zarządzania dźwiękiem o nazwie irrKlang.
Irrklang
IrrKlang to wysokopoziomowy silnik dźwięku 2D i 3D (Windows, Mac OS X, Linux) oraz biblioteka audio, która odtwarza pliki WAV, MP3, OGG i FLAC. Zawiera również kilka efektów dźwiękowych, takich jak reverb, delay i distortion, które można w dużym stopniu zmodyfikować.
Dźwięk 3D oznacza, że źródło dźwięku może mieć położenie 3D, które będzie tłumić jego głośność w oparciu o odległość kamery od źródła dźwięku, co sprawi, że poczujesz się naturalnie w świecie 3D (pomyśl o strzałach w świecie 3D, najczęściej będziesz w stanie usłyszeć, skąd pochodzi dany dźwięk).
IrrKlang jest łatwą w użyciu biblioteką audio, która może odtwarzać większość plików audio za pomocą zaledwie kilku linii kodu, dzięki czemu jest idealnym kandydatem dla naszej gry Breakout. Zauważ, że irrKlang ma nieco restrykcyjną licencję: możesz używać irrKlang, jak chcesz, do celów niekomercyjnych, ale musisz zapłacić za wersję pro, ilekroć chcesz używać komercyjnie irrKlang. Ponieważ Breakout i ta seria samouczków są niekomercyjne, możemy swobodnie korzystać ze standardowej biblioteki.
Możesz pobrać irrKlang ze strony download; użyjemy wersji 1.5. Ponieważ irrKlang jest zamkniętym źródłem, nie możemy sami skompilować biblioteki, więc będziemy musieli współpracować z tym, co nam zapewnił irkKlang. Na szczęście mają dużo prekompilowanych plików bibliotek.
Po dołączeniu plików nagłówkowych irrKlang, dodaniu ich biblioteki (irrKlang.lib
) do ustawień linkera i skopiowaniu plików DLL do odpowiednich lokalizacji (zazwyczaj w tej samej lokalizacji, w której znajduje się .exe
) możemy zaczynać. Zwróć uwagę, że jeśli chcesz wczytać pliki MP3, musisz również dołączyć plik ikpMP3.dll
.
Dodawanie muzyki
Specjalnie dla tej gry stworzyłem małą ścieżkę dźwiękową, dzięki czemu gra jest nieco bardziej żywa. Możesz znaleźć ścieżkę audio tutaj, której użyjemy jako podkład muzyczny w grze. Ten utwór jest tym, co będziemy grać za każdym razem, gdy gra się rozpocznie, i który będzie ciągle w pętli, dopóki gracz nie zamknie gry. Możesz go zastąpić własnymi ścieżkami lub użyć go w dowolny sposób.
Dodanie tego do gry Breakout jest niezwykle proste dzięki bibliotece irrKlang. Załączamy odpowiednie pliki nagłówkowe, tworzymy irrKlang::ISoundEngine
, inicjalizujemy za pomocą
#include <irrklang/irrKlang.h>
using namespace irrklang;
ISoundEngine *SoundEngine = createIrrKlangDevice();
void Game::Init()
{
[...]
SoundEngine->play2D("audio/breakout.mp3", GL_TRUE);
}
Tutaj stworzyliśmy SoundEngine, którego używamy dla całego kodu związanego z dźwiękiem. Po zainicjowaniu silnika dźwięku wszystko, co musimy zrobić, aby odtworzyć dźwięk, to po prostu wywołać funkcję
I to wszystko! Uruchomienie gry powinno teraz spowodować gwałtowne wybuchy fal dźwiękowych przez głośniki lub zestaw słuchawkowy.
Dodawanie dźwięków
Nie jesteśmy jeszcze na miejscu, ponieważ sama muzyka nie wystarczy, aby gra była pełna życia. Chcemy odtwarzać dźwięki, gdy wydarzy się coś ciekawego w grze, jako dodatkowe informacje zwrotne dla gracza. Takie jak po uderzeniu w cegłę, lub po włączeniu powerupa i tak dalej. Poniżej znajdziesz wszystkie dźwięki, których będziemy używać (dzięki freesound.org):
bleep.mp3: dźwięk, gdy piłka uderzy w zniszczalny blok.
solid.wav: dźwięk, gdy piłka uderzy w niezniszczalny blok.
powerup.wav: dźwięk, kiedy wiosło gracza zderzyło się z blokiem powerup.
bleep.wav: dźwięk, gdy odbijamy piłeczkę od wiosła gracza.
Gdziekolwiek pojawia się kolizja, odtwarzamy odpowiedni dźwięk. Nie będę przechodził przez wszystkie wiersze kodu, w których ma się to odbyć, ale po prostu zobacz zaktualizowany kod gry tutaj. Powinieneś z łatwością dodać efekty dźwiękowe w odpowiednich lokalizacjach.
Wszystko razem daje nam grę, która wydaje się bardziej kompletna. Wszystko razem wygląda (i brzmi) w ten sposób:
IrrKlang pozwala na znacznie dokładniejsze sterowanie kontrolkami audio, takimi jak zaawansowane zarządzanie pamięcią, efekty dźwiękowe lub wywołania zwrotne zdarzeń dźwiękowych. Sprawdź ich proste tutoriale C++ i spróbuj poeksperymentować z jego funkcjami.