Sprite animato con 8 direzioni

Scripts e snippets scritti in GameMaker Language (gml)
Rispondi
BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

Più sotto nella discussione il codice per avere un solo sprite con dentro tutte le animazioni per tutte le direzioni

Stavo giochicchiando un po' con GM e mi sono messo a cercare la soluzione migliore per assegnare uno sprite animato ad un oggetto in base alla sua direzione. Il risultato è un codice corto, leggero e facile da capire.

Spero possa tornare utile a qualcuno, ma se avete delle migliorie per il codice o soluzioni alternative meglio ancora.

Cosa serve: 8 sprite animati per le otto direzioni principali: e,ne,n,no,o,so,s,se

Per questo esempio uso la direzione che va dall'oggetto al puntatore del mouse. Il codice è molto intuitivo, ma se volete qualche spiegazione sono qua.

Codice: Seleziona tutto

{
    var dir_modif;
    direction=point_direction(x,y,mouse_x,mouse_y);
    dir_modif=direction+22.5;
    if (direction>337.49) { dir_modif=0; }
    switch(dir_modif div 45)
    {
        case 0: { sprite_index=spr_e; break; };
        case 1: { sprite_index=spr_ne; break; };
        case 2: { sprite_index=spr_n; break; };
        case 3: { sprite_index=spr_nw; break; };
        case 4: { sprite_index=spr_w; break; };
        case 5: { sprite_index=spr_sw; break; };
        case 6: { sprite_index=spr_s; break; };
        case 7: { sprite_index=spr_se; break; };
    }
}
Ultima modifica di BotaniciTraffici il 16/02/2014, 20:10, modificato 3 volte in totale.

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da Homunculus »

Io questo genere di situazione solitamente lo risolvo con un'unico sprite contenete tutte le animazioni per tutte le direzioni, a seconda poi della direzione facevo un paio di calcoli per bloccare l'animazione ad un subset di subimmagini. Non so se sia la soluzione migliore francamente, penso dipenda anche dalle preferenze personali, ma la trovo interessante perchè è totalmente basata su semplici calcoli e non su condizioni tipo: "se direction è compreso tra x e y allora fai z ecc...

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

Homunculus ha scritto:Io questo genere di situazione solitamente lo risolvo con un'unico sprite contenete tutte le animazioni per tutte le direzioni, a seconda poi della direzione facevo un paio di calcoli per bloccare l'animazione ad un subset di subimmagini. Non so se sia la soluzione migliore francamente, penso dipenda anche dalle preferenze personali, ma la trovo interessante perchè è totalmente basata su semplici calcoli e non su condizioni tipo: "se direction è compreso tra x e y allora fai z ecc...
Nel caso di animazioni per tutte le direzioni in un solo sprite bisognerà settare nei "casi" la subimage iniziale e finale per ogni animazione, quindi è fattibilissimo e anche conveniente, a patto di aggiungere un controllo per far ricominciare l'animazione dallo stesso punto. Probabilmente sarebbe una soluzione ancora migliore di quella che ho proposto.

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da Homunculus »

In realtà non servono nemmeno i casi, se organizzi i set di sottoimmagini correttamente puoi impostarli con un calcolo, dividendo la direzione in ottavi. È più facile da spiegare che da fare, magari poi preparo un esempio. È comunque piu complesso della tua soluzione, tanto che non so nemmeno se ne vale la pena, ma io sono fissato con ottimizzazioni del genere, tanto che mi da fastidio vedere nelle risorse 8 sprites separati per la stessa entità...

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

Homunculus ha scritto:ma io sono fissato con ottimizzazioni del genere
Anche io purtroppo :|

Sai che ti dico? Ora ci provo :paura:

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

Ci sono riuscito al primo colpo.

