Come aggiungere un suono che un'intelligenza artificiale nemica può sentire?


10

Dato:

  • un gioco top down 2D
  • Le piastrelle sono memorizzate solo in un array 2D
  • Ogni piastrella ha una proprietà: smorza (quindi i mattoni potrebbero essere -50db, l'aria potrebbe essere -1)

Da questo voglio aggiungerlo così un suono viene generato nel punto x1, y1 e "si increspa". L'immagine qui sotto lo descrive meglio. Ovviamente l'obiettivo finale è che il nemico dell'IA possa "sentire" il suono, ma se un muro lo sta bloccando, il suono non viaggia così lontano.

inserisci qui la descrizione dell'immagine

Il rosso è il muro, che ha uno smorzamento di 50 dB.

Penso che nel terzo tick di gioco confondo i miei calcoli matematici.

Quale sarebbe il modo migliore per implementarlo?


1
Ti interessa il suono che riflette / riverbera? Cioè, se una sezione di muro insonorizzato è direttamente tra la sorgente sonora e l'agente AI, ma il muro può essere girato liberamente, l'agente AI dovrebbe ancora sentire il suono? Se la risposta è no, aggiorna ogni cella una sola volta per suono, quindi lo smorzamento viene applicato una sola volta a ciascuna sorgente sonora. Se hai solo pochi agenti AI, basta tracciare una linea dall'origine all'agente.
Sean Middleditch

L'obiettivo è avere molti agenti "stupidi" che seguono i tuoi suoni attorno ai muri e cosa no.
Chris

Risposte:


7

Sembra un'idea ragionevole, ricorda però, questa è una funzionalità di gioco, non renderla più complicata di quanto è richiesto per il gioco.

Modificherei il tuo schema per diffondere immediatamente il suono, poiché è probabilmente più facile da programmare e sembra più coerente con la rapida diffusione del suono reale.

Questo è essenzialmente un problema di pathfinding, e probabilmente è meglio risolverlo usando l'algoritmo di Dijkstra. Si tratta di una ricerca da uno a molti punti (una sorgente sonora, più nemici) e, come tale, può essere risolta in modo efficiente partendo dal punto singolo.

Si inizia facendo uno spread dalla sorgente e si contrassegnano tutti i vicini che non sono stati ancora contrassegnati e hanno un volume calcolato superiore a 0, ciascuno di quei vicini che si aggiunge a un elenco. Tale elenco deve essere ordinato per volume calcolato. Quindi ripeti il ​​processo per la voce di volume più alto nell'elenco, aggiungendo nuove voci all'elenco come necessario e rimuovendo quella che hai gestito. Ripetere fino a quando l'elenco è vuoto.

Ogni volta che durante questo processo raggiungi una tessera con un nemico, sai quale volume sente quel nemico.


1
+1 per viaggi sonori immediati. A meno che tu non stia facendo una simulazione fisica che si preoccupa di quella roba, KISS.
Hackworth,

Hmmm suona davvero bene. Concordo anche con @Hackworth riguardo al fatto che sia semplice. Il suono immediato è stato un momento del genere "è caduto un centesimo" nel momento in cui è stato menzionato. Ho iniziato a leggere l'algoritmo di Dijkstra, ma solo per confermare, può includere nodi ponderati per adattarsi a diversi tipi di pareti?
Chris

@Chris Sì, Dijkstra funziona anche con nodi ponderati, il che sarebbe un buon modo per modellare i muri (ad es. Il peso diminuirà il volume ecc.)
bummzack

9

Non penso che sia necessario un path finder, solo ray cast su ogni IA nell'area, se c'è un muro tra loro, non lo sentono. Funzionerebbe meglio con una sorta di grafico di scena + partizionamento spaziale


Sono d'accordo con questa risposta.
bobobobo,

La struttura dei dati per memorizzare il suono sarà anche molto più semplice in questo modo.
Chris

Mi piace l'idea di un cast di ray, ma non so se ciò spiegherebbe il suono che passa attraverso diversi tipi di pareti. Ad esempio, un piccolo rumore di passi non passerebbe attraverso il muro, ma il suono di un colpo di pistola lo farebbe. Ma in questo caso non so se ray casting risolverà quelle situazioni
Chris

1
Chris, basta prendere l'idea del raycast ed espanderla un po '. Ogni volta che il raggio interseca un oggetto, riduce il volume del suono di una certa quantità. Se il volume viene ridotto a zero prima che raggiunga l'IA, non viene ascoltato. Se raggiunge l'IA, allora hai un valore "volume" in mano. È inoltre possibile utilizzare questo tipo di "ray trace con riduzione del volume" per applicare un decadimento del suono a distanza.
Tim Holt,

@ Tim Holt - buon punto, non stavo pensando in questo senso
Chris

0

Penso che la tua implementazione presupponga che il livello sonoro in una cella sia cumulativo e che l'ampiezza si sposti semplicemente verso l'esterno in modo uniforme in tutte le direzioni. Il suono non si diffonde, fotogramma per fotogramma, o sta suonando o non lo è, e vuoi scoprire l'ampiezza con cui suonarlo per un dato punto.

Il raycasting attraverso le tessere è un modo (e probabilmente il modo più efficace) per farlo. Basta tracciare una linea tra l'emettitore e il ricevitore e sottrarre il valore di smorzamento di ogni cella lungo il percorso. Se il numero è positivo, si riproduce il suono.

Se vuoi modellare il suono indiretto, allora dovrai trovare il percorso. Tratta l'emettitore come la radice dell'albero e modella ogni cella adiacente come un nodo collegato. Ogni collegamento ha un costo, sottratto dal volume corrente. Continua ad attraversare il grafico fino a quando non trovi il ricevitore o il tuo volume scende al di sotto dello zero (se lo fa, fai un passo indietro e prova un altro percorso). Se non ci sono percorsi verso il ricevitore con un volume positivo, l'emettitore non può essere ascoltato. NB: non puoi semplicemente smettere di attraversare quando trovi il ricevitore, perché potrebbero esserci più percorsi dall'emettitore al ricevitore e hai bisogno di quello con il volume più alto.

Se stai modellando l'intelligenza artificiale che si preoccupa della provenienza del suono, quest'ultimo approccio ti aiuterà: un'intelligenza artificiale dovrebbe "sentire" il suono proveniente dalla direzione dell'ultimo segmento del percorso. Bene, se ci sono due percorsi udibili verso il ricevitore, l'IA potrebbe essere confusa riguardo ai suoni multipli e alla direzione da prendere.


1
Il suono è un'onda trasmessa attraverso il fluido. Potrebbe non essere appropriato simularlo in quel modo in un gioco, ma non è certo "non il modo in cui il suono funziona".
Kevin Reid,

Fiera punto, modificato
MrCranky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.