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.
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?
Antworten:
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.
quelle
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
quelle
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.
quelle