Forstå og implementere 3D-lyd i GameMaker Studio

Hva du skal skape

Lyd er et viktig element i den generelle spillopplevelsen, og GameMaker: Studio gir en relativt enkel måte for deg å implementere 3D-lyd i prosjektene dine.. 

For bedre å forstå konseptet med 3D-lyd, kan du tenke deg å legge til et par digitale ører til et spillerkontrollert spillobjekt. Når spilleren nærmer seg en lydkilde i spillet, blir volumet av denne kilden høyere. Når spilleren beveger seg bort, reduseres volumet til slutt blir stille. Plasseringen av spilleren i forhold til lydkilden vil også resultere i retnings stereolyd, og lydhastighet som er påført et bevegelige objekt kan påføres for å opprette en Doppler-effekt. 

Dette settet av nedsenkende lydfunksjoner kan oppnås gjennom et system av lydemittere og en lydlytter. I denne opplæringen lager vi to scener som inneholder 3D-lyd på forskjellige måter, som vist i demovideoen. Du kan laste ned kildefilene og samle demo EXE fra GitHub.

Forstå 3D Audio

Begrepene som er involvert i 3D-lyd, er like i alle spillutviklingsmiljøer, fordi de er basert på kjente virkelige regler: Lyden blir høyere når du nærmer deg kilden, og lyden som kommer opp til høyre blir høyere i høyre øre. Disse grunnleggende prinsippene kan oppnås manuelt ved å beregne gevinst og produksjon av en lydkilde i forhold til et bestemt spillobjekt, men GameMaker: Studio gir et sett med kraftige og brukervennlige funksjoner som gir deg direkte kontroll over lyd API.

Emitteren

Lydutsenderen fungerer som kilden til et 3D-lydelement i GameMaker: Studio. Emitteren er definert av en brukeropprettet variabel og en posisjon (x, y, z) det kan heller være statisk eller dynamisk. Emitterens volum styres av gevinst og falle av verdier og real-time effekter kan brukes gjennom tonehøyde og hastighet verdier. Måten hvor emitteren håndterer lydfall, bestemmes av avstandsmodellen som er påført. Flere lydemittere kan eksistere innenfor samme scene.

Lytteren

Lydlytteren fungerer som "ører" som mottar 3D-lyden som sendes av emitteren. Lytten er plassert på en posisjon (x, y, z) som også kan være statisk eller dynamisk, men orientering av lytteren er like viktig. 

Listener orientation bestemmer nøyaktig retning og vinkel som lytteren "ser på". Standardlytterretningen i GameMaker: Studio resulterer i at venstre og høyre lydkanal blir reversert for 3D Audio, som vi vil korrigere senere under implementering.

Doppler-effekten

Uten å gå inn i en lang og grundig forklaring på Doppler-effekten, kan den beskrives som endringen i lydfrekvens i forhold til bevegelsen og hastigheten til emitteren eller lytteren. I GameMaker: Studio oppnås Doppler-effekten ved å tilordne vektorer til hastigheten til lydutsenderen eller lytteren. For en grundig forklaring, les Doppler-effektoppføringen på Wikipedia.

Implementere 3D Audio

Implementering av 3D-lyd i ditt GameMaker-prosjekt er en tre-trinns prosess. Du må riktig definere emitteren i et eksisterende spillobjekt, plassere dette objektet i rommet, og fortell emitteren når og hvordan du spiller en lyd. Du må da definere lytterens orientering og posisjon innenfor et eksisterende spillobjekt som er tilstede i samme rom som emitteren. 

Det første trinnet innebærer imidlertid å importere og definere lydverdiene.

Importere eiendeler

Start med å klikke på ressurser i hovedverktøylinjen i GameMaker og velg Lag lyd fra rullegardinmenyen. Skriv inn et navn for lydegenskapen og velg de ønskede lydattributtene for streaming og filkomprimering. Så, i Målalternativer delen av Lydegenskaper vindu, klikk på den første rullegardinmenyen og velg 3D fra listen over alternativer.

Ved å betegne denne aktiva som en 3D-lyd, kan vi dra nytte av GameMakers lyd-API på unike måter.

En stasjonær emitter

I vårt første eksempel vil vi lage en slags isometrisk Sim City-stil-forekomst av 3D-lyd med en stasjonær sender. Vår lytter vil være knyttet til et spillobjekt som følger musemarkøren, og emitteren til 3D-lyden vil forbli innenfor et objekt som ikke beveger seg. Dette objektet vil bli representert av en liten klynge av bygninger, og emitteren vil spille en omgivende by-scape lyd med travle trafikk og bilhorn. 

Dette vil gjøre det mulig for oss å teste ut lydfallsegenskapene til 3D-lydsystemet, og vi vil bedre kunne forstå betydningen av lytterorientering.

