2D odlesky v GameMakeru
Nedávno jsem vytvářel prostředí ledové jeskyně do hry. Protože jsem ale nebyl spokojený s jednoduchým obrázkem zdi, chtěl jsem zkusit vytvořit efekt, díky kterému by měly zdi vlastní odlesky a vypadaly reálněji. Výsledek je v principu hodně jednoduchý, ale dokáže herní prostředí hodně oživit. Nevýhodou je, že využívá surface, takže se nehodí pro velké roomy. Pro pochopení kódu je potřeba ovládat surfacy a blend mód.

Tvorba efektu
Nejdřív vytvoříme objekt, který bude celý efekt ovládat, například specular_obj. Protože bude vykreslovat celý efekt, doporučuju zvolit vysoký depth. Do následujících událostí vložíme pří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); }
Poté stačí vytvořit 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 }
Princip je jednoduchý. Nejdřív se do čistého surfacu vykreslí všechny specular masky všech objektů, které mají házet odlesky (masky určíme později v jednotlivých objektech do proměnné specular_mask). Poté se přes surface vykreslí sprite s kruhovou průhledností a vznikne tak přechod k neprůhledným okrajům obrazovky.
Průhledný sprite stáhnete v archivu pod článkem, vložte jej do hry jako specular_mask_spr.
Nakonec vytvoříme objekt spec_parent_obj, který bude prázdný, ale každý objekt s odlesky jej bude mít nastavený v parentu.
Tvorba objektu s odleskem
Teď už stačí jenom vytvořit potřebné objekty. Vytvoříme objekt, dáme mu zmíněný parent spec_parent_obj a přiřadíme sprite. Teď musíme mít připravený kromě původního spritu i masku, která bude určovat, kde přesně se projeví odraz světla. Tento sprite funguje jako klasická alpha maska, černé plochy znamenají žádný odraz a na bílých se projeví plné světlo. Tady je příklad z přiloženého souboru:

Sprite masky přiřadíme do proměnné specular_mask. Poté ještě musíme nastavit intenzitu odlesku v proměnné specular_alpha, můžete nechat 1. Přikládám i příklad, ve kterém jsem vytvořil několik materiálů pro ukázku. Dělal jsem to na rychlo, takže je to opravdu pro ukázku a pokud si vyhrajete s grafikou, určitě dosáhnete mnohem hezčích výsledků. V případě potřeby můžete i zvýšit výkon tak, že budete skript efektu volat třeba jen každý třetí step, ale trochu se to projeví na plynulosti efektu.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 201x (1.86 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker