Come posso fare in modo che la coda di un serpente segua la testa?


10

Dopo un incarico e appena iniziato con libGDX costruendo un piccolo clone di Snake ho riscontrato un problema di cui probabilmente mi vergognerò tra poco.

Al momento ho una testa di serpente (un semplice rettangolo in questa fase) che si muove sulla tela del gioco. Il modo più semplice per costruire il resto del serpente era di avere la testa in possesso di un elenco di raccolte Java di SnakeElements che avrebbe aumentato / ridotto le dimensioni in base alle azioni del giocatore.

Avere questo elenco di SnakeElements seguire la testa, tuttavia, ha dimostrato di non essere banale.

La funzione corrente in questo modo è la seguente e viene chiamata ogni volta che la testa aggiorna la sua posizione:

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

che sfortunatamente provoca questo comportamento:

gif

Qualche consiglio su come realizzare una coda di serpente che funzioni correttamente sarebbe molto apprezzato :)

Risposte:


18

Pensa al problema in questo modo:
come si muove un serpente nel gioco originale?
Il serpente si muove verso la sua direzione attuale. Il comportamento sembra che la testa appaia dal nulla e l'ultima parte della coda scompare.

Puoi avere un elenco di parti serpenti. Quello che vuoi fare è rimuovere l'ultimo elemento nell'elenco che rappresenta l'ultima parte di coda.
Quindi si desidera creare una nuova parte principale in cui dovrebbe essere posizionata e posizionarla nella prima posizione dell'elenco.
Ciò significa che il resto del serpente non viene spostato poiché si modifica solo la prima e l'ultima posizione.
Questo crea un comportamento simile a un serpente.


Grazie! Questo ha molto senso e avrebbe dovuto essere l'idea fin dall'inizio, sembra che mi divertirò un po 'di refactoring :) Mi dispiace solo che la mia triste quantità di karma mi sta impedendo di votarti. Prometto che tornerò in futuro!
Kilian,

1
Un modo alternativo di pensarci è che ogni elemento serpente segue solo l'elemento direttamente davanti ad esso, piuttosto che seguire la testa. Ciò sarà utile se, in seguito, i serpenti sono strutturati o qualcosa del genere.
Nathan Reed,

2
Ecco la versione attuale, grazie ancora :) i.imgur.com/IaT5PNH.gif
Kilian

1

Il modo in cui lo vedo è come un sistema simile a "Caterpillar", in cui ogni parte del serpente segue la parte che la precede.

In altre parole, ogni parte del serpente sarebbe un oggetto con posizione (x, y) , un riferimento alla parte davanti ad essa che userebbe per muoversi e una funzione per elaborare la posizione della parte davanti a sé e spostare di conseguenza. Il serpente principale (la testa) dovrebbe avere riferimenti per ogni parte del serpente e chiamerebbe la funzione responsabile per far sì che la parte segua il suo predecessore, essendo il capo il predecessore della prima parte.
Spero che sia d'aiuto!


Questa era l'idea, ma la gestione degli angoli si rivelò piuttosto complessa. E cosa accadrebbe se un giocatore girasse un angolo acuto di 180 gradi? Non eravamo sicuri di come gestirlo correttamente e l'utilizzo del metodo descritto da Pontus Magnusson risolve tutti questi problemi in modo corretto.
Kilian,

Vedo. L'unica volta che ho implementato un sistema a cingoli ho avuto una griglia con celle delle dimensioni delle parti, quindi ogni parte era sempre all'interno di una cella specifica, in questo modo il problema non si è verificato. Scusa per il mio cattivo inglese.
Lince Assassino,

Ah sì, questo ha senso e dovrebbe funzionare anche, ma abbiamo abbandonato l'idea di avere una griglia per un motivo che attualmente non ricordo;) Grazie comunque :)
Kilian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.