# Zwischen A* und Luftlinie switchen



## Eichelhäer (29. Okt 2019)

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


```
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


----------



## Eichelhäer (29. Okt 2019)

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.


----------



## mihe7 (30. Okt 2019)

Eichelhäer hat gesagt.:


> In Kombination aber zuck sie aber ständig hin und her als könnte sie sich nicht entscheiden welche Bewegung sie nehmen soll.


Kann es vielleicht sein, dass während der Bewegung mittels A-Sterns ein "Rückfall" auf die direkte Bewegung erfolgt?


----------



## Eichelhäer (30. Okt 2019)

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


----------



## mihe7 (30. Okt 2019)

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.


----------



## Eichelhäer (30. Okt 2019)

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?


----------



## mihe7 (30. Okt 2019)

Geh halt mal mit dem Debugger durch.


----------



## Eichelhäer (30. Okt 2019)

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 (30. Okt 2019)

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.


----------



## Eichelhäer (31. Okt 2019)

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


----------

