Zwischen A* und Luftlinie switchen

E

Eichelhäer

Bekanntes Mitglied
Hallo,

ich versuche zwischen A* und Luftlinie zu switchen. Soll heißen ich hab ein Feld mit Hindernissen auf dem sich Einheiten Feldweise und direkt von A nach B (MausKlick) begen lassen. Meine Positionen sind als doubles implementiert und sin absolute Koordinaten mein A* läuft via tilekoordinaten. Nun habe ich ne variable tileposition x/y die die aktuelle tileposition speichert. Diese läuft immer mit und wird ständig upgedatet. Jetzt hab ich einfach pro Frame abgefragt, ob vor der zu bewegenden Einheit ein Hindernis ist. Falls ja nimm a* andernfalls lauf direkt. Ich vermute dass das mit den doubles nicht hinhaut aber wo genau der fehler liegt weiss ich nicht.

Hier mal etwas Code:

das aktualisiert die tileposition

Java:
if(entities.get(0).marked) {
            
            entities.get(0).tilepositionx = Maths.toTileX((int)entities.get(0).position.x);
            entities.get(0).tilepositiony = Maths.toTileX((int)entities.get(0).position.y);
            
            if(checkObstacles(entities.get(0))) {
                entities.get(0).path = TiledMap.findPath(entities.get(0).tilepositionx,entities.get(0).tilepositiony,(int)Maths.toTileX(rightx),(int)Maths.toTileY(righty));
                entities.get(0).moveAStar(); // das ist die a* kachelbewegung
            }
            else {
                entities.get(0).move(rightx,righty);  // das ist die direkte bewegung
            }
            
        }

würde mich über hilfe freuen
 
E

Eichelhäer

Bekanntes Mitglied
Ach so mein Problem : Die Einheit läuft mit jeder der Bewegungen einwandfrei wie erwartet. In Kombination aber zuck sie aber ständig hin und her als könnte sie sich nicht entscheiden welche Bewegung sie nehmen soll. Während die direkte variante dabei flüssig läuft ist dann beim a* das geruckel und die Bewegung läft gefühlt doppelt so schnell.
 
E

Eichelhäer

Bekanntes Mitglied
Könnte sein, allerdinds sage ich eindeutig mit checkObstacles(),dass er nur dann den A* nehmen soll.
 
mihe7

mihe7

Top Contributor
Das schon, aber es könnte ja z. B. sein, dass der Code oben auch während des A-Sterns ausgeführt wird und dann wieder auf Luftlinie geswitched wird.
 
E

Eichelhäer

Bekanntes Mitglied
Ok. Wie sollte ich dann prüfen wann geswitched werden sollte, oder es eindeutiger formulieren sollte, dass wirklich nur eine der beiden Methoden ausgeführt wird?
 
E

Eichelhäer

Bekanntes Mitglied
Ok, ich glaube es liegt daran, dass sobald a* ausgeführt wird dieser dann bis zum absoluten Endpunkt berechnet wird. Der Endpunkt für den a* sollte aber nicht immer der tatsächliche Endpunkt sein, sondern der, bis zu dem der a*-weg gegangen werden soll, grob gesagt bis er kein Hindernis mehr erkennt.
 
mihe7

mihe7

Top Contributor
Das erklärt aber irgendwie noch kein hin- und herspringen, denn A* würde den kürzesten Weg wählen, d. h. ohne Hindernis Luftlinie wählen.
 
E

Eichelhäer

Bekanntes Mitglied
Naja, ich lasse den a* kachelbasiert (also jeder Knoten ist eine Kachel) und nicht pixelbasiert laufen. Kachel Größe 32x32;
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben