Comment faire suivre la tête d'une queue de serpent?

10

Suite à une mission et tout juste commencer avec libGDX en construisant un petit clone de Snake, j'ai rencontré un problème pour lequel j'aurai probablement honte dans un petit moment.

J'ai actuellement une tête de serpent (un simple rectangle à ce stade) se déplaçant sur la toile du jeu. La façon la plus simple de construire le reste du serpent était de faire en sorte que la tête possède une Java Linked Linked List of SnakeElements dont la taille augmenterait / diminuerait en fonction de ce que fait le joueur.

Avoir cette liste de SnakeElements suivre la tête cependant s'est avéré non trivial.

La fonction actuelle faisant cela est la suivante et est appelée chaque fois que la tête met à jour sa position:

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;
    }
}

ce qui se traduit malheureusement par ce comportement:

gif

Tous les conseils sur la façon de faire une queue de serpent qui fonctionne correctement seraient très appréciés :)

Kilian
la source

Réponses:

18

Pensez au problème comme ceci:
comment se déplace un serpent dans le jeu original?
Le serpent se déplace vers sa direction actuelle. Le comportement ressemble à la tête apparaît à partir de rien, et la dernière partie de la queue disparaît.

Vous pouvez avoir une liste de pièces détachées. Ce que vous voulez faire, c'est supprimer le dernier élément de la liste qui représente la dernière partie arrière.
Ensuite, vous souhaitez créer un nouveau headpart où il doit être positionné et le mettre en première position de la liste.
Cela signifie que le reste du serpent n'est pas déplacé car vous ne modifiez que la première et la dernière position.
Cela crée un comportement semblable à un serpent.

Pontus Magnusson
la source
Whoa, merci! Cela a beaucoup de sens et aurait dû être l'idée dès le départ, on dirait que je vais m'amuser à refactoriser :) Je suis désolé que ma triste quantité de karma m'empêche de voter pour vous. Je promets que je serai de retour à l'avenir!
Kilian
1
Une autre façon de penser est que chaque élément serpent suit uniquement l'élément directement devant lui, plutôt que de suivre la tête. Cela sera utile si, plus tard, les serpents sont texturés ou quelque chose comme ça.
Nathan Reed
2
Voici la version actuelle en passant, merci encore :) i.imgur.com/IaT5PNH.gif
Kilian
1

La façon dont je le vois est comme un système de type "Caterpillar", où chaque partie du serpent suit la partie qui la précède.

En d'autres termes, chaque partie du serpent serait un objet avec position (x, y) , une référence à la partie devant elle qu'il utiliserait pour se déplacer et une fonction pour traiter la position de la partie devant lui et déplacer en conséquence. Le serpent principal (la tête) devrait avoir des références pour chaque partie du serpent, et appellerait la fonction responsable de faire suivre la pièce à son prédécesseur, étant la tête le prédécesseur de la première partie.
J'espère que cela aide!

Lince Assassino
la source
C'était l'idée, mais la manipulation des virages s'est avérée assez complexe. Et que se passerait-il si un joueur tournait un virage serré à 180 degrés? Nous ne savions pas comment gérer cela correctement, et l'utilisation de la méthode décrite par Pontus Magnusson résout bien tous ces problèmes.
Kilian
Je vois. La seule fois où j'ai implémenté un système de chenilles, j'ai eu une grille avec des cellules de la taille des pièces, donc chaque pièce était toujours à l'intérieur d'une cellule spécifique, de cette façon, le problème ne s'est pas produit. Désolé pour mon mauvais anglais.
Lince Assassino
Ah oui, cela a du sens et devrait également fonctionner, mais nous avons abandonné l'idée d'avoir une grille pour une raison dont je ne me souviens pas actuellement;) Merci quand même :)
Kilian