Pagina 1 di 1

Sprite animato con 8 direzioni

Inviato: 16/02/2014, 15:00
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; };
    }
}

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 16:44
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...

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 17:05
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.

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 17:11
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à...

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 17:17
da BotaniciTraffici
Homunculus ha scritto:ma io sono fissato con ottimizzazioni del genere
Anche io purtroppo :|

Sai che ti dico? Ora ci provo :paura:

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 17:46
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:

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 20:42
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à...

Re: Sprite animato con 8 direzioni

Inviato: 16/02/2014, 21:00
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.

Re: Sprite animato con 8 direzioni

Inviato: 17/02/2014, 11:56
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)

Re: Sprite animato con 8 direzioni

Inviato: 17/02/2014, 12:00
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)

Re: Sprite animato con 8 direzioni

Inviato: 03/10/2018, 10:08
da Fabygamer
E invece se lo sprite ha la possibilità di muoversi a 360° ?devo comunque usare switch e break?