L'audio è un elemento cruciale dell'esperienza di gioco complessiva e GameMaker: Studio offre un modo relativamente semplice per implementare l'audio 3D nei tuoi progetti.
Per comprendere meglio il concetto di audio 3D, immagina di aggiungere un paio di orecchie digitali a un oggetto di gioco controllato dal giocatore. Mentre il giocatore si avvicina a una fonte di suono all'interno del gioco, il volume di quella sorgente diventa più forte; mentre il giocatore si allontana, il volume diminuisce fino a diventare silenzioso. La posizione del lettore in relazione alla sorgente audio determinerà anche l'audio stereo direzionale e la velocità del suono applicata a un oggetto in movimento può essere applicata per creare un effetto Doppler.
Questo set di funzionalità audio immersive può essere realizzato attraverso un sistema di emettitori audio e un ascoltatore audio. In questo tutorial creeremo due scene che incorporano l'audio 3D in diversi modi, come mostrato nel video dimostrativo. Puoi scaricare i file sorgente e il demo EXE compilato da GitHub.
I concetti coinvolti nell'audio 3D sono simili in tutti gli ambienti di sviluppo del gioco, perché sono basati su regole familiari del mondo reale: il suono diventa più forte man mano che ci si avvicina alla sorgente e il suono proveniente dalla tua destra sarà più forte nell'orecchio destro. Questi principi di base possono essere raggiunti manualmente calcolando il guadagno e produzione di una sorgente audio in relazione a un oggetto di gioco specifico, ma GameMaker: Studio offre un set di funzioni potenti e facili da usare che ti danno il controllo diretto dell'API audio.
L'emettitore audio funge da sorgente di un dispositivo audio 3D in GameMaker: Studio. L'emettitore è definito da una variabile creata dall'utente e da una posizione (x, y, z)
quello può essere entrambi statico o dinamico. Il volume dell'emettitore è controllato da guadagno e cadere valori, e gli effetti in tempo reale possono essere applicati attraverso il intonazione e velocità valori. Il modo in cui l'emettitore gestisce il decadimento audio è determinato dal modello di distanza applicato. Nella stessa scena possono esistere più emettitori audio.
L'ascoltatore audio agisce come "orecchie" che ricevono il suono 3D inviato dall'emettitore. L'ascoltatore si trova in una posizione (x, y, z)
che può anche essere statico o dinamico, ma il orientamento dell'ascoltatore è altrettanto importante.
L'orientamento dell'ascoltatore determina la direzione e l'angolo precisi che l'ascoltatore sta "guardando". L'orientamento listener predefinito in GameMaker: Studio consente di invertire i canali audio sinistro e destro per Audio 3D, che verranno corretti in seguito durante l'implementazione.
Senza entrare in una spiegazione lunga e approfondita dell'effetto Doppler, può essere descritto come il cambiamento nella frequenza del suono in relazione al movimento e alla velocità dell'emettitore o dell'ascoltatore. In GameMaker: Studio, l'effetto Doppler si ottiene assegnando i vettori alla velocità dell'emettitore o dell'ascoltatore audio. Per una spiegazione approfondita, leggi la voce dell'effetto Doppler su Wikipedia.
L'implementazione dell'audio 3D nel progetto GameMaker è una procedura in tre fasi. Devi definire correttamente l'emettitore all'interno di un oggetto di gioco esistente, posizionare questo oggetto nella stanza e dire all'emettitore quando e come riprodurre un suono. È quindi necessario definire l'orientamento e la posizione dell'ascoltatore all'interno di un oggetto di gioco esistente presente nella stessa stanza dell'emettitore.
Il primo passo, tuttavia, riguarda l'importazione e la definizione delle risorse audio.
Inizia facendo clic su risorse nella barra degli strumenti principale di GameMaker e selezionando Crea suono dal menu a discesa. Immettere un nome per la risorsa audio e selezionare gli attributi audio desiderati per lo streaming e la compressione dei file. Quindi, nel Opzioni di destinazione sezione del Proprietà del suono finestra, fare clic sul primo menu a discesa e selezionare 3D dall'elenco di opzioni.
Definendo questa risorsa come un suono 3D, possiamo sfruttare l'API audio di GameMaker in modi unici.Nel nostro primo esempio, creeremo una specie di istanza isometrica in stile Sim City di audio 3D con un emettitore stazionario. Il nostro ascoltatore sarà legato a un oggetto di gioco che segue il cursore del mouse e l'emettitore del suono 3D rimarrà all'interno di un oggetto che non si muove. Questo oggetto sarà rappresentato da un piccolo gruppo di edifici, e l'emettitore riprodurrà un suono di scape urbano con traffico frenetico e clacson.
Questo ci permetterà di testare le proprietà di decadimento audio del sistema audio 3D, e saremo in grado di capire meglio l'importanza dell'orientamento dell'ascoltatore.
Il nostro listener audio 3D esisterà all'interno di un oggetto che segue il cursore del mouse. In questo esempio, l'oggetto sarà identificato da uno sprite che assomiglia a un marcatore GPS. Il obj_listener
oggetto contiene due importanti blocchi di codice: uno in Creare
evento e uno in Passo
evento.
Clicca il Aggiungi evento pulsante e selezionare Creare aggiungere un Creare
evento a obj_listener
. Trascina il Esegui codice icona dal Controllo scheda del obj_listener
finestra delle proprietà nel Azioni sezione del Crea Evento pannello. Fare doppio clic sul Esegui codice icona per aprire l'editor di codice GML e aggiungere la seguente riga di codice:
audio_listener_orientation (0,1,0,0,0,1);
Questo codice garantisce che, non appena viene creato l'oggetto listener, verrà posizionato nello spazio 3D da cercare in direzione lo schermo, con il lato destro rivolto verso l'alto. L'audio proveniente da un emettitore situato a destra dell'ascoltatore sarà più presente nell'altoparlante destro e viceversa. Questa è l'impostazione standard che si desidera utilizzare in quasi ogni tipo di implementazione listener in GameMaker: Studio.
Se si desidera scambiare l'audio sinistro e destro, si utilizzerà il seguente codice per l'orientamento:
audio_listener_orientation (0,1,0,0,0, -1);
Aggiungere un Passo
evento a obj_listener
e trascinarne un altro Esegui codice icona nel Azioni pannello. Apri nuovamente l'editor di codice GML e inserisci le seguenti righe di codice:
x = mouse_x; y = mouse_y; audio_listener_position (x, y, 0);
Questo codice trova la posizione corrente del cursore del mouse e assegna queste coordinate alla posizione del obj_listener
oggetto. La posizione del listener audio è definita anche da queste coordinate. Inserendo questo codice nel Passo
evento, ci assicuriamo che il obj_listener
oggetto, il suo sprite che lo accompagna e l'ascoltatore stesso sono sempre nella stessa posizione, dal momento che Passo
il codice evento viene eseguito su ogni frame durante il runtime.
(Il 0
in questo codice è la posizione z dell'ascoltatore. Dal momento che il nostro gioco è in 2D, il nostro ascoltatore sarà sempre presente 0
sull'asse z.)
Aprire la stanza in cui si desidera visualizzare l'oggetto listener. Clicca il Oggetti scheda e fare clic all'interno del pannello per visualizzare l'elenco degli oggetti disponibili. Seleziona il tuo oggetto listener e clicca all'interno della stanza per posizionarlo. La posizione iniziale di questo oggetto non ha importanza, perché verrà aggiornata per corrispondere alla posizione del cursore del mouse in fase di esecuzione.
Questo è tutto per l'ascoltatore. Ora dobbiamo creare qualcosa che l'ascoltatore possa ascoltare.
Come con l'ascoltatore, ci concentreremo esclusivamente su Creare
e Passo
eventi dell'oggetto emettitore. In questo caso, inseriremo l'emettitore nel obj_city
oggetto.
Aggiungi il Creare
e Passo
eventi a obj_city
,e aggiungere un Esegui codice azione per entrambi gli eventi.
Nel codice GML del Creare
evento, aggiungere quanto segue:
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
è il nome del nostro nuovo emettitore.)
Abbiamo scelto il Distanza esponenziale modello falloff per questo esempio perché fornisce una diminuzione costante del guadagno con un forte aumento una volta che si incontra il Distanza di riferimento punto. Ciò consente di ridurre il volume dell'audio 3D man mano che ci si allontana dall'oggetto, senza intoppi, senza salti bruschi, finché non si avvicina molto alla sorgente. Per una lista completa dei modelli falloff e delle loro descrizioni approfondite, leggi la documentazione dei modelli falloff di GameMaker.
audio_emitter_falloff (emitter, falloff_ref, falloff_max, falloff_factor)
è dove impostiamo gli attributi del modello falloff:
emettitore
è nostro s_emit
variabile. falloff_ref
è il punto in cui inizierà il decadimento del volume. falloff_max
è il punto in cui l'ascoltatore non sarà più in grado di sentire l'emettitore.falloff_factor
è un numero usato nel audio_falloff_set_model
calcolo per determinare i risultati del falloff. Nel nostro esempio, usiamo il valore predefinito di 1
così che il nostro s_emit
l'emettitore inizierà a cadere una volta che l'ascoltatore è a 100 pixel di distanza dall'emettitore e l'ascoltatore non sarà in grado di sentire l'emettitore ad una distanza di 300 pixel o superiore.audio_play_sound_on (emettitore, suono, loop, priorità)
è come otteniamo che l'emettitore inizi a suonare il nostro suono 3D:
emettitore
è nostro s_emit
variabile. suono
è nostro snd_cityaudio
Asset audio 3D che abbiamo importato in precedenza. ciclo continuo
determina se questo suono dovrebbe ripetersi o meno. priorità
è un valore da 0
a 100
che determina "l'importanza" del suono riprodotto - numeri più grandi rappresentano suoni con priorità più alta. Nel nostro esempio, viene riprodotto solo un suono, quindi la priorità non ha importanza. E poiché questo codice viene eseguito nel Creare
evento e abbiamo scelto di riprodurre il suono, questa risorsa audio 3D verrà riprodotta non appena verrà caricata la stanza, e continuerà a suonare fino a quando non viene richiesto di fermarsi. E questo ci porta a molto passo importante:
Questa risorsa audio verrà riprodotta anche quando si carica un'altra stanza che non contiene l'emettitore. Per impedire efficacemente a questa risorsa di giocare in qualsiasi stanza diversa dalla stanza che contiene l'emettitore, dobbiamo aggiungere un Fine della Stanza
evento a obj_city
.
Nel Azioni pannello del Fine della Stanza
evento, aggiungi un altro Esegui codice icona con il seguente codice GML:
sound_stop (snd_cityaudio);
Ora tutto ciò che resta da fare è posizionare il obj_city
oggetto nella stanza come prima hai messo l'ascoltatore. Esegui il gioco e sperimenta con la posizione del cursore del mouse per cambiare la posizione dell'ascoltatore in relazione all'emettitore per vedere esattamente come funziona l'audio 3D in pratica.
Nel secondo esempio, collegheremo l'emettitore a un oggetto in movimento e applicheremo l'effetto Doppler mentre usiamo lo stesso oggetto listener che abbiamo creato in precedenza.
Un oggetto proiettile si sta spostando dal lato destro dello schermo a sinistra. Quando il proiettile raggiunge il bordo dello schermo, si avvolge e continua da dove è iniziato. (Non passeremo attraverso come creare questo movimento.) L'oggetto proiettile emette un suono in loop che può essere descritto come un suono "sibilante" o "ronzio". Quando l'oggetto si avvicina all'ascoltatore, il frequenza del suono cambierà, a causa dell'effetto Doppler.
Aggiungere un Creare
e a Passo
evento al obj_bullet
oggetto e aggiungere il Esegui codice azione per entrambi gli eventi.
Nel Creare
evento, aggiungi il seguente codice all'editor 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);
Qui, s_emit2
è il nome del nostro nuovo emettitore.
Questo emettitore utilizzerà lo stesso modello di falloff definito nella stanza precedente, poiché solo un tipo di modello falloff può essere attivo contemporaneamente e il nostro modello originale è adatto per questo esempio. Le nuove proprietà di falloff utilizzano un riferimento falloff di 25
pixel, un massimo di falloff di 200
pixel e un fattore di diminuzione di 2.5
per il calcolo. Il snd_bullet
La risorsa audio 3D inizia a suonare non appena viene creato l'oggetto, con una priorità di 1
, e si collegherà indefinitamente.
Nell'editor GML del Passo
evento, aggiungi questa riga di codice:
audio_emitter_position (s_emit2, x, y, 0);
Poiché l'oggetto si muove e i valori xey cambiano costantemente, anche la posizione dell'emettitore verrà aggiornata alla nuova posizione ad ogni passo.
Non dimenticare di aggiungere l'oggetto proiettile alla stanza, e assicurati di aggiungere il sound_stop (snd_bullet)
codice per l'oggetto Fine della Stanza
evento.
Il sistema audio 3D è ora disponibile per l'oggetto bullet e l'ascoltatore funziona correttamente, ma rendiamo le cose più interessanti con l'effetto Doppler.
Aggiungere l'effetto Doppler è molto semplice, in realtà. Basta aprire il Esegui codice azione nel obj_bullet
Creare
evento e aggiungere la seguente riga di codice:
audio_emitter_velocity (s_emit2, -25, -25, 0);
audio_emitter_velocity (emitter, vx, vy, vz)
ci consente di definire le proprietà dell'effetto Doppler:
emettitore
è nostro s_emit 2
variabile. vx
è la velocità (in pixel per passo) lungo l'asse x. vy
è la velocità (in pixel per passo) lungo l'asse y. vz
si applica alla velocità lungo l'asse z, ma il nostro gioco è in 2D, quindi lo stiamo impostando 0
. Le impostazioni tipiche dell'effetto Doppler usano il hspeed
e vspeed
variabili di un oggetto per determinare i valori di velocità, ma in questo caso, usiamo solo un valore di -25
per creare un suono di proiettile più realistico. È possibile testare l'oggetto con il seguente codice per notare la differenza:
audio_emitter_velocity (s_emit2, hspeed, vspeed, 0);
L'audio 3D può aggiungere una grande quantità di profondità e atmosfera al tuo progetto di gioco, con il minimo sforzo richiesto. Ecco alcuni esempi per iniziare: