"Controllo del tempo" in un Platform 2d


9

Sto realizzando un platform 2d in cui il giocatore può premere un pulsante e riavviare il livello, solo il loro personaggio precedente eseguirà il livello contemporaneamente, come se viaggiassero indietro nel tempo.

So che altri giochi l'hanno già fatto in precedenza, e il modo in cui ho pensato di farlo è quello di fare in modo che il personaggio del gioco abbia una serie di azioni (Idle, Jumping, Walking Left ecc.) E quindi rilevare i cambiamenti in tali azioni e accedervi un elenco insieme al tempo di gioco. Quindi, quando ho bisogno che il personaggio esegua di nuovo il livello da solo, posso semplicemente scorrere l'elenco cambiando le sue azioni al momento giusto.

È questo il modo migliore per farlo? Qualcuno ha qualche esperienza in questo?

Grazie.


Quello che stai cercando è più un "Replay" che un controllo del tempo. Potresti trovare dei buoni articoli su come affrontarlo, ma dico ancora che la risposta di seguito è anche un buon inizio in questo settore. Tieni presente che le cose "casuali" nel gioco rovineranno i replay per il personaggio "fantasma" che lo esegue di nuovo se possono influenzare i progressi.
James,

3
Un buon punto sulle parti "casuali". Assicurati di usare un generatore casuale che generi i suoi numeri in base a un seme. Quindi salva il seme con il tuo replay e usa lo stesso seme quando giochi quel replay.
Bummzack,

Come lo hai fatto? Qual è la tua soluzione?

Risposte:


8

MODIFICARE:

Si prega di consultare la risposta di @ Bluescrn a questa domanda; egli elabora le debolezze nel rigiocare i controlli piuttosto che i vettori di movimento o la posizione.

-

Sei sulla strada giusta. Ecco l'approccio che userei:

Controller

Crea una classe Controller che riceve l'input da tastiera e lo passa al tuo personaggio. Tuttavia, ha anche una registrazione del controller esattamente quando sono stati premuti i tasti significativi (ad esempio frecce, salto, ecc.) E quando sono stati rilasciati. Memorizzerebbe questo tipo di informazioni:

actions[0].milliseconds = 400     actions[0].action = right pressed
actions[1].milliseconds = 1000    actions[1].action = jump pressed
actions[2].milliseconds = 1300    actions[2].action = jump released
actions[3].milliseconds = 2500    actions[3].action = jump pressed
actions[4].milliseconds = 3000    actions[4].action = jump released
actions[5].milliseconds = 5330    actions[5].action = right released

Un controller ha due modalità:

  1. Registra: riceve l'input da tastiera. Registra l'input nell'elenco. Passa l'immissione dei caratteri in base allo stato della tastiera.
  2. Replay: ignora l'input da tastiera. Avanza nell'elenco in base ai millisecondi trascorsi dall'inizio del livello. Passa l'immissione dei caratteri in base allo stato della tastiera registrato al momento attuale.

Personaggi

Quando viene costruito l'oggetto Personaggio, crea un nuovo Controller per sé. Il personaggio può essere in una delle due modalità in qualsiasi momento:

  1. Attivo: c'è sempre e solo un personaggio attivo ed è quello che controlli. Quando il personaggio è in modalità attiva, il suo controller è in modalità di registrazione. Di default quando un personaggio è costruito, è in modalità Attiva.
  2. Ghost: Questo è quello che ripete le tue azioni passate. Quando un personaggio entra in modalità Ghost, cambia aspetto e imposta il suo Controller in modalità Replay.

livelli

Un livello appena iniziato

Quando inizi il livello, crea un singolo personaggio. Ora inizia il livello e il giocatore fa le sue cose.

Quando il tempo si ripristina

Quando il livello viene ripristinato, fai tre cose:

  1. Dì al personaggio attivo corrente di accedere alla modalità fantasma.
  2. Crea un nuovo personaggio.
  3. Chiama tutti i personaggi per resettarsi. Ciò li riporterà nella posizione iniziale senza movimento, ecc. A loro volta, diranno ai loro Controller di reimpostare a 0 millisecondi senza che siano premuti tasti.

Quindi inizia il livello e il giocatore fa le sue cose.


Questo è perfettamente chiaro. Molte grazie. Ho avuto l'idea giusta, ma stavo per creare un sistema centrale per registrare i movimenti, ma avere ogni personaggio registrare il proprio movimento è un modo molto più semplice di procedere. Grazie.
Woody Zantzinger,

8

Se stai riproducendo input registrati, considera le implicazioni di qualsiasi oggetto in movimento / distruttibile / interattivo nel mondo, che potrebbe essersi spostato o cambiato stato quando le azioni sono riprodotte

Inoltre, la riproduzione degli input non funzionerà esattamente se il gioco utilizza un timestep variabile. Potresti prendere in considerazione un aggiornamento del gioco a tempo fisso (con interpolazione per il rendering con framerate variabile)?


1
+10 se potessi. Grandi considerazioni. La riproduzione di vettori di movimento o posizione sarebbe superiore alla riproduzione di input, a seconda dell'effetto desiderato. Decine di millisecondi di inesattezza tra i frame sono probabilmente più facili da tenere in considerazione quando si lavora con movimento e posizione piuttosto che con input.
doppelgreener,


0

La registrazione dell'input da tastiera potrebbe non essere così utile nel tuo caso. È comunque possibile generare una spline con una sequenza temporale. Puoi anche riavvolgere il tempo se sei complicato con le forze che devi applicare

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.