Pravidla Ucet
Nepřihlášen

Článek

Menu

Surfaces
Napsal: DDL Blue
Přidáno: 18.02. 2011

Surfacy, neboli česky povrchy jsou velice mocným nástrojem a překvapuje mě, jak často od lidí slýchávám, že se surfacema naumí. Přitom to opravdu není nic těžkého (i když pro úplné začátečníky to také není) a dá se tím dosáhnout poměrně dost působyvých kousků.

Co je vlastně surface?


Jak už napovídá český překlad názvu, surface je povrch. Přesněji nějaká část videopaměti, do které můžeme kreslit. Kreslí se do něj prakticky stejně, jako by jsme kreslili normálně do hry. S tím rozdílem, že se to všechno ve hře neobjeví ale objeví se nám to na našem povrchu.


Pro ukázku si představte, že máte před sebou čtvrtku papíru. To je vaše hra. Do ní kreslíte všechno, co chcete, aby se hráči ukazovalo. Vedle čtvrtky ale máte blok, do kterého si můžete kreslit, aniž by to ovlivnilo vaši čtvrtku - hru. Můžete si na něj ku příkladu nakreslit nějaké složitější okno paneláku. Pak ho stačí jen vystřihnout a nalepit třeba 20x na čtvrtku (v tomdle připadě se s realitou trochu rozcházíme, v realitě můžeme okno vystřihnout jenom jednou, ale surface můžeme vykreslit do hry kolikrát budeme chtít). Nebo do surfacu nakreslíme na začátku hry rovnou celý panelák a pak ho už jen každý krok nemusíme kreslit znovu, pouze vykreslíme povrch s tím starým.


Tím se z našeho příkladu s papírem dostáváme ke GameMakeru. K obsluze surfaců slouží GML příkazy začínající na surface_. Vysvětlím jen ty nepoužívanější.



surface_create(w,h); vytvoří surface s šířkou w a výškou h. Vrací 'odkaz' na vytvořený surface, obdobně, jako když nahráváme externě grafiku nebo zvuky.

surface_set_target(id); Od zavolání tohoto příkazu vykreslování probíhá do surfacu. Argument id značí, do jakého - dosazuje se do něj proměnná, do které jsme uložili odkaz na cílový surface (viz. surface_create(...);)

surface_reset_target(); Vrátí vykreslování zpět do normálu, tj. od teď už nevykreslujeme do surfacu ale normálně do hry.

surface_free(id); Vymaže surface určený argumentem id z paměti.

draw_surface(id,x,y); Vykreslí surface id na určených souřadnicích.


K čemu jsou surfacy užitečné?



Co jsou vlastně surfacy, co jsem doufám vysvětlil. Ale k čemu je to tedy v praxi užitečné? V první řadě je to vynikající optimalizační metoda. Jak jsem uváděl v příkladu s panelákem - nakreslíte něco jednou, a potom už vykreslujete surface jako nějaký obrázek. V surfacu může být jakkoliv složitý útvar vytvořený klidně v průběhu několika stepů(celé hry). Můžou v něm být například krátery v zemi vytvořené samotným hraním hry, můžete si udělat takové malování, v kombinací s blend módem lze docílit efektního osvětlení nebo motion blur efektu, v kombinaci s vertexama(surface lze použít jako texturu vertexů + lze vykreslit celou hru do surfacu) můžete "rozvlnit" obrazovku nebo můžete jednoduše na celou hru použít různé (barevné) filtry(opět kombinace s blend módama).




Motion blur efekt



Pro ukázku, jak se se surfacema pracuje vám ukážu na jedoduchém motion blur efektu.


Tento (ostatně jako všechny moje) tutoriál je pouze jako ukázka, jakým lze tento problém řešit. Nemá to být přesný postup, jaký si okopírujete do své hry, ale pouze taková inspirace.


Pro náš příklad budeme potřebovat dva objekty. ObjBall a ObjBlur. ObjBall je objekt, který má sprit SprBall a nějakým způsobem se pohybuje. Jak, to už si udělejte, jak chcete.


Podstatný bude ObjBlur:



create:
s=surface_create(room_width,room_height);

Vytvoříme surface o rozměrech roomu, a odkaz na něj uložíme třeba do proměnné s.

step:
surface_set_target(s); //nastavíme kreslení do surfacu...
draw_set_alpha(0.02); draw_set_color(c_black); draw_rectangle(0,0,room_width,room_height,0); //tyto tři příkazy vykreslí do surfacu průhledný černý obelník =>surface se ztmaví.
draw_set_alpha(1); //alpju nastavíme zpět, pro příští kreslení čehokoliv.
draw_sprite(SprBall,0,ObjBall.x,ObjBall.y); //Přikreslíme do surfacu obrázek objektu.
surface_reset_target(); //vracíme kreslení zpět do hry.

Pokud používáte pohledy, nezapomeňte od pozice obrázku odečíst pozivi pohledu.


draw:

draw_set_blend_mode(bm_add);
draw_surface(s,0,0);
draw_set_blend_mode(bm_normal);

Pokud nevíte, co dělají blend módy, zkuste se kouknout sem nebo sem.

Vykreslíme blend módem na obrazovku obsach surfacu. Protože surface průběžně ztmavujeme, starší stopy objektu budou tmavší a tudíž díky blend módu průhlednější.



end game/end room/destroy atd.
surface_free(s);

Po ukončení hry, odchodu z místnosti, odstranění instance nebo vypnutí bluru nezapomeneme smazat surface z videopaměti...






Tak, to je vše. Doufám, že jsem vám dostatečně osvětlil, co to surfacy jsou a že se je rychle naučíte používat, protože to může být někdy doopravdy užitečná věc :). Jako vždy - dotazy, nejasnosti do komentářů ;).


Klíčová slova: surf surfacy surface surfaces povrch povrchy optimalizace motion blur effect efekt stopy za objektem malování
 

Komentáře:

Napsal: DDL Blue
Přidáno: 18.02. 2011

...ty gramatický chyby ještě opravim, nebojte :D

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010