Wie füge ich einen Ton hinzu, den eine feindliche KI hören kann?

10

Gegeben:

  • ein 2D Top-Down-Spiel
  • Kacheln werden nur in einem 2D-Array gespeichert
  • Jede Fliese hat eine Eigenschaft - feucht (also könnten die Steine ​​-50 dB sein, die Luft -1)

Daraus möchte ich es hinzufügen, damit an Punkt x1, y1 ein Ton erzeugt wird und dieser "herauskräuselt". Das Bild unten skizziert es besser. Offensichtlich ist das Endziel, dass der KI-Feind den Ton "hören" kann - aber wenn eine Wand ihn blockiert, bewegt sich der Ton nicht so weit.

Geben Sie hier die Bildbeschreibung ein

Rot ist die Wand, die eine Dämpfung von 50 dB hat.

Ich denke, im dritten Spiel-Tick verwirre ich meine Mathematik.

Was wäre der beste Weg, dies umzusetzen?

Chris
quelle
1
Interessiert es Sie, dass der Schall überhaupt reflektiert / nachhallt? Das heißt, wenn sich ein Abschnitt der schalldichten Wand direkt zwischen der Schallquelle und dem KI-Agenten befindet, die Wand jedoch frei herumlaufen kann, sollte der KI-Agent den Ton trotzdem hören? Wenn die Antwort Nein lautet, aktualisieren Sie jede Zelle nur einmal pro Ton, sodass die Dämpfung nur einmal auf jede Tonquelle angewendet wird. Wenn Sie nur wenige KI-Agenten haben, verfolgen Sie einfach eine Zeile von Quelle zu Agent.
Sean Middleditch
Das Ziel ist es, dass viele 'dumme' Agenten Ihren Geräuschen an Wänden folgen und was nicht.
Chris

Antworten:

7

Es scheint eine vernünftige Idee zu sein. Denken Sie jedoch daran, dass dies eine Gameplay-Funktion ist. Machen Sie sie nicht komplizierter als für das Gameplay erforderlich.

Ich würde Ihr Schema so ändern, dass der Sound sofort verbreitet wird, da dies wahrscheinlich einfacher zu programmieren ist und mit der schnellen Verbreitung von echtem Sound konsistenter zu sein scheint.

Dies ist im Wesentlichen ein Pfadfindungsproblem und wird wahrscheinlich am besten mit dem Dijkstra-Algorithmus gelöst. Dies ist eine Eins-zu-Viele-Punkt-Suche (eine Schallquelle, mehrere Feinde) und kann als solche effizient gelöst werden, indem am einzelnen Punkt begonnen wird.

Sie beginnen mit einem Spread von der Quelle aus und markieren alle Nachbarn, die noch nicht markiert wurden und ein berechnetes Volumen über 0 haben, wobei jeder dieser Nachbarn einer Liste hinzugefügt wird. Diese Liste muss nach berechnetem Volumen sortiert werden. Anschließend wiederholen Sie den Vorgang für den Eintrag mit dem höchsten Volumen in der Liste, fügen der Liste nach Bedarf neue Einträge hinzu und entfernen den von Ihnen bearbeiteten Eintrag. Wiederholen, bis die Liste leer ist.

Wann immer Sie während dieses Vorgangs ein Plättchen mit einem Feind erreichen, wissen Sie, welche Lautstärke dieser Feind hört.

aaaaaaaaaaaa
quelle
1
+1 für sofortige Tonfahrt. Es sei denn, Sie machen eine Physiksimulation, die sich um dieses Zeug kümmert, KISS.
Hackworth
Hmmm klingt wirklich gut. Ich stimme auch @Hackworth darin zu, es einfach zu halten. Das unmittelbare Geräusch war in dem Moment, in dem es erwähnt wurde, so ein "Penny ist gefallen". Ich habe angefangen, über den Dijkstra-Algorithmus zu lesen, aber nur um zu bestätigen, dass er gewichtete Knoten enthalten kann, um verschiedene Wandtypen anzupassen.
Chris
@ Chris Ja, Dijkstra funktioniert auch mit gewichteten Knoten, was eine gute Möglichkeit wäre, Wände zu modellieren (z. B. das Gewicht verringert das Volumen usw.)
bummzack
9

