Înțelegerea și implementarea sunetului 3D în GameMaker Studio

Ce veți crea

Audio-ul este un element crucial al experienței generale de joc, iar GameMaker: Studio oferă o modalitate relativ simplă de a implementa audio 3D în proiectele dvs.. 

Pentru a înțelege mai bine conceptul de sunet 3D, imaginați-vă să adăugați o pereche de urechi digitale unui obiect de joc controlat de jucător. Pe măsură ce jucătorul se apropie de o sursă de sunet în joc, volumul sursei respective devine mai puternic; pe măsură ce jucătorul se îndepărtează, volumul scade până la sfârșitul tăcerii. Poziția jucătorului în raport cu sursa audio va avea ca rezultat și un sunet stereo direcțional, iar viteza sunetului aplicată unui obiect în mișcare poate fi aplicată pentru a crea un efect Doppler. 

Acest set de caracteristici audio imersive poate fi realizat printr-un sistem de emițătoare audio si un ascultător audio. În acest tutorial, vom crea două scene care includ audio 3D în diferite moduri, așa cum se vede în video demo. Puteți descărca fișierele sursă și EXE demo compilat din GitHub.

Înțelegerea 3D audio

Conceptele implicate în sunetul 3D sunt similare în toate mediile de dezvoltare a jocului, deoarece se bazează pe reguli familiare reale: sunetul devine mai puternic pe măsură ce vă apropiați de sursă, iar sunetul provenit din dreapta dvs. va fi mai puternic la urechea dreaptă. Aceste principii de bază pot fi obținute manual prin calcularea câştig și producție a unei surse audio în raport cu un anumit obiect de joc, dar GameMaker: Studio oferă un set de funcții puternice și ușor de utilizat, care vă oferă un control direct asupra API-ului audio.

Emițătorul

Emițătorul audio acționează ca sursă a unui sunet 3D în GameMaker: Studio. Emițătorul este definit de o variabilă creată de utilizator și de o poziție (x, y, z) care poate fi fie static sau dinamic. Volumul emițătorului este controlat de câştig și a cadea valorile și efectele în timp real pot fi aplicate prin intermediul pas și viteză valori. Modul în care emițătorul se ocupă de falloarea audio este determinat de modelul de distanță aplicat. Multi emițători audio pot exista în aceeași scenă.

Ascultătorul

Ascultatorul audio acționează ca "urechi" care primesc sunetul 3D trimis de emițător. Ascultătorul este situat într-o poziție (x, y, z) care poate fi și statică sau dinamică, dar orientare a ascultătorului este la fel de importantă. 

Aspectul ascultătorului determină direcția și unghiul precis pe care ascultătorul îl "privește". Orientarea implicită a ascultătorilor în GameMaker: Studio are drept rezultat că canalele audio stânga și dreapta sunt inversate pentru 3D Audio, pe care le vom corecta ulterior în timpul implementării.

Efectul Doppler

Fără a ajunge la o explicație lungă și detaliată a efectului Doppler, poate fi descrisă ca schimbarea frecvenței sunetului în raport cu mișcarea și viteza emițătorului sau a ascultătorului. În GameMaker: Studio, efectul Doppler se realizează prin atribuirea vectorilor la viteza emițătorului audio sau a ascultătorului. Pentru o explicație detaliată, citiți intrarea efectului Doppler pe Wikipedia.

Implementarea sunetului 3D

Implementarea sunetului 3D în proiectul GameMaker este un proces în trei etape. Trebuie să definiți în mod corespunzător emițătorul într-un obiect de joc existent, să plasați acest obiect în cameră și să spuneți emițătorului când și cum să redați un sunet. Apoi, trebuie să definiți orientarea și poziția ascultătorului într-un obiect de joc existent care este prezent în aceeași cameră ca și emițătorul. 

Primul pas, cu toate acestea, implică importul și definirea activelor audio.

Importarea de active

