« Dźwięk, lekcja »
Rozdział 11. Obsługa dźwięku w Allegro. (lekcja)
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!
Tutorial by Easykoder ®
www.easykoder.vot.pl
Kurs Allegro 4.x, C++

Dźwięk

[lekcja] Rozdział 11. Obsługa dźwięku w Allegro.
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.

C/C++
#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

C/C++
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.

C/C++
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.

C/C++
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)

C/C++
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.

C/C++
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.

C/C++
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.

C/C++
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:
  • load_wav - ładuje pliki WAV
  • load_voc - ładuje pliki VOC
natomiast:
  • load_sample - jest do zastosowania ogólnego, załaduje oba powyższe formaty bez problemu. Ładuje dźwięki na podstawie rozszerzenia.

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.
Poprzedni dokumentNastępny dokument
AnimacjaMyszka