Allgemein: Wegfindung bei Waypoints

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Allgemein: Wegfindung bei Waypoints

BeitragDo, Apr 22, 2010 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.

Ich hab mal ne Frage bei der es weniger um den COde geht.
Undzwar: Mein Wegpunkte System ist jetzt im Prinzip vollständig implementiert.
Meine Gegner laufen die Wegpunkte auch ab, indem sie immer zu dem nächstgelegen Wegpunkt laufen.
Das Problem, das sich daraus ergeben hat, ist, dass sie irgendwann bestimmte Muster gelaufen sind, bzw sich auf 3 Wegpunkte eingelaufen haben.
Das hab ich ein wenig korrigieren können, indem ich einen "alten" Wegpunkt mehr gespeichert habe, der dann nicht benuttz werden darf.
Aber: Jetzt passiert das gleiche mit 4 Wegpunkten.
Das soll ja aber nicht sein. DIe Wegpunkte sollen nur dafür da sein, dass die Gegner wissen, wo sie herlaufen können.
Es wäre aber auch eher schlecht, wenn ich sagen wir jeweils die 4 oder 5 letzten Wegpunkte speichere, die dann verboten sind.
Das ist eher nicht Sinn und Zweck der Sache und wäre auch wahrscheinlich verbugged.

Meine Frage jetzt also: Wie stellt man sowas am besten an?

Achso, ganz kurz zur Bewegung: Die Gegner haben ein Attribut "twGoal" vom Typ TWaypoint. Sie richten sich dann per atan2 zum Wegpunkt aus und bewegen sich mittels Sinus/Cosinus auf ihn zu. Ab einer bestimmten Entfernung suchen sie sich einen neuen Wegpunkt.

Lg, M0rgenstern

Alfadur

BeitragFr, Apr 23, 2010 1:47
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz versteh ich das Problem nicht, aber warum speicherst du nicht einfach alle Wegpunkte in einer Liste!? Die Liste gehört zum Gegner, der schaut jetzt ob ein Wegpunkt in der Liste enthalten ist, wenn ja wird dieser Wegpunkt zum aktuellen Wegpunkt gemacht und aus der Liste gelöscht. Solange ein aktueller Wegpunkt vorhanden ist, wird sich darauf zubewegt, is der Wegpunkt erreicht wird der nächste aus der Liste gesucht, zugewiesen, gelöscht usw ...

Nach welchem System du die Wegpunkte jetzt in die Liste bringst bleibt dir überlassen, für richtiges Pathfinding wär wiedermal A* angebracht.
A Cray is the only computer that runs an endless loop in less than four hours.

NightPhoenix

BeitragFr, Apr 23, 2010 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Für halbwegs intelligente von A nach B Bewegung musst du noch so etwas wie ein Wegfindungs-system einsetzen. Die Wegpunkte die du an den Kreuzungen auf einer Karte etc. gesetzt hast dienen dabei als "Punkte im Raster" ähnlich der Pathfinding Demo im BMax Ordner (oder BB, weiß nicht genau). Jetzt musst du nach dem kürzesten, möglichen Weg suchen die zum Ziel führen. Du musst also von einem Startwegpunkt A zum absoluten Zielwegpunkt B die richtigen Wegpunkte "dazwischen" heraus picken.
Ich hab mich selbst noch nicht mit Pathfinding beschäftigt, also kann ich dir leider kein Beispiel geben. Ich bin mir aber sicher, dass dir einige Andere hier im Forum weiter helfen können. Smile

M0rgenstern

