Comment approcher le serpent à 360 degrés

8

Je suis récemment entré dans XNA et je dois dire que j'adore ça. Comme une sorte de jeu bonjour, j'ai décidé de créer le jeu classique "Snake". La version à 90 degrés était très simple et facile à mettre en œuvre. Mais alors que j'essaie d'en faire une version qui permet une rotation à 360 degrés à l'aide des flèches gauche et droite, je suis entré dans une sorte de problème.

Ce que je fais maintenant découle de la version à 90 degrés: itération à travers chaque partie du corps de serpent commençant à la queue et se terminant juste avant la tête. Cela fonctionne très bien lors du déplacement toutes les 100 millisecondes. Le problème est que cela crée un style de jeu saccadé car techniquement le jeu progresse à seulement 6 images par seconde plutôt que son potentiel de 60.

Je voudrais déplacer le serpent à chaque boucle de jeu. Mais malheureusement, parce que le serpent bouge au rythme de sa taille, il va beaucoup trop vite. Cela signifierait que la tête devrait se déplacer à un incrément beaucoup plus petit tel que (2, 2) dans sa direction plutôt que ce que j'ai maintenant (32, 32). Parce que je travaille sur ce jeu de temps en temps pendant quelques semaines tout en gérant l'école, je pense que j'ai trop réfléchi à la façon d'y parvenir. C'est probablement une solution simple, je ne la rattrape pas.

Voici un pseudo-code pour ce que j'ai essayé basé sur ce qui est logique pour moi. Je ne peux pas vraiment penser à une autre façon de le faire.

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;

Cela produit quelque chose comme ceci: Code en action . Comme vous pouvez le voir, chaque partie reste toujours derrière la tête et ne fait pas d'effet "Trail".

Un exemple parfait de ce que je fais peut être trouvé ici: Data Worm . Pas la rotation de la fenêtre mais l'effet de fuite des triangles.

Merci pour toute aide!

Austin Brunkhorst
la source

Réponses:

5

Avec cet algorithme, vous faites face à chaque segment sous le même angle que celui qui le précède. C'est pourquoi ils finissent tous par se placer directement derrière la tête, ils sont finalement tous face au même angle. Comme vous pouvez le voir dans le jeu Data Worm que vous avez lié, chaque segment fait face au segment en face de lui . Déterminez l'angle entre le segment actuel nextet le sien et faites pointer le segment de cette façon au lieu de le définir next.angle.

Pour cette implémentation, vous souhaiterez peut-être effectuer une itération de l'avant vers l'arrière à la place. Le comportement sera différent selon la direction dans laquelle vous passez dans la liste. Essayez-les tous les deux et voyez ce qui fonctionne le mieux.

J'ai utilisé une idée similaire pour un prototype de projet dans le passé ( lien Unity WebPlayer ). J'ai utilisé un code similaire (bien qu'en 3D) pour amener chaque segment à se tourner vers le segment devant lui et à reculer d'une distance définie. A fonctionné comme un charme.

chaosTechnicien
la source
C'est génial! Je lisais un blog qui utilise un concept similaire à celui-ci mais ne pensait pas à répéter d'avant en arrière. Je vais essayer et marquer cela comme une réponse si elle réussit.
Austin Brunkhorst
Mise à jour: ça marche! Il a fallu un certain temps pour comprendre le concept et comprendre ce qui se passe réellement. Merci encore de m'avoir conduit dans la bonne direction! Voici une vidéo du code de travail :) screenr.com/Fhn8 . Ne vous occupez pas de la collision de nourriture, n'y avez pas passé beaucoup de temps.
Austin Brunkhorst
1
Heureux d'avoir pu aider!
chaosTechnician
Votre lien est mort.
Jeff
1
@Jeff Apparemment, Dropbox a décidé que j'attire trop de trafic, ce qui est étrange ...
chaosTechnician