Dźwięk silnika w TGF/MMF

Klikipedia - klikowa encyklopedia
Wersja z dnia 16:47, 30 paź 2007 autorstwa RomanX (dyskusja | edycje)
(różn.) ‹Starsza wersja | zobacz obecną wersję (różn.) | Nowsza wersja› (różn.)
Skocz do: nawigacji, wyszukiwarki
Slimaczek.jpg
Pierwotna wersja tego artykułu pochodzi z 4. numeru Ślimaczka (zobacz oryginalny artykuł).


Autor.jpg
Autorem tego artykułu jest
Alicja

Ten krótki kurs dla TGF oraz MMF, ma nas nauczyć dodawania dźwięków do naszych wyścigówek. Wielu klikowców ma problem z zsymulowaniem odpowiedniego dźwięku silnika. Można by i odtwarzać odpowiednią próbkę dla danej prędkości, ale zajmowały by one trochę więcej, a efekt byłby średni. Potrzebne składniki do kursu to: DMC2 object, TGF lub MMF i krótki jednolity dźwięk silnika. Na przykład weźmy Engine.wav z gry Genne Rally (do ściągnięcia prawie wszędzie, jest to mała gra freeware). A teraz przejdźmy już do samego kursu.

Wprowadzenie

Posiadając odpowiednią wiedze z lekcji fizyki, jesteśmy przygotowani na to że będziemy musieli zmienić częstotliwość dźwięku. Na szczęście twórcy DMC2 nie omieszkali dać i takiego narzędzia. Tak więc mając już gotowy samochód z ruchem wyścigowym, pliki Engine.wav i bass.dll w folderze z plikiem gam, oraz wstawiony DMC2 object, otwieramy edytor zdarzeń. Na początek musimy otworzyć naszą próbkę, co chyba dla wszystkich jest dziecinnie proste.

Jak to zrobić?

Jako obiekt A oznaczymy obiekt samochód

Kod do edytora zdarzeń
N Zdarzenia
1
+ EZ-special.png Start of level/Start of frame
EZ-DMC2.png InitBass()
EZ-DMC2.png OpenSample(file=".\Engine.wav", chan=0)
EZ-DMC2.png PlaySample(looping=1, chan=0)

Jak pewnie zauważyliście, zapętlamy próbkę, co powinno być oczywiste. Teraz czas na regulację próbki względem prędkości pojazdu. Dodajemy warunek Always czyli "zawsze" i wybieramy zdarzenie z DMC2 "Set SampleFreq". Teraz zastanówmy się nad wartością. Oczywiście pobierzemy wartość prędkości, tyle, że częstotliwość byłaby w takim wypadku za mała. Mnożymy więc wartość prędkości razy 300 (ja doszłam do tego eksperymentalnie, wy też popróbujcie). Testujemy poziom.

W sumie wszystko wypada pomyślnie, jednak coś tu jest nie tak. Przy prędkości zero nie słychać silnika (300*0 = 0). Zazwyczaj samochód na postoju automatycznie nie wyłącza silnika, robi to kierowca. Musimy więc ustalić początkową wartość częstotliwości, którą dodamy do naszego działania (i wtedy przy prędkości zero 300*0+x=x). Najlepiej dobrać sobie według uznania, mi wypadło 1000. Przypatrzmy się kodowi:

1
+ EZ-frames.png Start of level/Start of frame
EZ-DMC2.png InitBass()
EZ-DMC2.png OpenSample(file=".\Engine.wav", chan=0)
EZ-DMC2.png PlaySample(looping=1, chan=0)
2
+ EZ-special.png Always
EZ-DMC2.png Set SampleFreq(Speed(ActiveA.gif)*300+1000)

Włączanie i wyłączanie silnika

Mamy już to co potrzeba, ale czy nie fajnie by było gdyby ten samochód ładnie się uruchamiał i gasił za naszym pozwoleniem? Nic trudnego! Pożyczymy sobie jedną wartość samochodu (o ile nie użyliście jej na uszkodzenia, wtedy weźcie sobie inną, bądź wyprodukujcie licznik ) oraz flagę - flaga 0 niech będzie flagą stanu silnika. Cała zabawa polega na tym by nie wyłączać od razu dźwięku, a płynnie go zmienić. Wystarczy więc zamiast 1000 dodawać wartość A, i regulować nią w razie zmiany flagi stanu. Zaraz rozjaśnię wam ten bajzel. Ustalając za klawisz włącznika [enter] przystępujemy do modyfikacji kodu.

1
+ EZ-frames.png Start of level/Start of frame
EZ-DMC2.png InitBass()
EZ-DMC2.png OpenSample(file=".\Engine.wav", chan=0)
EZ-DMC2.png PlaySample(looping=1, chan=0)
ActiveA.gif Set internal flag 0 off

Tradycyjnie na starcie ładujemy bibliotekę i odtwarzamy próbkę. Dodatkowo ustalamy flagę 0 samochodu na wyłączoną (auto jest wyłączone).

2
+ EZ-special.png Always
EZ-DMC2.png Set SampleFreq(Speed(ActiveA.gif)*300+Value A(ActiveA.gif))

Zawsze ustalamy częstotliwość dźwięku silnika jako prędkość autka raz 300 plus wartość A samochodzika. To powinno być jasne. Teraz poregulujmy wartość A.

3
+ ActiveA.gif Flag 0 is on
+ ActiveA.gif Altebrate Value A<1000
ActiveA.gif Add to altebrate Value A 5
4
+ ActiveA.gif Flag 0 is off
+ ActiveA.gif Altebrate Value A("Autko")>0
ActiveA.gif Substract from altebrate Value A 5
5
+ ActiveA.gif Altebrate Value A<0
ActiveA.gif Set Altebrate Value A to 0

Ostatnie zdarzenie zapobiega wystąpieniu błędu. Jako twórcy gier powinniśmy o tym pamiętać - by zapobiegać prostym błędom. Teraz względy sterowania:

6
+ EZ-keyboard.png Upon presing [enter]
+ EZ-special.png Only one action when event loop
ActiveA.gif Toggle interal flag 0

Później możecie sami łatwo dodać blokowanie i odblokowywanie sterowania samochodem przy pomocy flagi 0 tegoż samochodu. Życzę udanych rajdów.