Opprette lytteren

Vår 3D-lydlytter vil eksistere innenfor et objekt som følger musepekeren. I dette eksemplet blir objektet identifisert av et sprite som ligner en GPS-markør. De obj_listener Objektet inneholder to viktige blokker med kode: en i Skape arrangement, og en i Skritt begivenhet.

Klikk på Legg til arrangement knappen og velg Skape å legge til en Skape hendelse til obj_listener. Dra Kjør kode ikon fra Styre fanen av obj_listener egenskaper vindu inn i handlinger delen av Lag arrangement panel. Dobbeltklikk på Kjør kode ikonet for å åpne GML-kodeditoren, og legg til følgende linje kode:

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

Denne koden sikrer at så snart lytterobjektet er opprettet, blir det plassert i 3D-plass for å se mot skjermen, høyre side opp. Lyd som kommer fra en emitter som er plassert til høyre for lytteren, vil være mer til stede i høyre høyttaler og omvendt. Dette er standardoppsettet du vil bruke i nesten alle typer lytterimplementering i GameMaker: Studio. 

Hvis du ville at lyden til venstre og høyre skulle byttes, ville du bruke følgende kode for orientering:

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

Legg til en Skritt hendelse til obj_listener og dra en annen Kjør kode ikon i handlinger panel. Åpne GML-kodeditoren igjen, og skriv inn følgende linjer med kode:

x = mouse_x; y = mouse_y; audio_listener_position (x, y, 0);

Denne koden finner den nåværende plasseringen av musemarkøren og tilordner disse koordinatene til posisjonen til obj_listener gjenstand. Stillingen til lydlytteren er også definert av disse koordinatene. Ved å plassere denne koden i Skritt arrangement, sikrer vi at obj_listener objekt, tilhørende sprite og lytteren selv er alltid på samme sted, siden Skritt Hendelseskode utføres ved hver ramme under kjøretid. 

(De 0 i denne koden er z-stillingen til lytteren. Siden vårt spill er i 2D, vil vår lytter alltid være på 0 på z-aksen.)

Åpne rommet der du vil at lytterobjektet skal vises. Klikk på objekter fanen og klikk i panelet for å vise listen over tilgjengelige objekter. Velg ditt lytterobjekt og klikk inn i rommet for å plassere det. Utgangspunktet for dette objektet spiller ingen rolle, fordi det vil bli oppdatert for å matche posisjonen til musepekeren ved kjøring. 

Det er det for lytteren. Nå må vi lage noe for lytteren å høre.

Opprette emitteren

Som med lytteren vil vi fokusere utelukkende på Skape og Skritt hendelser av emitterobjektet. I dette tilfellet vil vi plassere emitteren i obj_city gjenstand. 

Legg til Skape og Skritt hendelser til obj_city ,og legg til en Kjør kode handling for begge hendelsene.

I GML-koden til Skape hendelse, legg til følgende:

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 er navnet på vår nye emitter.)

Vi valgte Eksponentiell Avstand falloff modell for dette eksempelet fordi det gir en jevn gevinst falloff med en skarp økning når du møter Referanseavstand punkt. Dette gjør at lydvolumet i 3D kan reduseres etter hvert som du kommer lengre unna objektet, jevnt, uten sterke hopp, til du blir ekstremt nær kilden. For en fullstendig liste over falloff-modeller og deres grundige beskrivelser, les GameMaker's falloff modeller dokumentasjon.

audio_emitter_falloff (emitter, falloff_ref, falloff_max, falloff_factor) er der vi satt opp attributene til falloff-modellen:

  • emitter er vår s_emit variabel. 
  • falloff_ref er punktet hvor volumfallet vil begynne å starte. 
  • falloff_max er det punktet som lytteren ikke lenger vil kunne høre emitteren.
  • falloff_factor er et nummer som brukes i audio_falloff_set_model beregning for å bestemme resultatene av falloff. I vårt eksempel bruker vi standardverdien til 1 slik at vår s_emit emitter vil begynne å falle av når lytteren er 100 piksler unna emitteren, og lytteren vil ikke kunne høre emitteren i en avstand på 300 piksler eller større.

audio_play_sound_on (emitter, lyd, loop, prioritet) er hvordan vi får emitteren til å begynne å spille 3D-lyden vår: 

  • emitter er vår s_emit variabel. 
  • lyd er vår snd_cityaudio 3D-lydenhet som vi importerte tidligere. 
  • sløyfe bestemmer om denne lyden skal gjenta eller ikke. 
  • prioritet er en verdi fra 0 til 100 som bestemmer «betydningen» av lyden som spilles - større tall representerer høyere prioritetslyder. 

