Come affrontare un serpente a 360 gradi


8

Di recente sono entrato in XNA e devo dire che lo adoro. Come una specie di ciao mondo ho deciso di creare il classico gioco "Snake". La versione a 90 gradi era molto semplice e facile da implementare. Ma mentre provo a realizzarne una versione che consenta una rotazione di 360 gradi usando le frecce sinistra e destra, sono entrato in una sorta di problema.

Quello che sto facendo ora deriva dalla versione a 90 gradi: passare da una parte all'altra del corpo del serpente iniziando dalla coda e finendo proprio davanti alla testa. Funziona benissimo quando si sposta ogni 100 millisecondi. Il problema è che crea uno stile di gioco instabile dal momento che tecnicamente il gioco avanza a soli 6 fps anziché a 60 potenziali.

Vorrei spostare il serpente ad ogni ciclo di gioco. Ma sfortunatamente, poiché il serpente si muove al ritmo delle dimensioni della sua testa, va troppo veloce. Ciò significherebbe che la testa dovrebbe muoversi con un incremento molto più piccolo come (2, 2) nella sua direzione piuttosto che quello che ho ora (32, 32). Perché ho lavorato su questo gioco ininterrottamente per un paio di settimane mentre gestivo la scuola, penso di aver riflettuto troppo su come realizzare questo. Probabilmente è una soluzione semplice, non la sto prendendo.

Ecco alcuni pseudo codici per quello che ho provato sulla base di ciò che ha senso per me. Non riesco davvero a pensare a un altro modo per farlo.

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;

Questo produce qualcosa del genere: Code in Action . Come puoi vedere, ogni parte rimane sempre dietro la testa e non produce un effetto "Trail".

Un esempio perfetto di ciò che sto cercando può essere trovato qui: Data Worm . Non la rotazione della finestra ma l'effetto finale dei triangoli.

Grazie per qualsiasi aiuto!

Risposte:


5

Con quell'algoritmo, stai facendo in modo che ogni segmento abbia la stessa angolazione di quello davanti. Ecco perché finiscono tutti direttamente dietro la testa, alla fine sono tutti rivolti nella stessa angolazione. Come puoi vedere nel gioco Data Worm che hai collegato, ogni segmento è rivolto verso il segmento di fronte . Determina l'angolo dal segmento corrente al suo nexte fai in modo che il segmento punti in quel modo invece di impostarlo su next.angle.

Per tale implementazione, potresti invece voler eseguire l'iterazione da davanti a dietro. Il comportamento sarà diverso in base alla direzione che passi attraverso l'elenco. Provali entrambi e vedi quale funziona meglio.

Ho usato un'idea simile per un prototipo di progetto in passato ( link Unity WebPlayer ). Ho usato un codice simile (anche se 3D) per fare in modo che ciascun segmento si volgesse verso il segmento di fronte e rimanesse indietro di una determinata distanza. Ha funzionato come un fascino.


È fantastico! Stavo leggendo un blog che utilizza un concetto simile a quello ma non pensavo di iterare dalla parte anteriore a quella posteriore. Ci proverò e lo segnerò come risposta se ha successo.
Austin Brunkhorst,

Aggiornamento: farlo funzionare! Ci è voluto del tempo per capire il concetto e capire cosa stava realmente succedendo. Grazie ancora per avermi portato nella giusta direzione! Ecco un video del codice di lavoro :) screenr.com/Fhn8 . Non preoccuparti della collisione alimentare, non ci ho passato molto tempo.
Austin Brunkhorst,

1
Sono contento di poterti aiutare!
caos Tecnico,

Il tuo link è morto.
Jeff

1
@Jeff Apparentemente Dropbox ha deciso che sto attirando troppo traffico in qualche modo, il che è strano ...
chaosTechnician
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.