Ciao a tutti, voglio condividere questo semplice codice per chi è alle prime armi con GM e vorrebbe realizzare l'effetto di una lanterna che segue il giocatore nella notte.
Il codice non ha nulla di speciale, ma può tornare utile per chi volesse imparare una cosina in più... che non fa mai male.
REQUITISI
Avete il vostro giocatore che si muove nel mondo e una view che lo segue. Il vostro pg illumina intorno a lui come se avesse una lanterna. Ovviamente sto parlando di 2d. Questo semplice e veloce sistema va bene sia per giochi side che topview, anche isometrici.
FASE 1: LUCE AMBIENTALE
Per prima cosa crea un'oggetto e chiamalo obj_luce_ambientale Questo oggetto va inserito nella room e serve a mostrare l'effetto notte. In poche parole scurisce tutto quello che c'è nella view.
Nel create dell'oggetto crei una surface delle dimensioni della view:
Codice: Seleziona tutto
luce=surface_create(view_wview,view_hview);
Codice: Seleziona tutto
surface_set_target(luce);
draw_set_color(c_ltgray);
draw_rectangle(0,0,view_wview,view_hview,false);
surface_reset_target();
Codice: Seleziona tutto
draw_set_blend_mode(bm_subtract);
draw_surface(luce,view_xview,view_yview);
draw_set_blend_mode(bm_normal);
Se hai già un'oggetto lanterna che segue il tuo giocatore applica il codice seguente, altrimenti crea un oggetto nuovo e fai in modo che lo segua
Nell'end step disegna "la luce" della lanterna. La variabile grandezza puoi modificarla a piacere a seconda delle tue necessità.
Quello che fai è disegnare un cerchio attorno al pg (o alla lanterna, se ne hai una). I 4 punti del cerchio li calcoli in automatico in base alla grandezza che hai inserito. La luce viene anche posizionata in relazione alla view. (esamina il draw_ellipse_color per capire come funziona)
Codice: Seleziona tutto
grandezza=200;
draw_set_blend_mode(bm_subtract);
surface_set_target(obj_luce_ambientale.luce);
draw_ellipse_color(x-grandezza/2-view_xview,y-grandezza/2-view_yview,x+grandezza/2-view_xview,y+grandezza/2-view_yview,c_white,c_black,false);
surface_reset_target();
draw_set_blend_mode(bm_normal);
E' possibile incollare l'ultimo codice che ho scritto nell'end_step di qualsiasi oggetto volete che faccia una luce radiale.
Questo è un modo molto semplice e veloce per risolvere uno dei problemi più comuni ai makers, ma è solo un punto di partenza per chi vuole capire il funzionamento delle surface e del blending.