I vårt eksempel har vi bare en lyd som spilles, så prioriteringen spiller ingen rolle. Og siden denne koden er utført i Skape hendelsen og vi har valgt å sløyfe lyden, vil denne 3D-lyden aktiva så snart rommet er lastet, og vil fortsette å spille til det er instruert å stoppe. Og det bringer oss til en veldig viktig trinn:

Denne lyden eiendelen vil spille selv når du laster inn et annet rom som ikke inneholder emitteren. For å effektivt stoppe denne aktiva fra å spille i et annet rom enn rommet som inneholder emitteren, må vi legge til en Room End hendelse til obj_city

I handlinger panel av Room End hendelse, legg til en annen Kjør kode ikon med følgende GML-kode:

sound_stop (snd_cityaudio);

Nå er alt som er igjen å gjøre, plassere obj_city objekt inn i rommet som du plassert lytteren før. Kjør spillet og eksperimentere med posisjonen til musemarkøren for å endre lytterens plassering i forhold til emitteren for å se nøyaktig hvordan 3D-lyd fungerer i praksis.

En flytende emitter med Doppler-effekten

I det andre eksempelet vil vi feste emitteren til et bevegelige objekt og bruke Doppler-effekten mens du bruker det samme lytterobjektet som vi opprettet tidligere. 

En punktobjekt beveger seg fra høyre side av skjermen til venstre. Når kulen når kanten av skjermen, vikles den rundt og fortsetter fra hvor den startet. (Vi vil ikke gå gjennom hvordan du lager denne bevegelsen.) Bullet objektet avgir en looping lyd som kan beskrives som en "whizzing" eller "buzzing" lyd. Når objektet nærmer seg lytteren, Frekvens av lyden vil endres, på grunn av Doppler-effekten.

Opprette emitteren

Legg til en Skape og a Skritt hendelse til obj_bullet objekt, og legg til Kjør kode handling for begge hendelsene.

I Skape hendelse, legg til følgende kode i GML-editoren:

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

Her, s_emit2 er navnet på vår nye emitter.

Denne emitteren vil bruke samme falloff-modell som definert i forrige rom, da bare en type falloff-modell kan være aktiv samtidig, og vår originale modell passer for dette eksempelet. De nye falloff egenskapene benytter en falloff referanse av 25 piksler, en falloff maksimal av 200 piksler, og en falloff-faktor på 2.5 for beregning. De snd_bullet 3D-lydaktiv begynner å spille så snart objektet er opprettet, med en prioritet på 1, og vil løpe på ubestemt tid.

I GML-editoren til Skritt arrangement, legg til denne linjen med kode:

audio_emitter_position (s_emit2, x, y, 0);

Siden objektet beveger seg og x- og y-verdiene forandrer seg, vil plasseringen av emitteren også bli oppdatert til den nye posisjonen ved hvert trinn.

Ikke glem å legge til punktobjektet i rommet, og husk å legge til sound_stop (snd_bullet) kode til objektets Room End begivenhet.

Opprette Doppler-effekten

3D-lydsystemet er nå på plass for punktobjektet, og lytteren fungerer riktig, men la oss gjøre ting mer interessant med Doppler-effekten. 

Å legge til Doppler-effekten er veldig enkel, faktisk. Bare åpne Kjør kode handling i obj_bullet Skape hendelse, og legg til følgende linje kode:

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

audio_emitter_velocity (emitter, vx, vy, vz) tillater oss å definere egenskapene til Doppler-effekten: 

  • emitter er vår s_emit 2 variabel. 
  • vx er hastigheten (i piksler per trinn) langs x-aksen. 
  • vy er hastigheten (i piksler per trinn) langs y-aksen. 
  • VZ gjelder hastighet langs z-aksen, men vårt spill er i 2D, så vi setter dette til 0

Typiske Doppler-effektoppsett bruker hspeed og vspeed variabler av et objekt for å bestemme hastighetsverdiene, men i dette tilfellet bruker vi bare en verdi på -25 å skape en mer realistisk bullet lyd. Du kan teste objektet med følgende kode for å merke forskjellen:

audio_emitter_velocity (s_emit2, hspeed, vspeed, 0);

Implementeringsideer

3D-lyd kan gi mye dybde og stemning til spillprosjektet, med minimal innsats som kreves. Her er bare noen få eksempler for å komme i gang:

  • Et skjult-og-søk-spill hvor du må lytte til lydanvisninger for å finne en skjult gjenstand.
  • Elektrisitet eller brannfarer i en plattformspartner som advarer deg om farene når du kommer nærmere.
  • Et Frogger-stilspill hvor biler zoomer forbi deg med Doppler-effekten.
  • Running vann i en hule eller vind blåser gjennom en luftkanal for å lede deg til utkjørselen.
  • Et spion-spill hvor du må komme nær et mål for å høre en samtale.