• Benvenuto in Making Videogames!
  • Dai sfogo alla tua fantasia!
  • Crea il tuo Videogioco!
Benvenuto ospite! Login Registrati




Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
animazione sprite
#1
Allora ragazzi vi ringrazio di Heart per l'aiuto che mi avete dato nel precedente post..adesso vi pongo un altro quesito : l'animazione dello sprite come si attua? io avevo creato tanti frame del mio sprite in diverse posizione e avevo messo che quando premevo right si caricavano in successione.Risultato? vedere l'ultimo frame sovrapposto agli altri ce rimani fermo xD
 
Rispondi
#2
Il concetto di fondo è disegnare le varie posizioni del tuo personaggio e cambiarle (facendole scorrere) ogni deltaT. Di conseguenza avrai bisogno di un timer e ti potrebbe tornare utile una FSM. Il timer lo puoi fare con la funzione clock, altrimenti devi vederti la documentazione delle Allegro.
Grossomodo ti ritroverai ad avere una cosa del genere:
(è solo una bozza)
Codice:
// game loop
std::clock_t frameTime = 0;
while(running)
{
    auto currentTime = clock();
    animationUpdate(frameTime);
    //...
    frameTime = clock() - currentTime;
}

//---------------------------------
void animationUpdate(std::clock_t elapsedTime)
{
    time += elapsedTime;
    while(time >= deltaT) // non if perché ipotizzo che elapsedTime possa essere >= a 2*deltaT (deltaT è una costante)
    {
        time -= deltaT;
        //passa all'immagine successiva dell'animazione
    }
}


(19-08-2012, 02:08 PM)ferrass Ha scritto: io avevo creato tanti frame del mio sprite in diverse posizione e avevo messo che quando premevo right si caricavano in successione.Risultato? vedere l'ultimo frame sovrapposto agli altri ce rimani fermo xD
Non ho ben capito... Comunque il concetto è di cambiare l'immagine dello sprite, non di aggiungere un altro sprite, quindi se ottieni due immagini sovrapposte è perché hai sbagliato questo.
 
Rispondi
#3
non ho capito molto bene xD l'utilizzo di clock
 
Rispondi
#4
Il timer serve per capire quando è il momento di passare al frame (riferito all'animazione) successivo. Supponiamo che la tua animazione è composta da 5 frames: se li fai scorrere tutti di fila andrebbero a una velocità improponibile, se invece ti basi sui frame (es. tra 10 frames passo al frame successivo dell'animazione) la velocità dell'animazione cambia da computer a computer (a seconda del framerate). Basandoti sul tempo invece vai sul sicuro.

Solitamente le librerie grafiche mettono a disposizione una classe o qualche funzione per calcolare il tempo trascorso, ma siccome non conosco le allegro ti ho proposto la soluzione usando la libreria standard. La funzione clock ritorna il tempo trascorso dall'avvio del programma, quindi per calcolare il tempo impiegato per disegnare un frame devi controllare il tempo all'inizio del game loop, alla fine del game loop e sottrarre il secondo con il primo. Ed è esattamente quello che ho fatto nella bozza di codice che ti ho proposto.

