Hallo,
für ein Spiel brauche ich irgendein Algo fürs Pathfinding.
Ich habe mich führ A* entschieden und ihn umgesetzt.:rtfm:
Leider, lässt er, in Hinsicht auf die Geschwindigkeit stark zu wünschen übrig:
Kann mir eventuell jemand Tipps geben,
wie ich ihn Optimieren kann?
Opi3
für ein Spiel brauche ich irgendein Algo fürs Pathfinding.
Ich habe mich führ A* entschieden und ihn umgesetzt.:rtfm:
Leider, lässt er, in Hinsicht auf die Geschwindigkeit stark zu wünschen übrig:
Java:
public List<Point> search() {
if (start == null || ziel == null) {
return null;
}
clearNodes();
ArrayList<Knoten> openList = new ArrayList<Knoten>();
openList.add(start);
start.G = 1;
start.setH(ziel);
start.setF();
start.last = null;
Boolean zielGefunden = false;
while (!zielGefunden) {
if (openList.isEmpty()) {
return null;
}
Collections.sort(openList);
Knoten base = openList.get(0);
openList.remove(base);
base.flag = Knoten.IS_CLOSED_LIST;
if (checkKnoten(base.x - 1, base.y, base, openList)) {
zielGefunden = true;
}
if (checkKnoten(base.x + 1, base.y, base, openList)) {
zielGefunden = true;
}
if (checkKnoten(base.x, base.y - 1, base, openList)) {
zielGefunden = true;
}
if (checkKnoten(base.x, base.y + 1, base, openList)) {
zielGefunden = true;
}
}
ArrayList<Point> path = new ArrayList<Point>();
Knoten base = ziel;
path.add(ziel.point);
while (true) {
base = base.last;
if (base == null) {
break;
}
path.add(base.point);
}
return path;
}
private boolean checkKnoten(int _x, int _y, Knoten base,
ArrayList<Knoten> openList) {
if ((_x >= 0 && _x < x) && (_y >= 0 && _y < y)) {
Knoten k = knoten[_x][_y];
int g = base.G + 1;
int h = k.getH(ziel);
if (k.flag != Knoten.IS_CLOSED_LIST) {
k.G = g;
k.H = h;
k.setF();
k.last = base;
openList.add(k);
} else if (g < k.G) {
k.G = g;
k.H = h;
k.setF();
k.last = base;
openList.add(k);
k.flag = Knoten.IS_OPEN_LIST;
}
return k == ziel;
}
return false;
}
private void clearNodes() {
for (int _x = 0; _x < x; _x++) {
for (int _y = 0; _y < y; _y++) {
Knoten k = knoten[_x][_y];
k.G = -1;
k.H = -1;
k.F = -1;
k.flag = Knoten.NO_List;
k.last = null;
}
}
Kann mir eventuell jemand Tipps geben,
wie ich ihn Optimieren kann?
Opi3