Începeți prin a da clic pe Resurse în bara principală a GameMaker și selectând Creați sunet din meniul drop-down. Introduceți un nume pentru materialul audio și selectați atributele de sunet dorite pentru streaming și compresie de fișiere. Apoi, în Opțiunile țintă secțiunea din Proprietăți de sunet , faceți clic pe primul meniu derulant și selectați 3D din lista opțiunilor.

Prin denumirea acestui material ca un sunet 3D, putem profita de API-ul audio al GameMaker în moduri unice.

Un emițător staționar

În primul nostru exemplu, vom crea un fel de izometrie simetrică sim 3D cu un emițător staționar. Ascultătorul nostru va fi legat de un obiect de joc care urmează cursorul mouse-ului, iar emițătorul sunetului 3D va rămâne în interiorul unui obiect care nu se mișcă. Acest obiect va fi reprezentat de un mic grup de clădiri, iar emițătorul va juca un sunet ambiental de la oraș, cu trafic rutier și coarne de mașină. 

Acest lucru ne va permite să testați proprietățile audio false ale sistemului audio 3D și vom putea înțelege mai bine importanța orientării ascultătorilor.

Crearea ascultătorului

Ascultatorul nostru audio 3D va exista într-un obiect care urmează cursorul mouse-ului. În acest exemplu, obiectul va fi identificat de un sprite care seamănă cu un marker GPS. obj_listener obiect conține două blocuri importante de cod: unul în Crea eveniment, și unul în Etapa eveniment.

Apasă pe Adăugați evenimentul și selectați Crea pentru a adăuga a Crea eveniment la obj_listener. Trageți Executați codul pictograma din Control din tabelul obj_listener ferestre de proprietăți în acţiuni secțiunea din Creează eveniment panou. Faceți dublu clic pe Executați codul pentru a deschide editorul de cod GML și adăugați următoarea linie de cod:

audio_listener_orientation (0,1,0,0,0,1);

Acest cod asigură că, de îndată ce este creat obiectul ascultătorului, acesta va fi poziționat în spațiul 3D pentru a arăta către ecranul, în partea dreaptă. Sunetul provenit de la un emițător situat în partea dreaptă a ascultătorului va fi mai prezent în difuzorul din dreapta și invers. Aceasta este setarea standard pe care doriți să o utilizați în aproape orice tip de implementare a ascultătorilor în GameMaker: Studio. 

Dacă doriți ca sunetul stânga și dreapta să fie schimbate, atunci veți folosi următorul cod pentru orientare:

audio_listener_orientation (0,1,0,0,0, -1);

Adauga o Etapa eveniment la obj_listener și trageți alta Executați codul pictograma în acţiuni panou. Deschideți din nou editorul de cod GML și introduceți următoarele linii de cod:

x = mouse_x; y = mouse_y; postul audio_listener (x, y, 0);

Acest cod găsește locația curentă a cursorului mouse-ului și atribuie aceste coordonate poziției obj_listener obiect. Poziția ascultătorului audio este, de asemenea, definită de aceste coordonate. Prin plasarea acestui cod în Etapa eveniment, ne asigurăm că obj_listener obiect, sprite însoțitor, și ascultător în sine sunt întotdeauna în aceeași locație, deoarece Etapa codul evenimentului este executat la fiecare cadru în timpul runtime-ului. 

(The 0 în acest cod este poziția z a ascultătorului. Deoarece jocul nostru este în 2D, ascultătorul nostru va fi întotdeauna la 0 pe axa z.)

Deschideți camera în care doriți să apară obiectul ascultătorului. Apasă pe Obiecte și faceți clic pe panoul de dialog pentru a afișa lista obiectelor disponibile. Selectați obiectul ascultătorului și faceți clic în interiorul camerei pentru al plasa. Poziția de pornire a acestui obiect nu contează, deoarece va fi actualizată pentru a se potrivi cu poziția cursorului mouse-ului în timpul rulării. 

