Ich mache ein Tower Defense-Spiel in Flash ohne vordefinierten Pfad.
Obwohl mein Raster 40x40 (klein?) Ist, hat A * bei jeder Neuberechnung Probleme. Also habe ich meine eigenen Änderungen vorgenommen, um die Neuberechnung zu vereinfachen, und die Anzahl der berührten Zellen ist auf etwa 900 gesunken (bei Änderungen in der Nähe der Wurzel). Es friert immer noch für eine sehr kurze, aber nachweisbare Zeit ein, wenn ein neuer Turm aufgestellt wird.
Ist dies ein Implementierungsproblem oder ist 40x40 einfach zu viel?
Bearbeiten:
Die Struktur meines Codes:
- Alle Daten werden in einem 2D-Array von Zellen gespeichert.
- Jede Zelle enthält ihr übergeordnetes Element in Pfadrichtung (1-8 im Uhrzeigersinn) und ein bitweise codiertes Array ihrer untergeordneten Elemente im Pfad (jedes Bit repräsentiert ein untergeordnetes Element).
- Die Suche wird von A * mit der Schätzung der euklidischen Entfernung durchgeführt.
Antworten:
Ich kann nicht kommentieren, aber erstes Profil in Flex, alles andere ist Vermutung.
quelle
Ich gehe davon aus, dass TD "Tower Defense" ist.
Ich denke, A * geht dafür etwas über Bord.
Füllen Sie zu Beginn des Spiels den Spielbereich von den Ausgangspunkten aus, um eine Bewegungskarte zu erstellen:
und Bewegung ist immer in Richtung eines Quadrats mit einem niedrigeren Wert.
Wenn der Spieler einen Turm platziert, aktualisieren Sie jedes der acht benachbarten Felder: Setzen Sie für jedes Feld seinen Bewegungswert auf eins mehr als den niedrigsten benachbarten Wert. Wenn sich der Wert ändert, wiederholen Sie den Vorgang, der auf dem aktualisierten Quadrat zentriert ist. Um zu überprüfen, ob der Weg zum Ausgang nicht blockiert ist, stellen Sie sicher, dass alle Quadrate neben einem Quadrat mit einem niedrigeren Wert liegen.
Wenn der Spieler einen Turm entfernt, setzen Sie den Bewegungswert auf eins mehr als das niedrigste benachbarte Feld und wiederholen Sie den obigen Vorgang.
Ein einfacherer Ansatz wäre, die Flutfüllung erneut durchzuführen.
quelle
Seltsam, ich dachte, ich hätte darauf geantwortet, aber die Antwort scheint weg zu sein. Stellen Sie Ihren Suchalgorithmus so ein, dass er in mehreren Schritten aktualisiert werden kann. Wenn Sie also einen Turm platzieren und eine Animation abspielen, können Sie jedes Bild ein wenig bearbeiten und haben zwischen einer halben und einer Sekunde Zeit, um Ihr Bild zu aktualisieren A * ohne merkliche Pause. Es ist Latenz - wenn Sie es nicht beschleunigen können, finden Sie einen Weg, es zu verbergen. Das Abspielen einer Animation beim Platzieren eines Turms wäre für ein Spiel selbstverständlich und ein guter Ort, um es zu verstecken.
quelle
Zunächst könnten Sie Ihr Array in einen Vektor ändern - dies sollte Ihnen einige Geschwindigkeitsverbesserungen bringen. Wenn Sie den Code veröffentlichen, können wir möglicherweise weitere Optimierungen vorschlagen.
quelle
Ich würde vermuten, dass Ihre Verlangsamung darauf zurückzuführen ist, dass Sie einen Pfad für alle Zeichen gleichzeitig berechnen. Das Berechnen eines Pfades für ein Zeichen ist schnell, aber wenn die Szene zwei Dutzend Zeichen enthält, kann dies ins Stocken geraten.
Stattdessen sollten Sie die Last auf einige Frames verteilen. Versetzen Sie Ihre KI-Updates, damit verschiedene Charaktere ihren Pfad in verschiedenen Frames aktualisieren. Es wäre wirklich auffällig, wenn ein Charakter erst eine Sekunde später reagieren würde, aber nur ein Frame wird keine schlechten Reaktionen hervorrufen.
quelle