Allgemein: Wegfindung bei Waypoints
Übersicht

![]() |
M0rgensternBetreff: Allgemein: Wegfindung bei Waypoints |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ö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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group