Orario: 21-05-2013, 21:03 Benvenuto ospite! (Log inRegistrati)


Rispondi 
Domandina sui timing di animazione
Autore Messaggio
KappeiJin
Ghoulsa e Ghosta

Messaggi: 885
Registrato: Jan 2011
Offline Offline
#1 Domandina sui timing di animazione
0
Sto animando usando la classe Animation presa direttamente dal PlatformerKit, perchè pensavo che funzionasse a dovere.
Mi trovo ora in una situazione che non riesco a gestire completamente... o meglio, prima di rivedere la classe provo a chiedervi.

Questa è la funzione incriminata:

// Process passing time.
time += (float)gameTime.ElapsedGameTime.TotalSeconds;
while (time > Animation.FrameTime)
{
time -= Animation.FrameTime;

// Advance the frame index; looping or clamping as appropriate.
if (Animation.IsLooping)
{
frameIndex = (frameIndex + 1) % Animation.FrameCount;
}
else
{
frameIndex = Math.Min(frameIndex + 1, Animation.FrameCount - 1);
}
}

Domanda: se l'animazione NON è IsLooping, come fareste ad accorgervi di quando l'ultimo frame ha finito il suo timing di visualizzazione?

Paolo Cattaneo
[Immagine: sblgtk.png] Raven Travel Studios (pls follow us ^^)
"Ogni buon lavoro software nasce da un problema personale di uno sviluppatore."
(Questo messaggio è stato modificato l'ultima volta il: 15-03-2011 12:18 da KappeiJin.)
15-03-2011 12:17
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
hurricane86
Posting Freak

Messaggi: 1,266
Registrato: Jun 2009
Offline Offline
#2 RE: Domandina sui timing di animazione
0
semplicemente quando:

frameIndex == Animation.FrameCount - 1;

vuol dire che sei arrivato a fine animazione (all'ultimo frame)

Martino Giovanelli
15-03-2011 14:45
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
KappeiJin
Ghoulsa e Ghosta

Messaggi: 885
Registrato: Jan 2011
Offline Offline
#3 RE: Domandina sui timing di animazione
0
(15-03-2011 14:45)hurricane86 ha scritto:  semplicemente quando:

frameIndex == Animation.FrameCount - 1;

vuol dire che sei arrivato a fine animazione (all'ultimo frame)

Purtroppo non basta. Infatti questo controllo si attiva anche quando l'ultimo frame ha iniziato l'animazione, con il risultato che viene subito segato via senza aspettare che si compia il suo tempo.
ho provato a mettere anche && time < = Animation.FrameTime, ma quando time è esaurito il controllo fallisce comunque. Dopo ti dò maggiori info perchè ora non ho il codice aperto sottomano...

Paolo Cattaneo
[Immagine: sblgtk.png] Raven Travel Studios (pls follow us ^^)
"Ogni buon lavoro software nasce da un problema personale di uno sviluppatore."
(Questo messaggio è stato modificato l'ultima volta il: 15-03-2011 15:19 da KappeiJin.)
15-03-2011 15:16
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
KappeiJin
Ghoulsa e Ghosta

Messaggi: 885
Registrato: Jan 2011
Offline Offline
#4 RE: Domandina sui timing di animazione
0
Ecco, ora posso spiegarmi meglio.

dicevamo che la funzione era questa, con time che parte a 0 per ogni nuova animazione che inizia, e ogni giro di clock aggiunge i totalseconds. Poi se è maggiore del frameTime sottrae il frameTime.

// Process passing time.
time += (float)gameTime.ElapsedGameTime.TotalSeconds;
while (time > Animation.FrameTime)
{
time -= Animation.FrameTime;

// Advance the frame index; looping or clamping as appropriate.
if (Animation.IsLooping)
{
frameIndex = (frameIndex + 1); //% Animation.FrameCount;
}
else
{
frameIndex = Math.Min(frameIndex + 1, Animation.FrameCount - 1);
}
}

Ho aggiunto subito dopo:

if (!Animation.IsLooping && time <= Animation.FrameTime && frameIndex == Animation.FrameCount - 1) bAnimationDone = true;

Notare che time <= FrameTime non dovrebbe manco servire...
Cmq questo genera il risultato che dicevo, l'ultimo frame di animazione è sempre visualizzato per un attimo e poi l'animazione termina subito anzichè aspettare il suo tempo, un pò come se la condizione time < animation.frametime si verificasse NON dopo che è passato il tempo per visualizzare l'ultimo frame, ma proprio non appena il counter dei fotogrammi passa sull'ultimo.

Temo di non aver capito qualcosa io... Piange qualche volontario?

Paolo Cattaneo
[Immagine: sblgtk.png] Raven Travel Studios (pls follow us ^^)
"Ogni buon lavoro software nasce da un problema personale di uno sviluppatore."
(Questo messaggio è stato modificato l'ultima volta il: 15-03-2011 20:14 da KappeiJin.)
15-03-2011 18:50
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#5 RE: Domandina sui timing di animazione
0
time += gameTime.ElapsedGameTime.Milliseconds;
if (time > timeview)
{
time -= timeview;
++framecurrent;
if (framecurrent >= frametot)
{
framecurrent = 0;
}
}

Ti posso suggerire di usare questo codice...

timeview è uguale al tempo totale in mls che un frame rimane a video
framecurrent è il frame visto a video
frametot è il numero totale di frame dentro lo sheet

time appena è maggiore a timeview... passa al successivo frame... azzera time...
se il frame corrente è maggiore del totale dei frames... framecorrente si azzera
(Questo messaggio è stato modificato l'ultima volta il: 16-03-2011 14:11 da daygoshen.)
16-03-2011 14:11
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
maxlovegods
Member

Messaggi: 206
Registrato: Feb 2011
Offline Offline
#6 RE: Domandina sui timing di animazione
0
Non so se può essere utile. Io le animazioni 2D me le sono gestite da solo con codice c#

Massimo Amadei - Programmatore/grafico di videogiochi...in via di sviluppo
17-03-2011 15:28
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
KappeiJin
Ghoulsa e Ghosta

Messaggi: 885
Registrato: Jan 2011
Offline Offline
#7 RE: Domandina sui timing di animazione
0
(17-03-2011 15:28)maxlovegods ha scritto:  Non so se può essere utile. Io le animazioni 2D me le sono gestite da solo con codice c#

Ah, molto utile!!! Smile

Credo di potercela fare anche io da solo Kiss

Dopo provo cmq la routine di daygoshen, che a occhio mi sembra buona Sorriso

Paolo Cattaneo
[Immagine: sblgtk.png] Raven Travel Studios (pls follow us ^^)
"Ogni buon lavoro software nasce da un problema personale di uno sviluppatore."
17-03-2011 16:08
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
daygoshen
Indieveloper

Messaggi: 95
Registrato: Jul 2009
Offline Offline
#8 RE: Domandina sui timing di animazione
0
la trovo funzionale kappeijin Occhiolino .... anche semplice da gestire per me!
19-03-2011 12:43
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
KappeiJin
Ghoulsa e Ghosta

Messaggi: 885
Registrato: Jan 2011
Offline Offline
#9 RE: Domandina sui timing di animazione
0
(19-03-2011 12:43)daygoshen ha scritto:  la trovo funzionale kappeijin Occhiolino .... anche semplice da gestire per me!

Avevo anche trovato una toppa con:

if (animation.FrameTime - animationPlayer.time < 0.02
|| animation.FrameTime - animationPlayer.time > animation.FrameTime - 0.01)

ma mi sa che è meglio il tuo Occhiolino

Paolo Cattaneo
[Immagine: sblgtk.png] Raven Travel Studios (pls follow us ^^)
"Ogni buon lavoro software nasce da un problema personale di uno sviluppatore."
(Questo messaggio è stato modificato l'ultima volta il: 19-03-2011 14:05 da KappeiJin.)
19-03-2011 14:05
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
MonkeySoft
Bloody Monkey

Messaggi: 1,214
Registrato: Dec 2009
Offline Offline
#10 RE: Domandina sui timing di animazione
0
(16-03-2011 14:11)daygoshen ha scritto:  time += gameTime.ElapsedGameTime.Milliseconds;
if (time > timeview)
{
time -= timeview;
++framecurrent;
if (framecurrent >= frametot)
{
framecurrent = 0;
}
}

Ti posso suggerire di usare questo codice...

timeview è uguale al tempo totale in mls che un frame rimane a video
framecurrent è il frame visto a video
frametot è il numero totale di frame dentro lo sheet

time appena è maggiore a timeview... passa al successivo frame... azzera time...
se il frame corrente è maggiore del totale dei frames... framecorrente si azzera

Purtroppo una soluzione del genere è sbagliata... a meno che si lavori su sistemi a delta time fisso.
Immagina che ti arrivi un elapsedTime pari a tre timeview: il tuo gioco passerebbe al frame +1, quando dovrebbe essere al frame +3. Il risultato percepito dall'utente è un rallentamento.

Quello che dovresti fare è dividere time per timeview, questo ti da il numero di frame che la tua animazione dovrebbe far avanzare.

Paolo Tajè
Follow me on Twitter
Bloody Monkey | Facebook
19-03-2011 14:55
Visita il sito web di questo utente Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: