Como se aproximar da serpente de 360 ​​graus

8

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!

Austin Brunkhorst
fonte

Respostas:

5

Com esse algoritmo, você faz com que cada segmento fique com o mesmo ângulo que o da frente. É por isso que todos acabam ficando diretamente atrás da cabeça; no final, todos estão enfrentando o mesmo ângulo. Como você pode ver no jogo do Data Worm que você vinculou, cada segmento fica voltado para o segmento à sua frente . Determine o ângulo do segmento atual para o dele nexte faça com que o segmento aponte dessa maneira, em vez de configurá-lo para next.angle.

Para essa implementação, você pode, na verdade, iterar da frente para trás. O comportamento será diferente com base na direção que você passa pela lista. Experimente os dois e veja o que funciona melhor.

Eu usei uma idéia semelhante para um protótipo de projeto no passado ( link do Unity WebPlayer ). Usei código semelhante (embora 3D) para fazer com que cada segmento se virasse em direção ao segmento à sua frente e mantivesse uma distância definida. Funcionou como um encanto.

caosTechnician
fonte
Isso é ótimo! Eu estava lendo um blog que usa um conceito semelhante a esse, mas não pensava em iterar de frente para trás. Vou tentar e marcar isso como resposta, se for bem-sucedido.
Austin Brunkhorst
Atualização: Está funcionando! Levou algum tempo para entender o conceito e entender o que realmente está acontecendo. Mais uma vez obrigado por me levar na direção certa! Aqui está um vídeo do código de funcionamento :) screenr.com/Fhn8 . Não se importe com a colisão de alimentos, não gastou muito tempo com isso.
Austin Brunkhorst
11
Ainda bem que pude ajudar!
Home
Seu link está morto.
22413 Jeff
11
@ Jeff Aparentemente Dropbox decidiu Estou desenhando muito tráfego de alguma forma, o que é estranho ...
chaosTechnician