Asta este pentru ascultător. Acum trebuie să creăm ceva pentru ascultător să audă.

Crearea emițătorului

Ca și în cazul ascultătorului, ne vom concentra exclusiv pe Crea și Etapa evenimente ale obiectului emițătorului. În acest caz, vom plasa emițătorul în obj_city obiect. 

Adaugă Crea și Etapa evenimente la obj_city ,și adăugați un Executați codul acțiune pentru ambele evenimente.

În codul GML al Crea eveniment, adăugați următoarele:

s_emit = audio_emitter_create (); audio_falloff_set_model (audio_falloff_exponent_distance); audio_emitter_falloff (s_emit, 50, 200, 1); audio_play_sound_on (s_emit, snd_cityaudio, true, 1);

(s_emit este numele noului nostru emițător.)

Am ales Distanța exponențială modelul falloff pentru acest exemplu, deoarece oferă o creștere constantă a câștigului, cu o creștere bruscă odată ce ați întâlnit Distanța de referință punct. Acest lucru permite ca volumul audio 3D să scadă pe măsură ce vă depărtați de obiect, fără probleme, fără să faceți salturi dure, până când ajungeți foarte aproape de sursă. Pentru o listă completă a modelelor falloff și a descrierilor detaliate ale acestora, citiți documentația modelelor GameMaker.

audio_emitter_falloff (emițător, falloff_ref, falloff_max, falloff_factor) este locul unde am creat atributele modelului falloff:

  • emițător este a noastra s_emit variabil. 
  • falloff_ref este punctul în care începe să se declanșeze falloff-ul de volum. 
  • falloff_max este punctul în care ascultătorul nu va mai putea auzi emițătorul.
  • falloff_factor este un număr utilizat în audio_falloff_set_model calcul pentru a determina rezultatele falloff. În exemplul nostru, folosim valoarea implicită de 1 așa că noi s_emit emițătorul va începe să cadă odată ce ascultătorul este la 100 de pixeli distanță de emițător și ascultătorul nu va putea să audă emițătorul la o distanță de 300 de pixeli sau mai mare.

audio_play_sound_on (emițător, sunet, buclă, prioritate) este modul în care primim emisorul pentru a începe să ne jucăm sunetul 3D: 

  • emițător este a noastra s_emit variabil. 
  • sunet este a noastra snd_cityaudio Element audio 3D pe care l-am importat mai devreme. 
  • buclă determină dacă acest sunet trebuie să se repete sau nu. 
  • prioritate este o valoare de la 0 la 100 care determină "importanța" sunetului redat - numerele mai mari reprezintă sunete cu prioritate mai mare. 

În exemplul nostru, avem doar un sunet jucat, deci prioritatea nu contează. Și din moment ce acest cod este executat în Crea eveniment și am ales să bifăm sunetul, acest material audio 3D va fi redat imediat ce camera va fi încărcată și va continua să fie redată până când va fi instruit să se oprească. Și asta ne aduce la a foarte pas important:

Acest material audio va fi redat chiar și atunci când încărcați o altă încăpere care nu conține emițătorul. Pentru a opri efectiv acest material de a juca în orice cameră, alta decât camera care conține emițătorul, trebuie să adăugăm o Sala de sfârșit eveniment la obj_city

În acţiuni panoul din Sala de sfârșit eveniment, adăugați altul Executați codul cu următorul cod GML:

sound_stop (snd_cityaudio);

Acum trebuie doar să plasați obj_city obiectează în cameră așa cum ai pus ascultătorul înainte. Rulați jocul și experimentați cu poziția cursorului mouse-ului pentru a schimba locația ascultătorului în raport cu emițătorul pentru a vedea exact cum funcționează sunetul 3D în practică.

Un emițător mișcător cu efectul Doppler

În al doilea exemplu, vom atașa emițătorul la un obiect în mișcare și vom aplica efectul Doppler în timp ce folosim același obiect de ascultător pe care l-am creat mai devreme. 