Requisiti: un unico sprite con tutte le animazioni ordinate a partire da est in senso antiorario. Per esempio: se avete 8 direzioni lo sprite dovrà contenerle nell'ordine e,ne,n,no,o,so,s,se.
E' necessario che ogni direzione abbia lo stesso numero di sottoimmagini. L'unica cosa che va cambiata è la variabile tot_dir (totale delle direzioni che avete nello sprite)
Il codice funziona con animazioni per tutte le direzioni che volete, 4,8,16,32, ma anche un altro totale che vi pare.

Nel create:

Codice: Seleziona tutto

{
    tot_dir=8;
    anim_length=image_number/tot_dir;
    anim_start=0;
    anim_end=0;
}
Nello step:

Codice: Seleziona tutto

{
    var dir_modif;
    direction=point_direction(x,y,mouse_x,mouse_y);
    dir_modif=direction+(360/2/tot_dir);
    if (direction>(359.99-(360/2/tot_dir))) { dir_modif=0; }
    anim_start=(dir_modif div (360/tot_dir))* anim_length;
    anim_end=anim_start+anim_length;
    if (image_index<=anim_start) || (image_index>=anim_end) { image_index=anim_start; }
}
Editato per rendere il codice universale

Edit: pensavo fosse molto più difficile, invece il codice è "venuto fuori da solo" :metalgo:
Ultima modifica di BotaniciTraffici il 24/02/2014, 15:20, modificato 2 volte in totale.

Avatar utente
Homunculus
Admin
Messaggi: 6840
Iscritto il: 25/11/2007, 20:36
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da Homunculus »

Ma in effetti non é un concetto molto difficile, una cosa che però (forse, dovrei testarlo) non hai considerato é l'arrotondamento dell'image_index. Con image_speed particolari non ti fa effetti strani? Nel senso che idealmente se il tuo animation end é per esempio 9, e image_index é 9.2 in teoria la subimage dovrebbe essere ancora la 9, ma così passi ad animation_start direttamente. Ripeto, mi é venuto in mente così, magari non é un problema in realtà...

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

Mi sa che hai ragione :fapensare:

Edit: ero anche riuscito a sbagliare a scrivere

Avevo scritto anim_start=(dir_modif div (360/tot_dir))* tot_dir;

al posto di anim_start=(dir_modif div (360/tot_dir))* anim_length;

Non me n'ero accorto perché nel mio caso anim_length e tot_dir avevano lo stesso valore :lol:

Comunque ora sto facendo una prova con 9 subimmagini per ogni direzione (8 direzioni) con image_speed diverse e il problema che hai individuato non sembra presentarsi nemmeno debuggando con room_speed = 1. Farò altre prove x sicurezza.

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da pacmino »

ma se usi il mouse per indicare la direzione si suppone che lo sprite abbia la visione dall'alto e a questo punto basterebbe un

Codice: Seleziona tutto

direction=point_direction(x,y,mouse_x,mouse_y);

draw_sprite_ext(sprite0,-1,x,y,1,1,direction,c_white ,1)
con lo sprite con più subimage disegnato con un'unica direzione (0 gradi a destra) che verrà modificata dal codice draw_sprite_ext

o al limite anche un semplice

Codice: Seleziona tutto

image_angle=point_direction(x,y,mouse_x,mouse_y)
Immagine

BotaniciTraffici
Membro attivo
Messaggi: 348
Iscritto il: 31/01/2014, 12:38
Specialità: Programmazione
Uso: GM:Studio 1.4 Master
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da BotaniciTraffici »

E l'animazione?

Edit: image_angle non serve a meno che non si usi una visuale 100% top view. MA in tutti gli altri casi è inutile... un esempio gli sprite a 8 direzioni in pseudoiso di Reiner. (esempio con uno spriteset trovato a caso non di Reiner)

Fabygamer
Newbie
Messaggi: 12
Iscritto il: 30/09/2018, 18:09
Specialità: Grafico
Uso: GameMaker 8.1
Contatta:

Re: Sprite animato con 8 direzioni

Messaggio da Fabygamer »

E invece se lo sprite ha la possibilità di muoversi a 360° ?devo comunque usare switch e break?

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti