Po przydzieleniu zadania i rozpoczęciu pracy z libGDX przez zbudowanie małego klona Węża natknąłem się na problem, który pewnie za chwilę się wstydzę.
Obecnie mam głowę węża (na tym etapie prosty prostokąt) poruszającą się po kanwie gry. Najprostszym sposobem na zbudowanie reszty węża było posiadanie przez szefa biblioteki Java Linked Linked List SnakeElements, która zwiększałaby / zmniejszała rozmiar w zależności od tego, co robi gracz.
Wykazanie, że lista SnakeElements podąża za tobą, nie okazało się jednak trywialne.
Bieżąca funkcja, która to robi, jest następująca i jest wywoływana za każdym razem, gdy głowa aktualizuje swoją pozycję:
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;
}
}
co niestety powoduje takie zachowanie:
Będziemy wdzięczni za wszelkie wskazówki, jak zrobić prawidłowo działający ogon węża :)
Widzę to jako system „gąsienicowy”, w którym każda część węża podąża za częścią przed sobą.
Innymi słowy, każda część węża byłaby Obiektem z Pozycją (x, y) , odniesieniem do części przed nią, której użyłby do poruszania się, oraz funkcją do przetworzenia pozycji części przed nią i przesuń się odpowiednio. Główny wąż (Głowa) powinien mieć odniesienia do każdej części węża i wywoływałby funkcję odpowiedzialną, aby część podążała za swoim poprzednikiem, będąc Głową poprzednikiem pierwszej części.
Mam nadzieję, że to pomoże!
źródło