Ich denke nicht, dass ein Pfadfinder notwendig ist, sondern nur einen Strahl auf jede KI in der Gegend werfen. Wenn eine Wand im Weg ist, hören sie das nicht. Dies würde am besten mit einer Art Szenendiagramm + räumlicher Partitionierung funktionieren

CobaltHex
quelle
Ich stimme dieser Antwort zu.
Bobobobo
Diese Datenstruktur zum Speichern des Sounds wird auch auf diese Weise viel einfacher.
Chris
Ich mag die Idee eines Strahlengusses, aber ich weiß nicht, ob dies für den Schall verantwortlich ist, der durch verschiedene Arten von Wänden geht. Zum Beispiel würde ein kleines Fußschrittgeräusch nicht durch die Wand gehen, sondern das Geräusch eines Schusses. Aber in diesem Fall weiß ich nicht, ob Ray Casting diese Situationen lösen würde
Chris
1
Chris, nimm einfach die Raycast-Idee und erweitere sie ein bisschen. Jedes Mal, wenn der Strahl ein Objekt schneidet, wird die Lautstärke des Tons um einen gewissen Betrag verringert. Wenn die Lautstärke vor Erreichen der KI auf Null reduziert wird, ist sie nicht zu hören. Wenn es die KI erreicht, haben Sie einen "Lautstärke" -Wert in der Hand. Sie können diese Art von "Ray Trace mit reduzierter Lautstärke" auch verwenden, um einen Schallabfall über die Entfernung anzuwenden.
Tim Holt
@ Tim Holt - guter Punkt, ich habe nicht in diese Richtung gedacht
Chris
0

Ich denke, Ihre Implementierung setzt voraus, dass der Schallpegel in einer Zelle kumulativ ist und dass sich die Amplitude einfach gleichmäßig nach außen in alle Richtungen bewegt. Der Ton breitet sich nicht Bild für Bild aus, er wird entweder abgespielt oder nicht, und Sie möchten die Amplitude herausfinden, mit der er für einen bestimmten Punkt abgespielt werden soll.

Raycasting durch die Kacheln ist eine Möglichkeit (und wahrscheinlich die effektivste), dies zu tun. Zeichnen Sie einfach eine Linie zwischen Sender und Empfänger und subtrahieren Sie den Dämpfungswert jeder Zelle auf dem Weg. Wenn die Zahl positiv ist, spielen Sie den Ton ab.

Wenn Sie indirekten Sound modellieren möchten, müssen Sie den Pfad finden. Behandeln Sie den Emitter als Wurzel Ihres Baums und modellieren Sie jede benachbarte Zelle als verknüpften Knoten. Jeder Link hat Kosten, die vom aktuellen Volumen abgezogen werden. Fahren Sie so lange durch das Diagramm, bis Sie entweder den Empfänger finden oder Ihre Lautstärke unter Null fällt (wenn dies der Fall ist, gehen Sie zurück und versuchen Sie es mit einem anderen Pfad). Wenn es keine Pfade zum Empfänger mit positiver Lautstärke gibt, ist Ihr Sender nicht zu hören. NB: Sie können das Durchlaufen nicht einfach aufgeben, wenn Sie den Empfänger finden, da es möglicherweise mehrere Pfade vom Sender zum Empfänger gibt und Sie den mit der höchsten Lautstärke benötigen.

Wenn Sie eine KI modellieren, die sich darum kümmert, woher der Ton kommt, hilft der letztere Ansatz - eine KI würde den Ton aus der Richtung des letzten Segments auf dem Pfad "hören". Wenn es zwei hörbare Pfade zum Empfänger gibt, kann die KI verwirrt sein über die verschiedenen Geräusche und die Richtung, in die sie gehen sollen.

MrCranky
quelle
1
Schall ist eine Welle, die durch Flüssigkeit übertragen wird. Es ist vielleicht nicht angebracht, es in einem Spiel so zu simulieren, aber das ist sicherlich nicht "nicht so, wie Sound funktioniert".
Kevin Reid
Fair Point, bearbeitet
MrCranky