BeitragFr, Apr 23, 2010 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, es geht weniger darum, dass die Gegner von Punkt A schnellstmöglich zu Punkt B gelangen, bei dem Waypoint System.
Das ist eher dazu gedacht, die ganze Karte zu überziehen (mehr oder weniger) um es den Gegnern zu ermöglichen, sich auf der ganzen Karte zu bewegen und nicht über verbotene Tiles etc zu laufen.
Also, die Waypoints setze ich so, dass die Gegner niemals über Wasser oder durch Häuser laufen können etc.
Und damit sie sich über die komplette Karte bewegen können.
Da der Spieler ja überall sein kann. Den Weg zum Spieler sollen sie nur einschlagen, wenn dieser in Sichtweite kommt.

Vielleicht ist es jetzt klarer. wozu ich das ganze benutze.

So und jetzt ergiebt sich folgendes Problem: Die Entscheidung, welcher Wegpunkt als nächstes angesteuert wird, ergiebt sich daraus, wie nah er zum momentan angesteuerten Wegpunkt ist, und ob er mit diesem verbunden ist.
Das Problem, dass sich durch den jeweils kürzesten Weg ergiebt, ist, dass die Gegner dann irgendwann einem bestimmten Muster folgen (4 Wegpunkte, die jeweils dicht hintereinander liegen).
Und eben dieses Verhalten will ich vermeiden.
Aber die einzige Lösung die mir dazu einfällt: Die 4 oder 5 letztbesuchten Wegpunkte in jeweils einer Variable zu speichern und diese dann als verboten zu markieren.
Aber das halte ich nicht gerade für die beste Lösung.

Meine Frage ist jetzt: Gibt es überhaupt eine bessere Lösung, wenn ja, welche?

HOffe, dass das verständlicher ist.

Lg, M0rgenstern

DaysShadow

BeitragFr, Apr 23, 2010 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde jedem WayPoint ein Array von WayPoints geben von denen aus dein "Läufer" einen nehmen darf und das würde ich zufällig mit Rand() regeln.

Also das WayPoint A noch WayPoint B,C und D kennt die alle mit ihm verbunden sind und dass der Läufer einen aus B,C und D auswählt.
K.A inwiefern du das gescheit umsetzen kannst, weiß ja nicht wie du das handhabst mit deinen WayPoints.

MfG DaysShadow
Blessed is the mind too small for doubt

M0rgenstern

BeitragFr, Apr 23, 2010 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, meine Waypoints funktionieren folgendermaßen:
Ich habe eine Waypointklasse, die hat ein Feld x, ein Feld y und ein Feld ID.
Dann habe ich eine Klasse Waypointconnection.
Diese hat ein Feld Waypoint1 und ein Feld Waypoint2
In der Waypointconnection Klasse wird also gespeichert welcher Wegpunkt mit welchem verbunden ist.

Lg, M0rgenstern

BladeRunner

Moderator

BeitragFr, Apr 23, 2010 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Meinst Du nicht dass es sinniger wäre wenn jeder Waypoint mehrere Verknüpfungen hätte - also zB eine Liste mit Waypoints?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

M0rgenstern

BeitragFr, Apr 23, 2010 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm.
Ich weiß nicht.
Hatte die Technik die ich benutze mal irgendwo gesehen und fand das relativ logisch.
Aber da hast du wohl recht.

Dann hab ich aber mal ne Frage zu:
Ich weiß ja vorher nicht, wieviele Waypoints in die Liste eingefügt werden.
Wie kann ich denn ein Array vergrößern?

Lg, M0rgenstern

BladeRunner

Moderator

BeitragFr, Apr 23, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Du brauchst kein Array, nimm eine TList als Field deiner Kasse.

EDIT: Du kannst dir dann auch das ID-Field sparen, da jeder WP ja automatisch alle benachbarten kennt.

M0rgenstern

BeitragSo, Apr 25, 2010 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Öhm, mal ne Frage zu deiner Idee:
Ich erstell die Waypoints in nem Editor auf der Map und speicher das ganze per writeint oder writestring etc.
Wie mach ich speichere ich denn den Inhalt der TList der einzelnen Waypoints ab?
Also die Eigenschaft welcher Waypoint mit welchem verknüpft ist?

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group