Un obiect bullet se mișcă din partea dreaptă a ecranului spre stânga. Când glonțul ajunge la marginea ecranului, acesta se înfășoară și continuă de unde a început. (Nu vom trece prin modul de a crea această mișcare.) Obiectul bullet emite un sunet care poate fi descris ca un sunet "bâzâit" sau "bâzâit". Când obiectul se apropie de ascultător, frecvență din sunet se va schimba, datorită efectului Doppler.

Crearea emițătorului

Adauga o Crea și a Etapa eveniment la obj_bullet obiect și adăugați Executați codul acțiune pentru ambele evenimente.

În Crea eveniment, adăugați următorul cod la editorul GML:

s_emit2 = audio_emitter_create (); audio_emitter_falloff (s_emit2, 25, 200, 1,5); audio_play_sound_on (s_emit2, snd_bullet, true, 1);

Aici, s_emit2 este numele noului nostru emițător.

Acest emițător va folosi același model de falloff definit în camera anterioară, deoarece un singur tip de model falloff poate fi activ în același timp, iar modelul nostru original este potrivit pentru acest exemplu. Noile proprietăți falloff utilizează o referință falloff a 25 pixeli, un maxim de falloff de 200 pixeli și un factor de falloff 2.5 pentru calcul. snd_bullet Sunetul audio 3D începe să fie redat imediat ce obiectul este creat, cu o prioritate 1, și va bate pe termen nelimitat.

În editorul GML al Etapa eveniment, adăugați această linie de cod:

pozitie audio_emitter (s_emit2, x, y, 0);

Deoarece obiectul se mișcă și valorile x și y se schimbă în mod constant, poziția emițătorului va fi de asemenea actualizată la noua poziție la fiecare pas.

Nu uitați să adăugați obiectul bullet în cameră și adăugați-l sound_stop (snd_bullet) cod la obiect Sala de sfârșit eveniment.

Crearea efectului Doppler

Sistemul de sunet 3D este acum disponibil pentru obiectul bullet și ascultătorul funcționează corect, dar să facem lucrurile mai interesante cu efectul Doppler. 

Adăugarea efectului Doppler este foarte simplă, de fapt. Doar deschideți Executați codul acțiune în obj_bullet Crea eveniment și adăugați următoarea linie de cod:

audio_emitter_velocitate (s_emit2, -25, -25, 0);

audio_emitter_velocity (emițător, vx, vy, vz) ne permite să definim proprietățile efectului Doppler: 

  • emițător este a noastra s_emit 2 variabil. 
  • vx este viteza (în pixeli pe pas) de-a lungul axei x. 
  • vy este viteza (în pixeli pe pas) de-a lungul axei y. 
  • VZ se aplică vitezei de-a lungul axei z, dar jocul nostru este în 2D, așa că am stabilit acest lucru 0

Efectele tipice de efect Doppler utilizează hspeed și vspeed variabile ale unui obiect pentru a determina valorile vitezei, dar în acest caz, folosim doar o valoare de -25 pentru a crea un sunet mult mai realist. Puteți testa obiectul cu următorul cod pentru a observa diferența:

audio_emitter_velocitate (s_emit2, hspeed, vspeed, 0);

Idei de implementare

Sunetul 3D poate adăuga un plus de profunzime și ambianță proiectului dvs. de joc, cu un efort minim necesar. Iată doar câteva exemple pentru a începe:

  • Un joc ascuns și în care trebuie să asculți indicii audio pentru a găsi un obiect ascuns.
  • Electricitate sau pericole de incendiu într-un platformer care vă avertizează asupra pericolelor pe măsură ce vă apropiați.
  • Un joc în stil Frogger, în care autovehiculele se deplasează peste dvs. utilizând efectul Doppler.
  • Rularea apei într-o peșteră sau vântul suflă printr-o conductă de aer pentru a vă conduce la ieșire.
  • Un joc spion unde trebuie să te apropii de o țintă pentru a auzi o conversație.