Temnota a svetlo v GML
Dnes si ukážeme ako urobiť v hre temnotu a samozrejme tu bude aj svetlo. Svetlo v GM a GM: S začiatočníci často rieši tak, že urobia čierny sprite s dierou centrovanú na hráča. Nuž, pre začiatok to nie je zlé. Ovšem potom sa dostávame k problému "Čo keď tu bude iný zdroj svetla?", Čo toto riešenie úplne rozbijú. Na druhú stranu pokročilý to rieši DLL knižnicami alebo vlastnými Shadery, čo má nevýhodu v tom, že to nemusí korektne spracovať na všetkých platformách.
Dnes vás naučím ako vytvoriť temnotu a svetlo použitím vstavaných funkcií, čo pracuje správne na všetkých platformách a podporuje viac zdrojov svetla.
Pre toto riešenie budete potrebovať len dva objekty a miestnosť.
OLightController
Vytvoríme si prvý objekt a pomenujeme ho "oLightController".
Create
Vložíme do neho CREATE event a do naj napíšeme jediný riadok.
global.light = surface_create(view_wview,view_hview);
V tomto jedinom riadku vytvoríme globálnej premennej s názvom light (ang. Svetlo), do tejto premennej uložíme práve vytvorený surface s rozmermi aktívneho pohľadu.
Pozn .: Globálne premenné majú výhodu, že nie sú obsiahnuté v žiadnom objekte, ale v samotnej hre. Teda idú volať alebo modifikovať odkiaľkoľvek a existujú aj keď objekt, ktorý ju vytvoril, už neexistuje.
Step
Ďalej nasleduje STEP event. Do neho dáme tento kód.
surface_set_target(global.light); draw_set_color(c_white); draw_rectangle(0,0,view_wview,view_hview,false); surface_reset_target();
Funkcia surface_set_target(id)
nastaví ako cieľ vykresľovanie
surface uložený v premennej. Normálne alebo skôr bez definície sa používa
surface obsiahnutý v okne programu. draw_set_color(col)
nastaví
na nasledujúce vykresľovanie určitú farbu, pamätajte, že z dôvodu
použitého blend módu (to až v draw evente) bude svetlejšia farba robiť
tmavšie temnotu. Takže keď chcete úplnú temnotu, použite bielu farbu. Keď
chcete tmu napoly priehľadnou, použite šedú. Ak tmu nechcete (napríklad pri
deň-noc cyklu), použijete čiernu. S funkciou
draw_rectangle(x1,y1,x2,y2,outline)
nakreslíte cez monitor tmu a
nakoniec funkcie surface_reset_target()
nastaví cieľ
vykresľovanie späť na surface okná, ku ktorej normálne nemáme prístup. Aj
cez to, že máme surface plný tmy, zatiaľ ho nevykresľuje na monitor. To
urobíme v DRAW eventu.
Draw
Vytvoríme si DRAW event a dáme do neho tento kód.
draw_set_blend_mode(bm_subtract); draw_surface(global.light,view_xview,view_yview); draw_set_blend_mode(bm_normal);
Funkcia draw_set_blend_mode(bm_subtract)
nastaví blend mód na
Subtract, čo je hojne používané na efekty svetla a tmy. Funkcia
draw_surface(id,x,y)
vykreslí surface na monitor na zadaných
súradniciach, v našom prípade to je ľavý horný roh aktívneho pohľadu.
Keďže surface má rozmery aktívneho pohľadu, tak pokryje celý pohľad.
Nakoniec nastavíme blend mód späť na normálne.
OLightSource
Ako zdroj svetla poslúži iný objekt, teraz si vytvoríme nový objekt a pomenujeme ho oLightSource.
Tento objekt bude mať len jeden event a to END STEP event.
Step
Použitím End Step eventu zaistíme, aby sa vykreslilo všetko ostatné a až potom svetlo. Keby sme kód dali do STEP eventu, mohli by sme mať v budúcnosti problém s Depth (napr. Svetlo by sa mohlo vykresľovať pod niektorými objekty). Takže si END STEP event vytvoríme a vložíme do neho tento kód.
size = 128; draw_set_blend_mode(bm_subtract); surface_set_target(global.light); draw_ellipse_color(x-(size/2)-view_xview,y-(size/2)-view_yview,x+(size/2)-view_xview,y+(size/2)-view_yview,c_white,c_black,false); surface_reset_target(); draw_set_blend_mode(bm_normal);
Pozn .: Tento kúsok kódu je prispôsobený tomu, aby ho šlo dať to scriptu, len miesto size, c_white a c_black použijete argumenty.
Premenná size
určuje aké veľké naše svetlo bude v
pixeloch. draw_set_blend_mode(bm_mode)
nám nastaví blend mód na
Subtract. surface_set_target(id)
nastaví cieľ vykresľovanie na
danú surface. Funkcia
draw_ellipse_color(x1,y1,x2,y2,col1,col2,outline)
nám vykreslí
svetlo. Je použitý jednoduchý výpočet, ktorý nastaví veľkosť
vykreslovaného svetla podľa premennej size
. Keďže surface sa
pohybuje s pohľadom (viď. OlightController objekt), je potreba od súradníc
elipsy odpočítať x / y pohľadu (inými slovami, súradnice budú relatívna
k súradniciam pohľadu). Potom tu sú dve farby použité pre vykreslenie. Dve
sú preto, že farba elipsy je prechod, kde prvý farba bude uprostred a druhá
u kraja.
Tým je všetko hotové. Do miestnosti si dajte oLightController a oLightSource. Ak narazíte na problém, napíšte ho do komentára, kde vám rád pomôžem.
Nakoniec som vám pripravil praktický príklad, v zipsu nájdete projekt a spustiteľnú aplikáciu.
Dúfam že som vás dnes naučil niečo užitočného a nezabudnite, poznanie je od toho, aby sa zdieľalo.
Ak sa chcete o blend módoch dozvedieť viac, môžete ísť na YoYo games blog, prvý diel tu a druhý tu.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 680x (2.14 MB)