После выполнения задания и начала работы с libGDX путем создания небольшого клона Snake, я столкнулся с проблемой, за которую мне, вероятно, будет стыдно через некоторое время.
В настоящее время у меня есть голова змеи (простой прямоугольник на данном этапе), которая движется по холсту игры. Самый простой способ построения остальной части змеи - это иметь в голове собственный Java-коллекционный LinkedList SnakeElements, размер которого будет увеличиваться / уменьшаться в зависимости от того, что делает игрок.
Наличие этого списка SnakeElements следует за головой, однако оказалось не тривиальным.
Текущая функция, выполняющая это, выглядит следующим образом и вызывается каждый раз, когда голова обновляет свою позицию:
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;
}
}
что, к сожалению, приводит к такому поведению:
Любые советы о том, как сделать правильно работающий змеиный хвост, будут очень благодарны :)