Eu entrei recentemente no XNA e devo dizer que eu amo isso. Como uma espécie de olá, decidi criar o clássico jogo "Snake". A versão de 90 graus era muito simples e fácil de implementar. Mas, como tento criar uma versão que permita rotação de 360 graus usando as setas esquerda e direita, me deparei com um problema.
O que estou fazendo agora deriva da versão de 90 graus: Iterando através de cada parte do corpo da cobra, começando na cauda e terminando bem antes da cabeça. Isso funciona muito bem ao mover a cada 100 milissegundos. O problema é que isso cria um estilo de jogo instável, já que tecnicamente o jogo progride a apenas 6 fps, em vez do potencial 60.
Eu gostaria de mover a cobra a cada loop do jogo. Infelizmente, porém, porque a cobra se move na proporção do tamanho da cabeça, ela é muito rápida. Isso significaria que a cabeça precisaria se mover em um incremento muito menor, como (2, 2) na direção, e não no que tenho agora (32, 32). Como eu tenho trabalhado neste jogo várias vezes durante o gerenciamento da escola, acho que estive pensando demais em como fazer isso. Provavelmente é uma solução simples, só não estou entendendo.
Aqui está um pseudocódigo para o que eu tentei baseado no que faz sentido para mim. Eu realmente não consigo pensar em outra maneira de fazer isso.
for(int i = SnakeLength - 1; i > 0; i--){
current = SnakePart[i], next = SnakePart[i - 1];
current.x = next.x - (current.width * cos(next.angle));
current.y = next.y - (current.height * sin(next.angle));
current.angle = next.angle;
}
SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;
Isso produz algo parecido com isto: Código em Ação . Como você pode ver, cada parte fica sempre atrás da cabeça e não produz um efeito de "trilha".
Um exemplo perfeito do que eu estou procurando pode ser encontrado aqui: Data Worm . Não é a rotação da viewport, mas o efeito final dos triângulos.
Obrigado por qualquer ajuda!
fonte