Orario: 20-06-2013, 6:11 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Algoritmo di Riavvolgimento del Tempo
Autore Messaggio
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#1 Algoritmo di Riavvolgimento del Tempo
0
In teoria come posso implementare una cosa del genere?(per chi non lo sapesse è la solita feature che va di moda dopo prince of persia del 2003)

In pratica voglio che il tempo di gioco torni indietro di massimo pochi secondi e che ciò abbia effetto su tutto ciò che è presente nel gioco o solo su di una parte(non è questo il problema però)

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
06-06-2009 15:12
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Eclipse
npc in fps 4 food

Messaggi: 11,344
Registrato: Sep 2004
Offline Offline
#2 Re: Algortimo di Riavvolgimento del Tempo
0
se gli oggetti\personaggi hanno dei pattern "studiati" è facile, ti basta fargli andare al contrario di come vanno, in genere lega lo spostamento ad una variabile che puoi modificare per variare il tempo facendo ad esempio facendo muovere un oggetto come pos = speed*deltatime*timeFlow, dove speed è la velocità, deltatime il normale delta se non usi un framerate fisso e timeFlow è una variabile float che puoi impostare ad 1 se vuoi tutto normale, ma se la fai diminuire il tempo ti rallenta, fino a 0 dove si ferma tutto, a -1 ti si muoverà tutto al contrario.

Stai attento che però non si tratta di un replay, se il tuo programma calcola valori random devi usare gli stessi valori che hai calcolato in precedenza oppure potrai avere delle differenze nella simulazione.

Per quanto riguarda il movimento del giocatore invece registra gli input su un array e poi usali per farlo andare al contrario, puoi farlo anche per il resto ma se hai molta roba inizierai a sprecare non poca memoria

Giuseppe Navarria - Moonloop
[Immagine: twittericon.png] [Immagine: linkedinicon.png] [Immagine: steamicon.png]
06-06-2009 15:23
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#3 Re: Algortimo di Riavvolgimento del Tempo
0
gli oggetti dovrebbero avere movimenti generati da una IA di base

Magari posso salvare ogni tot tempo la posizione di un oggetto e il suo stato e salvandola posso farlo andare da punto a punto seguendo le regole del movimento all'indietro.


(Scusate se mi spiego come i cani se riesco a fare qualcosa in settimana vi faccio vedere, l'idea mi è venuta ieri sera e non ho buttato giu niente visto che ho altro da fare)

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
06-06-2009 15:37
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
_tommo_
Mod nerdcore

Messaggi: 6,043
Registrato: Nov 2008
Offline Offline
#4 Re: Algoritmo di Riavvolgimento del Tempo
0
lefantome ha scritto:In teoria come posso implementare una cosa del genere?(per chi non lo sapesse è la solita feature che va di moda dopo prince of persia del 2003)

In pratica voglio che il tempo di gioco torni indietro di massimo pochi secondi e che ciò abbia effetto su tutto ciò che è presente nel gioco o solo su di una parte(non è questo il problema però)

Ti stimo perchè te lo dici da solo Rotfl

Cmq, ci sono essenzialmente 2 modi di fare quello che dici, come diceva Eclipse:
-se gli algoritmi di gioco sono deterministici ovvero si svolgono ogni volta esattamente nello stesso modo, è possibile riportare indietro tutto tramite una variabile di tempo, e poi l'azione si svolgerà comunque nello stesso modo.
Di solito ai giochi single player il caso è questo, se si escludono i motori fisici.

-se invece usi qualsiasi tipo di fisica (anche solo un personaggio che cade e rimbalza) o sei online e vuoi riportare le cose indietro in modo continuo tipo Braid, ti puoi abbastanza scordare quell'approccio perchè, facendo un esempio:
un personaggio cade da una piattaforma; cammina un pò e poi mandi indietro il tempo... perchè mai ad un certo punto dovrebbe sentire una spinta che lo riporta sulla piattaforma originale?
Semplicemente tira dritto facendo cose che non aveva mai fatto.

quindi devi usare un'approccio un pò più strutturato; per esempio potresti far discendere ogni oggetto da una classe TimeFramedEntity, che possiede una Pila di TimeEvents...
in questo modo, ogni volta che l'oggetto fa qualcosa tu metti un'altro evento su questa Pila, salvando nell'evento quanto è passato dall'ultimo evento a quello corrente.
Per rifare tutto al contrario diventa facile: esegui tutti gli eventi dall'ultimo al primo (FIFO) per il tempo che contengono, quando la Pila è vuota l'oggetto si ferma Sorriso

Può sembrare (ed è in effetti Asd) parecchio complicato, però così puoi mandare indietro qualsiasi azione senza sprecare una pazzia di memoria, dato che vengono salvate solamente le azioni veramente eseguite. Fifi

Tommaso Checchi
< devlog | twitter | Dojo, a C++ game framework >
06-06-2009 16:18
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#5 Re: Algoritmo di Riavvolgimento del Tempo
0
Allora non avendo internet a disposizione e non potendo rileggermi il post di eclipse ieri sera ho fatto così:

Mi sono creato una classe timemachine da inserire in ogni oggetto al cui interno vi è una lista di Vettori che rappresentano le varie posizioni di un singolo oggetto.(massimo 300 vettori cioè massimo 5 secondi di time travel)

Allora il problema sorge nella posizione dell'oggetto(per il momento l'ho apllicata al player).

