Após uma tarefa e apenas começando com a libGDX , construindo um pequeno clone Snake, encontrei um problema pelo qual provavelmente terei vergonha daqui a pouco.
Atualmente, tenho uma cabeça de cobra (um simples retângulo nesta fase) movendo-se pela tela do jogo. A maneira mais direta de construir o resto da cobra era ter a cabeça proprietária de uma Java Linked LinkedList de SnakeElements que aumentaria / diminuiria de tamanho de acordo com o que o jogador faz.
Ter esta lista de elementos de cobra seguindo a cabeça, no entanto, provou não ser trivial.
A função atual que faz isso é a seguinte e é chamada toda vez que o cabeçote atualiza sua posição:
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;
}
}
que infelizmente resulta neste comportamento:
Qualquer dica sobre como fazer um rabo de cobra funcionando corretamente seria muito apreciada :)
A maneira como eu vejo isso é como um sistema semelhante à "Lagarta", onde cada parte da cobra segue a parte à frente.
Em outras palavras, cada parte da cobra seria um Objeto com Posição (x, y) , uma referência à parte à frente que ela usaria para se movimentar e uma função para processar a posição da parte à frente e mova-se de acordo. A cobra principal (a Cabeça) deve ter referências para todas as partes da cobra e chamaria a função responsável de fazer a parte seguir seu antecessor, sendo a Cabeça o predecessor da primeira parte.
Espero que ajude!
fonte