Il tempo ricavato (ovvero il tempo impiegato per disegnare quel frame) lo passi alla funzione animationUpdate (che si preoccupa di cambiare il frame dell'animazione nel momento opportuno). Per sapere quando sono passati X millisecondi (che sarebbe deltaT) devi sommare il tempo del frame a una variabile (che ho chiamato time) che inizialmente vale 0. Dopodiché appena questa variabile time raggiunge (o supera) il tempo desiderato per il cambiamento del frame, sottrai il tempo desiderato a questa variabile (che sarebbe un modo più preciso per azzerare il timer) e cambi il frame dell'animazione.

Questo serve per eseguire un'animazione. Inizia a capire bene questo concetto e a provare a metterlo in pratica poi, se non capisci come fare, ti spiego un possibile modo per gestire più animazioni.

Se non hai capito bene qualcosa cerca di spiegare bene cos'è che non hai capito.
 
Rispondi
#5
allora il concetto adesso è chiaro devo solo metterlo in pratica in allegro xD
Vedo qualcosa a riguardo goolando xD
 
Rispondi
#6
(21-08-2012, 03:49 PM)steve Ha scritto: Il timer serve per capire quando è il momento di passare al frame (riferito all'animazione) successivo. Supponiamo che la tua animazione è composta da 5 frames: se li fai scorrere tutti di fila andrebbero a una velocità improponibile, se invece ti basi sui frame (es. tra 10 frames passo al frame successivo dell'animazione) la velocità dell'animazione cambia da computer a computer (a seconda del framerate). Basandoti sul tempo invece vai sul sicuro.

Solitamente le librerie grafiche mettono a disposizione una classe o qualche funzione per calcolare il tempo trascorso, ma siccome non conosco le allegro ti ho proposto la soluzione usando la libreria standard. La funzione clock ritorna il tempo trascorso dall'avvio del programma, quindi per calcolare il tempo impiegato per disegnare un frame devi controllare il tempo all'inizio del game loop, alla fine del game loop e sottrarre il secondo con il primo. Ed è esattamente quello che ho fatto nella bozza di codice che ti ho proposto.

Il tempo ricavato (ovvero il tempo impiegato per disegnare quel frame) lo passi alla funzione animationUpdate (che si preoccupa di cambiare il frame dell'animazione nel momento opportuno). Per sapere quando sono passati X millisecondi (che sarebbe deltaT) devi sommare il tempo del frame a una variabile (che ho chiamato time) che inizialmente vale 0. Dopodiché appena questa variabile time raggiunge (o supera) il tempo desiderato per il cambiamento del frame, sottrai il tempo desiderato a questa variabile (che sarebbe un modo più preciso per azzerare il timer) e cambi il frame dell'animazione.

Questo serve per eseguire un'animazione. Inizia a capire bene questo concetto e a provare a metterlo in pratica poi, se non capisci come fare, ti spiego un possibile modo per gestire più animazioni.

Se non hai capito bene qualcosa cerca di spiegare bene cos'è che non hai capito.
Mai pensato di presentare il tuo curriculum da qualche parte?
 
Rispondi
#7
(22-08-2012, 02:50 PM)MickeyCrashRayman Ha scritto: Mai pensato di presentare il tuo curriculum da qualche parte?

Le mie conoscenze non vanno molo oltre l'ABC del game programming, inoltre sulla carta non ho nessuna conoscenza riguardo la programmazione, tutto quello che so l'ho imparato per conto mio. Ora come ora è praticamente impossibile che qualcuno mi assuma per questo tipo di lavoro.
A sto punto preferisco continuare gli studi, imparare di più e presentarmi per un buon lavoro più in là nel tempo.

(21-08-2012, 09:06 PM)ferrass Ha scritto: allora il concetto adesso è chiaro devo solo metterlo in pratica in allegro xD
Vedo qualcosa a riguardo goolando xD

La parte del timer non la devi necessariamente fare con allegro, io ti ho proposto una soluzione usando una funzione della libreria standard. Ora come ora ti basta integrarlo nel tuo codice (in pratica un ctrl+c - ctrl+v con un po' di senso) e riempire la funzione animationUpdate. Inizialmente preoccupati di eseguire un'animazione, almeno vai sul sicuro che hai capito come fare, poi ti regoli per eseguirla solo in determinati casi e gestire più di un'animazione.

Se vuoi farlo usando la roba di allegro dai un'occhiata a questo, ma sinceramente mi sembra un'inutile complicazione.
 
Rispondi
#8
Codice:
void animazione () {
     if(key[KEY_RIGHT]) {
                        
                        if(frame<=2000) {
                        draw_sprite(buf,frame1,x,y) ;
                        frame++;
                        }
                        if(frame<=4000) {
                                       draw_sprite(buf,frame2,x,y);
                                       frame++;
                                       }
                                       frame=0;
                                       }
                                       }
perchè non funge ? ce mi si vede solo l'ultimo frame che si sovrappone agli altri?
 
Rispondi
#9
Risposte già date in precedenza.

(24-08-2012, 02:41 PM)ferrass Ha scritto:
Codice:
//...
if(frame<=2000)
//...
if(frame<=4000)
//...
(21-08-2012, 03:49 PM)steve Ha scritto: se invece ti basi sui frame (es. tra 10 frames passo al frame successivo dell'animazione) la velocità dell'animazione cambia da computer a computer (a seconda del framerate). Basandoti sul tempo invece vai sul sicuro.


(24-08-2012, 02:41 PM)ferrass Ha scritto: perchè non funge ? ce mi si vede solo l'ultimo frame che si sovrappone agli altri?
(19-08-2012, 03:22 PM)steve Ha scritto: Comunque il concetto è di cambiare l'immagine dello sprite, non di aggiungere un altro sprite, quindi se ottieni due immagini sovrapposte è perché hai sbagliato questo.
Hai messo i draw_sprite dentro una funzione che si dovrebbe preoccupare solamente di cambiare l'immagine dello sprite.
Ti consiglio di studiarti i puntatori (chiediti il perché ti ho detto proprio puntatori) e di approfondire le tue conoscenze sul linguaggio prima di continuare a scrivere il gioco andando un po' a caso.
 
Rispondi
#10
ok vedro questi puntatori comunque dovrei usare a quanto ho capito no draw ma un funzione che cambia ? giusto ? se si qual'è ? xD
 
Rispondi
#11
(25-08-2012, 10:36 AM)ferrass Ha scritto: ok vedro questi puntatori comunque dovrei usare a quanto ho capito no draw ma un funzione che cambia ? giusto ? se si qual'è ? xD

Vedo che non hai colto Wink
(24-08-2012, 06:36 PM)steve Ha scritto: Hai messo i draw_sprite dentro una funzione che si dovrebbe preoccupare solamente di cambiare l'immagine dello sprite.
Ti consiglio di studiarti i puntatori (chiediti il perché ti ho detto proprio puntatori) e di approfondire le tue conoscenze sul linguaggio prima di continuare a scrivere il gioco andando un po' a caso.

Comunque prima imparati almeno un minimo di c++, di questo passo non te la cavi più.
 
Rispondi
#12
le basi suppongo di conoscerle xD cmq a quanto pare sono un essere insignificante nel mondo del c++ xD ricacciamo il pdf sul libro di c++ ci risentiamo fra un po byeeee
 
Rispondi
#13
Eh il C++ è così, è lo stronzo della programmazione. asd
 
Rispondi
  


Vai al forum:


Browsing: 4 Ospite(i)