Nach einer Aufgabe und dem Einstieg in libGDX durch Erstellen eines kleinen Snake-Klons bin ich auf ein Problem gestoßen, für das ich mich wahrscheinlich in Kürze schämen werde.
Ich habe derzeit einen Schlangenkopf (zu diesem Zeitpunkt ein einfaches Rechteck), der sich auf der Leinwand des Spiels bewegt. Der einfachste Weg, den Rest der Schlange aufzubauen, bestand darin, dass der Kopf eine Java Collections LinkedList of SnakeElements besaß, deren Größe je nach den Aktivitäten des Spielers abnahm.
Es hat sich jedoch als nicht trivial erwiesen, dass diese Liste von SnakeElements dem Kopf folgt.
Die aktuelle Funktion, die dies tut, ist wie folgt und wird jedes Mal aufgerufen, wenn der Kopf seine Position aktualisiert:
private void moveTail (float x, float y, int direction) {
float tmpx, tmpy;
int tmpdirection;
int offset_x, offset_y;
for (SnakeSegment snse : tail) {
offset_x = 0;
offset_y = 0;
tmpx = snse.getX();
tmpy = snse.getY();
tmpdirection = snse.getDirection();
switch(direction) {
case 0:
offset_x = 0;
offset_y = -(2 + snse.width);
break;
case 1:
offset_x = -(2 + snse.width);
offset_y = 0;
break;
case 2:
offset_x = 0;
offset_y = (2 + snse.width);
break;
case 3:
offset_x = (2 + snse.width);
offset_y = 0;
break;
default:
System.out.println("wrong direction");
}
snse.setX(x + offset_x);
snse.setY(y + offset_y);
snse.setDirection(direction);
x = tmpx;
y = tmpy;
direction = tmpdirection;
}
}
was leider zu diesem Verhalten führt:
Alle Tipps, wie man einen richtig funktionierenden Schlangenschwanz macht, wären sehr dankbar :)
Ich sehe es als ein "Caterpillar" -ähnliches System, bei dem jeder Teil der Schlange dem vorhergehenden Teil folgt.
Mit anderen Worten, jeder Teil der Schlange wäre ein Objekt mit Position (x, y) , ein Verweis auf den Teil vor ihm, mit dem er sich bewegen würde, und eine Funktion, um die Position des Teils vor und zu verarbeiten entsprechend bewegen. Die Hauptschlange (der Kopf) sollte Referenzen für jeden Teil der Schlange haben und würde die Funktion aufrufen, die dafür verantwortlich ist, dass der Teil seinem Vorgänger folgt, wobei der Kopf der Vorgänger des ersten Teils ist.
Ich hoffe es hilft!
quelle