Quando attivo il time travel qualcosa mi fa schizzare via l'oggetto in direzioni dovute alla posizione che aveva.

Per prima cosa faccio presente che se il timetravel è attivo la matrice world del player può essere modificata solo dalla funzione intera a timemachine.

io per modificare la matrice del giocatore uso questo metodo:


Codice:
Matrix direction = Matrix.Identity;

poi:

direction *= Matrix.CreateTranslation(timestate[0]) //sarebbe il primo vettore della lista timestate che corrisponde a quello più recente

timestate.Remove(timestate[0]);
modelmanager.models[0].world *= direction;


Ho notato inoltre che apllicando una traslazione arbitraria di un vettoread esempio(1,0,0) invece che quella con il primo vettore della lista il tutto funzionava


l'inserimento della lista funziona così:

Codice:
List<Vector3> timestate = new List<Vector3>(); //lista dei vettori posizione

poi:

public void Add(float posx,float posy) //aggiunge la posizione dell'oggetto all'istante
        {
            if ((timestate.Count-1) < 299) //controlla se è piena
            {
                timestate.Insert(0,new Vector3(posx,posy,0));
            }
            else

                timestate.Remove(timestate[timestate.Count-1]); //elimina il vettore più vecchio
            timestate.Insert(0,new Vector3(posx,posy,0)); //inserisce in cima
        }

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
12-06-2009 16:39
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#6 Re: Algoritmo di Riavvolgimento del Tempo
0
ho sistemato il problema del modello che fugge rendendo il vettore3 un versore.


Ora però mi scompare il modello e non lo posso più muovere. non ha senso sta cosa

EDIT: facendo in modo che potessi visualizzare la posizione del player durante il gioco, attivando il time warp ottengo per x e y un numero non reale a detta di xna.


com'è possibile? perchè non me lo gestisce?

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
12-06-2009 18:14
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#7 Re: Algoritmo di Riavvolgimento del Tempo
0
EDIT FINALE:

a questo punto è sicuro che il problema risiede nella lista che non so bene perchè non mi salva i vettori adeguatamente o non vi riesce ad accedere.

Perchè mettendovi come cordinate 0,0,1 nella matrice di traslazione funziona.

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
12-06-2009 18:26
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
mude
Arrested Development

Messaggi: 7,140
Registrato: Nov 2008
Offline Offline
#8 Re: Algoritmo di Riavvolgimento del Tempo
0
Risolto maledetto Vector3.Zero che non può avere una norma di 1 essendo il vettor eorigine.


Ora funziona!


grazie a dsfot per l'aiuto :bravosi: Rox

.: DevLog | Twitter Pinaster Games | Twitter Personale :.
[Immagine: BBh5DKU.png] Beta
12-06-2009 20:11
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: