Aby stworzyć grę, brakuje nam jeszcze kilku istotnych elementów... Jeden z nich rzuca się w oczy a właściwie w uszy ;) przy każdym odpaleniu którejś poprzedniej lekcji. Mowa oczywiście o dźwięku, a właściwie jego braku! ;p Pora więc nauczyć się go obsługiwać.
Tak jak do obsługi grafiki w Allegro służy specjalna struktura BITMAP, tak też istnieje specjalna struktura SAMPLE do obsługi dźwięku. Stworzymy więc program, który odegra kilka przykładowych dźwięków.
Aha, no i najważniejsze, musimy mieć dźwięk w formacie wav najlepiej użyć do tego rejestratora dźwięków wbudowanego w Windows ;p i powiedzieć do mikrofonu "trr" dzięki temu otrzymamy dźwięk jaki będziemy mogli podłożyć pod dźwięk samochodu w grze. Najlepiej jeśli nie będzie trwał dłużej niż 0,5sec.
Ja użyłem dźwięku o nazwie warkot01.wav własnej produkcji ;p Dobra to też kodzik a potem wyjaśnienia.
#include <allegro.h>
int main()
{
allegro_init();
install_keyboard();
set_color_depth( 16 );
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
clear_to_color( screen, makecol( 128, 128, 128 ) );
Jak na razie zainstalowaliśmy klawiaturę, czyli to co zwykle, a teraz będzie coś nowego, zainstalujemy dźwięk i ustawimy głośność na maxa ;-p
install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
set_volume( 255, 255 );
Tworzymy wskaźnik na bufor, to samo tyczy się dźwięku, tworzymy więc wskaźnik na strukturę SAMPLE i przypisujemy jej wartość NULL, tak dla bezpieczeństwa.
BITMAP * bufor = NULL;
SAMPLE * dzwiek = NULL;
bufor = create_bitmap( 640, 480 );
if( !bufor )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "Nie mogę utworzyć bufora !" );
allegro_exit();
return 0; }
Teraz pora na załadowanie naszego dźwięku. Plik powinien znajdować się w tym samym katalogu co program. U mnie nazywa się warkot01.wav.
dzwiek = load_sample( "warkot01.wav" );
if( !dzwiek )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "nie mogę załadować dzwieku !" );
allegro_exit();
return 0;
}
A teraz włączamy nasz dźwięk, i zapętlamy go, aby był stale odtwarzany (ostatni parametr
na 1)
play_sample( dzwiek, 255, 127, 1000, 1 );
while( !key[ KEY_ESC ] )
{
W pętli nieskończonej zmieniamy różne parametry odtwarzania dźwięku, daje to naprawdę świetne efekty. Najlepiej sam przetestuj z różnymi ustawieniami.
if( key[ KEY_A ] ) { adjust_sample( dzwiek, 255, 127, 500, 1 ); }
if( key[ KEY_S ] ) { adjust_sample( dzwiek, 255, 127, 2000, 1 ); }
if( key[ KEY_D ] ) { adjust_sample( dzwiek, 255, 0, 1000, 1 ); }
if( key[ KEY_F ] ) { adjust_sample( dzwiek, 255, 255, 1000, 1 ); }
}
Wyłączamy nasz dźwięk, lepiej nie zapomnieć o tej linii! Po czym sprzątamy po programie, czyli zwalniamy pamięć spod bufora i dźwięku.
stop_sample( dzwiek );
destroy_bitmap( bufor );
destroy_sample( dzwiek );
allegro_exit();
return 0;
}
END_OF_MAIN();
Programem sterujemy za pomocą klawiszy A,S,D,F no I wyłączmy na ESC. Program w działaniu możecie oczywiście pobrać w dziale download. A teraz pora na wyjaśnienie procedur, w kolejności w jakiej ukazały się w tej lekcji.
install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
Jest to po prostu instalacja sterowników Allegro do obsługi dźwięku. Pierwszym argumentem jest sterownik DSP karty dźwiękowej, prawie zawsze dajemy tu DIGI_AUTODETECT. Natomiast drugim argumentem jest sterownik midi czyli dajemy po prostu MIDI_AUTODETECT. Ostatnim parametrem jest ścieżka do pliku konfiguracyjnego Allegro najlepiej dać "" i święty spokój. Gdy wystąpi błąd, funkcja zwróci wartość -1. Aby odinstalować/wyłączyć dźwięk możemy użyć funkcji remove_sound jednak nie musimy się tym martwić bo allegro_exit zrobi to za nas ;p
set_volume(255,255);
Dzięki tej funkcji ustalamy głośność dźwięku. Jak zwykle w Allegro wszystko podaje się w zakresie 0-255 czyli 0 to zupełna cisza a 255 to pełny regulator. Pierwszym argumentem jest głośność DSP, natomiast drugim głośność MIDI.
play_sample(dzwiek, 255,127,1000,1);
Chyba najważniejsza funkcja, używamy jej aby odegrać jakikolwiek dźwięk. Jej argumentami są: wskaźnik na SAMPLE, głośność, natężenie na głośniki, zapętlenie. Głośność podajemy w zakresie 0-255. Natężenie decyduje o tym, na który głośnik chcemy przekazać więcej mocy. 0 - całość wędruje na lewy głośnik, 255 na prawy, a 127 oznacza, że dzielimy wszystko po równo, czyli ładujemy na lewy i prawy głośnik. Natomiast częstotliwość decyduje o tym jak szybko ma być odtwarzany dźwięk, 1000 oznacza normalną prędkość, 2000 dźwięk odtwarzany jest dwa razy szybciej, 500 dwa razy wolniej. Dzięki częstotliwości można uzyskać naprawdę ciekawe efekty. A jeśli chodzi o zapętlenie to chyba nie ma czego wyjaśniać 0 - dźwięk odgrywamy tylko raz, 1 - odgrywamy seryjnie jeden za drugim.
adjust_sample( dzwiek,255,127,500,1);
Funkcja bardzo podobna do play_sample, różni się tylko tym, że za pomocą tej funkcji możemy jedynie modyfikować aktualnie odtwarzany dźwięk za pomocą funkcji play_sample. Za jej pomocą możemy zmieniać, natężenie, głośność na lewym i prawym głośniku oraz częstotliwość. Gdy zapętlenie ustawimy na 0, da to taki sam efekt jak stop_sample.
stop_sample(dzwiek);
Zatrzymuje aktualnie odtwarzany dźwięk przy pomocy play_sample.
SAMPLE *dźwięk = NULL;
Dokładnie to samo co w przypadku BITMAP. Jest to po prostu struktura odpowiedzialna za działanie dźwięku w Allegro. Tworzymy więc wskaźnik na strukturę SAMPLE i przypisujemy wartość NULL, bo nigdy nie wiadomo na co akurat trafimy.
dzwiek = load_sample( "warkot01.wav" );
if( !dzwiek )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "nie mogę załadować dzwieku !" );
allegro_exit();
return 0;
}
Po prostu ładujemy nasz dźwięk do pamięci, w przypadku niepowodzenia wyświetlamy odpowiedni komunikat i zamykamy Allegro. Podobnie jak przy ładowaniu grafiki istnieją funkcje ładujące konkretne typy plików:
natomiast:
Możliwe jest oczywiście zastosowanie takich formatów jak MP3 i OGG, wymaga to jednak użycia zewnętrznych bibliotek, dlatego ten temat nie został tutaj poruszony.
destroy_sample(dźwięk);
Jeśli sampel jest już niepotrzebny, należy zwolnić miejsce w pamięci przez niego zajęte.
I to by było tyle jeśli chodzi o dźwięk w Allegro. Więcej informacji znajdziesz oczywiście w dokumentacji.
Kody źródłowe programów
Zadania do tej i innych lekcji znajdziesz
na naszym repozytorium.
Prawa autorskie
Serwis otrzymał zgodę od autora na publikację niniejszego materiału.