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.
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.
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.
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.
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.
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.
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.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.
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.
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.
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.
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.
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);
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: