Fade in/out alla morte del player

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Rispondi
Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Fade in/out alla morte del player

Messaggio da Wolfrost »

Ho ideato un sistema che fa in modo che, quando il pg si trova a 0 punti vita, fa un fade in, riavvia la room e fa un fade out. L'unico problema è che non funziona come dovrebbe.
La spiego brevemente:
Ci sono due object: obj_FadeIn ed obj_FadeOut.
Entrambi hanno come sprite un quadrato nero 32x32
Il primo che ci interessa è l' obj_FadeIn: nel suo Create Event ho settato l'image_alpha a 0, per renderlo trasparente.
Nel suo Step Event controllo che la variabile global.health_points sia a 0, nel caso lo fosse controlla che il suono di morte non si stia riproducendo (in un altro object ho messo il tasto R come prova, quando lo si preme il pg muore)
Nel caso in cui il suono di morte non si stia riproducendo, esegue questo pezzo di codice:

Codice: Seleziona tutto

image_xscale = view_xview;
image_yscale = view_yview;

if (image_alpha < 1)
{
    image_alpha += 0.05;
}
else if (image_alpha == 0.9)
{
    instance_create(view_xview,view_yview,obj_FadeOut);
    image_alpha += 1;
    if (image_alpha == 1)
    {
        room_restart();
    }
}
Come vedete, quando l'image_alpha arriva a 0.9 creo l' obj_FadeOut, aggiungo 0.1 all'image_alpha in modo che arrivi ad 1 e poi restarto la room.

Nel Create Event dell' obj_FadeOut c'è questo pezzo di codice:

Codice: Seleziona tutto

image_xscale = view_xview;
image_yscale = view_yview;
image_alpha = 1;
Che setta la dimensione dell'immagine con quella della view (molto comodo) e rende l'immagine opaca, quindi il quadrato nero è a tutto schermo.
Nel suo Step Event c'è questo codice:

Codice: Seleziona tutto

if (image_alpha <= 1)
{
    image_alpha -= 0.05;
}
else if (image_alpha == 0)
{
    instance_destroy();
}
Semplicemente controlla che l'image_alpha sia minore o uguale ad 1 (che è il nostro caso, visto che ho settato 1 nel Create Event), e quindi sottraggo di continuo 0.05 all'image_alpha finchè l'image_alpha non è 0: appena è 0 elimino l'object e tutto torna come prima.

Provando il codice sorge un problema: quando muori e fa il FadeIn verso il nero rimane nero, e la room non si riavvia... potreste spiegarmi il motivo? :piagne: Io sto cercando di capire il problema da mezz'ora :cry:
Immagine

Immagine

Avatar utente
Bombertoman
Membro super
Messaggi: 595
Iscritto il: 14/07/2014, 18:35
Specialità: Programmazione
Uso: GM:Studio 1.4 Standard
Località: Manfredonia (FG)
Contatta:

Re: Fade in/out alla morte del player

Messaggio da Bombertoman »

Hai messo che l'object fade in se ha image_alpha minore di 1 diminuisce... Se è uguale a 0 si ferma...
Ma se diminuisce anche quando arriverà a 0 sarà sempre verificata la condizione (minore di 1) devi aggiungere un "and >0". Poi stesso discorso sul Fade out, se é <=1 la diminuisce... Quindi la ripeterà all'infinito, se non aggiungi un and.
Project GG... vediamo se riesco a finire un gioco per una volta...

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Fade in/out alla morte del player

Messaggio da gameplay_extreme »

cose che mi sono saltate all'occhio:
Wolfrost ha scritto:

Codice: Seleziona tutto

image_xscale = view_xview;
image_yscale = view_yview;
Wolfrost ha scritto:Che setta la dimensione dell'immagine con quella della view
le variabili che hai usato (xview e yview) non sono le dimensioni della view

per sicurezza io eviterei gli la condizione "image_alpha == val" inquanto c'è il rischio che durante gli incrementi la condizione non sia mai verificata (il valore potrebbe essere saltato per motivi matematici è la logica del code va a farsi friggere!) magari usa "<=" o ">=" (o anche semplicemente "<" o ">"

il ciclo incrementa fino a che "image_apha < 1" quindi alla fine image_alpha diventerà 1 e la sistuazione "else if (image_alpha == 0.9)" non verrà mai seguita

l'incremento scritto nel code è di 1 non di 0.1 come dici sotto

comunque anche se la condizione "if (image_alpha == 0.9)" fosse eseguita e se aggiungessi come hai detto 0.1, avresti 0.9+0.1 e quindi il room_restart viene eseguito subito quindi a questo punto al posto di

Codice: Seleziona tutto

else if (image_alpha == 0.9)
{
    instance_create(view_xview,view_yview,obj_FadeOut);
    image_alpha += 1;
    if (image_alpha == 1)
    {
        room_restart();
    }
}
tanto valeva scrivere

Codice: Seleziona tutto

else if (image_alpha == 0.9)
{
    instance_create(view_xview,view_yview,obj_FadeOut);
    image_alpha = 1
    room_restart();
}
in oltre poichè l'oggetto obj_FadeOut verrebbe creato appena prima di fare il room_restart a rigor di logica farebbe appena in tempo a eseguire il create event (che come dice il manuale viene generato al momento della creazione dell'oggetto) mentre lo step event non verrà mai eseguito
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

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: Fade in/out alla morte del player

Messaggio da pacmino »

io userei due oggetti con draw_sprite_stretched_ext(sprite,subimg,x,y,w,h,color,alpha)

lo sprite fallo piccolo

oggetto roomstart da mettere nella room, quando ha finito si autodistrugge e si ricrea al room restart

create

Codice: Seleziona tutto

alfa=1
draw

Codice: Seleziona tutto

alfa-=0.02
draw_sprite_stretched_ext(sprite3,-1,0,0,room_width,room_height,c_black,alfa)

if alfa<=0 
{
instance_destroy()
}

oggeto morte da creare nel momento in cui muori, non serve distruggerlo in quanto il room restart lo spazza via

create

Codice: Seleziona tutto

alfa=0
draw

Codice: Seleziona tutto

alfa+=0.025
draw_sprite_stretched_ext(sprite3,-1,0,0,room_width,room_height,c_black,alfa)

if alfa>=1 
{
room_restart()
}
Immagine

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Fade in/out alla morte del player

Messaggio da Wolfrost »

pacmino ha scritto:io userei due oggetti con draw_sprite_stretched_ext(sprite,subimg,x,y,w,h,color,alpha)

lo sprite fallo piccolo

oggetto roomstart da mettere nella room, quando ha finito si autodistrugge e si ricrea al room restart

create

Codice: Seleziona tutto

alfa=1
draw

Codice: Seleziona tutto

alfa-=0.02
draw_sprite_stretched_ext(sprite3,-1,0,0,room_width,room_height,c_black,alfa)

if alfa<=0 
{
instance_destroy()
}

oggeto morte da creare nel momento in cui muori, non serve distruggerlo in quanto il room restart lo spazza via

create

Codice: Seleziona tutto

alfa=0
draw

Codice: Seleziona tutto

alfa+=0.025
draw_sprite_stretched_ext(sprite3,-1,0,0,room_width,room_height,c_black,alfa)

if alfa>=1 
{
room_restart()
}
Grazie, il tuo metodo funziona alla perfezione! :rockrock:
Immagine

Immagine

Xandra
Newbie
Messaggi: 1
Iscritto il: 17/10/2014, 13:42
Uso: GM:Studio 2
Contatta:

Re: Fade in/out alla morte del player

Messaggio da Xandra »

probabilmente il problema e che le rooms non sono stringhe ma id numerici (non ostante abbiano l'aspetto di parole).

del resto tu scrivi, per esempio: room_goto(room6) mica room_goto("room6")
Enjoy the real success with 1z0-591 free brain dumps exam and cisco ccna online training programs and latest Avaya. Also prepare for next level with quality Massachusetts Institute of Technology (MIT) questions and answers of sscp training.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 34 ospiti