После выполнения задания и начала работы с 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;
}
}
что, к сожалению, приводит к такому поведению:
Любые советы о том, как сделать правильно работающий змеиный хвост, будут очень благодарны :)
Я вижу ее как систему, похожую на «гусеницу», где каждая часть змеи следует за предшествующей.
Другими словами, каждая часть змеи была бы Объектом с Позицией (x, y) , ссылкой на часть впереди нее, которую она будет использовать для перемещения, и функцией для обработки позиции части впереди нее и двигаться соответственно. Главная змея (Голова) должна иметь ссылки для каждой части змеи и должна вызывать функцию, ответственную за то, чтобы деталь следовала за своим предшественником, будучи Главой, предшественником первой части.
Надеюсь, поможет!
источник