2D odlesky v game maker
Nedávno som vytváral prostredia ľadovej jaskyne do hry. Pretože som ale nebol spokojný s jednoduchým obrázkom múru, chcel som skúsiť vytvoriť efekt, vďaka ktorému by mali múry vlastnú odlesky a vyzerali reálnejšie. Výsledok je v princípe veľa jednoduchý, ale dokáže herné prostredie veľa oživiť. Nevýhodou je, že využíva surface, takže sa nehodí pre veľké roomy. Pre pochopenie kódu je potrebné ovládať Surface a blend mód.
Tvorba efektu
Najskôr vytvoríme objekt, ktorý bude celý efekt ovládať, napríklad specular_obj. Pretože bude vykresľovať celý efekt, odporúčam zvoliť vysoký depth. Do nasledujúcich udalostí vložíme príslušný kód.
CREATE:
// nastavení // alpha = 1; sila = 0.5; //intenzita odlesků width=room_width; //délka surfacu height=room_height; //výška surfacu surface=surface_create(width,width); surface_on=1;
STEP:
specular_scr(sila);
DRAW:
//vykreslení efektu if (surface_on==1) { draw_set_blend_mode(bm_add); draw_surface_part_ext(surface,view_xview,view_yview,view_xview+view_wview,view_yview+view_hview,view_xview,view_yview,1,1,c_white,alpha); draw_set_blend_mode(bm_normal); }
Potom stačí vytvoriť samotný skript specular_scr
var sila_var; sila_var=make_color_rgb(argument0*255,argument0*255,argument0*255); if (surface_on==1) { surface_set_target(surface); // aktivace vykreslování do surfacu draw_set_color(c_black); draw_rectangle(view_xview,view_yview,view_xview+view_wview,view_yview+view_hview,0); //vyčištění předchozího vykreslování ///// vykreslení definované specular masky u všech objektů s parentem spec_parent_obj ///// with spec_parent_obj { draw_sprite_ext(specular_mask,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,specular_alpha); } ///// ------------------------------------------------- ////// draw_set_color(sila_var); draw_line_width(0,room_height,room_width,room_height,1); //změna efektu s pohybem viewu xpp=view_xview; ypp=view_yview; index=specular_mask_spr; x_sc=view_wview+64; y_sc=view_hview+64; //překreslení surfacem blend spritem (specular_mask_spr) draw_set_blend_mode(bm_subtract) draw_sprite_stretched_ext(index,0,xpp-32,ypp-32,x_sc+64,y_sc+64,c_white,1); draw_set_blend_mode(bm_normal) surface_reset_target(); //deaktivace vykreslování do surfacu }
Princíp je jednoduchý. Najskôr sa do čistého Surface vykreslí všetky specular masky všetkých objektov, ktoré majú hádzať odleskami (masky určíme neskôr v jednotlivých objektoch do premennej specular_mask). Potom sa cez surface vykreslí sprite s kruhovou priehľadnosťou a vznikne tak prechod k nepriehľadným okrajom obrazovky.
Priehľadný sprite stiahnete v archíve pod článkom, vložte ho do hry ako specular_mask_spr.
Nakoniec vytvoríme objekt spec_parent_obj, ktorý bude prázdny, ale každý objekt s odleskami ho bude mať nastavený v Parent.
Tvorba objektu s odleskom
Teraz už stačí len vytvoriť potrebné objekty. Vytvoríme objekt, dáme mu spomínaný parent spec_parent_obj a priradíme sprite. Teraz musíme mať pripravený okrem pôvodného Spritu aj masku, ktorá bude určovať, kde presne sa prejaví odraz svetla. Tento sprite funguje ako klasická alpha maska, čierne plochy znamenajú žiadny odraz a na bielych sa prejaví plné svetlo. Tu je príklad z priloženého súboru:
Sprite masky priradíme do premennej specular_mask. Potom ešte musíme nastaviť intenzitu odlesku v premennej specular_alpha, môžete nechať 1. Prikladám aj príklad, v ktorom som vytvoril niekoľko materiálov pre ukážku. Robil som to na rychlo, takže je to naozaj pre ukážku a keď si vyhráte s grafikou, určite dosiahnete oveľa krajších výsledkov. V prípade potreby môžete aj zvýšiť výkon tak, že budete skript efektu volať trebárs len každý tretí step, ale trochu sa to prejaví na plynulosti efektu.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 201x (1.86 MB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker