Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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 "oLightContro­ller".

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.

Temnota a tieň v game maker - Game maker - Efekty

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 podmienkami

Stiahnuté 685x (2.14 MB)

 

Všetky články v sekcii
Game maker - Efekty
Článok pre vás napísal Garrom Orc Shaman
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor zabýval pasní her v nástroji GameMaker, poté Unity3D a teď se zabývá GoDot enginem. Dokud tu někde nebude kategorie "GoDot", autor nejspíše psát nebude.
Aktivity