Maska je v GM obrázek určitého tvaru, který přidává objektům ve hře nějaké vlastnosti. To platí jak pro masku kolizní, která říká, co ještě je a co už není hranicí objektu, tak pro alpha masku, která určuje kde přesně a jak moc má být obrázek průhledný.
Na začátek pár nutných pojmů, bez kterých se nehneme dále.
Alpha = matematicky vyjádřená průhlednost. V GM se udává v hodnotách 0-1, přičemž jsou povolena desetinná místa. Čím je hodnota nižší, tím více je obrázek průhledný.
Pixel je nejmenší nedělitelná část obrázku, jeden obrazový bod.
Je složka pixelu udávající hodnotu průhlednosti tohoto pixelu.
Pro zpracování obrazu s průhledností nemusí být alfa kanál součástí bitmapového obrázku, ale může být jako samostatná bitmapa (další obrázek). Potom takový obrázek označujeme jako alpha masku.
Alpha kanál je přímo součástí obrázku, informace o průhlednosti si obrázek nese v sobě. Alpha maska je samostatný obrázek, který se aplikuje na obrázek, který chceme mít průhledný. Technicky vzato se jedná o dvě řešení téhož. Výsledný efekt je nakonec stejný.
Alpha maska funguje na principu odečtu světlosti pixelu použitého v maskovacím obrázku. Čím světlejší je pixel masky, tím průhlednější bude maskovaný obrázek. Pro příklad se podívejte níže na obrázek s andílky.
Jak jsme si řekli výše, alpha maska/alpha kanál určuje jak moc má být obrázek průhledný.
Průhlednost, potažmo alpha maska je dvojího druhu:
1-bitová alpha maska určuje průhlednost na úrovni dvou (2na1) stavů:1 a 0. Zcela průhledný nebo zcela neprůhledný. 1-bitovou alpha masku využívá grafický formát GIF. Proto, i když jsou obrázky průhledné, jsou kostrbaté, zubaté.
Tento jev jde odstranit antialiasingem na úrovni barev. To znamená, že autor obrázku při okrajích zvolí barvy odpovídající k pozadí na kterém se bude pohybovat. Není to sice moc elegantní řešení, navíc je poměrně pracné a náročné na zručnost autora, ale dá se s úspěchem používat.
8-bitová alpha maska určuje průhlednost na úrovni 256 (2na8) stavů. 8-bitovou alpha masku využívá grafický formát PNG. Obrázek tak může být v různých částech jinak průhledný.
Toho se dá v GM výborně využít jednak při pseudo-vektorové grafice, ale zejména ve spolupráci s blend_mode funkcemi, kdy jdou velmi jednoduše tvořit efektní výbuchy, lasery, aury a všemožné světelné efekty, které jsou navíc v tomto podání velmi nenáročné na výkon.
Game maker ve verzi 7 má jedno nepříjemné omezení. Sám o sobě neumí korektně zpracovat alpha kanál. Pokud však obrázek načteme externě, nemá s jeho vykreslením sebemenší problém. Game maker ve verzi 8 již zpracovává 8bitový alpha kanál zcela korektně.
Do nějaké, nejlépe globální, proměnné si načteme obrázek pomocí funkce sprite_add_alpha, která se zapisuje takto:
sprite_add_alpha //název funkce
fname // cesta k souboru, zadává se do uvozovek, např.: “grafika/hrac/hrac.png“
imgnumb // sprite index, pokud jde o samostatný snímek je výchozí hodnota -1
precise // určuje kolize: 1 = precizní kolize, 0 = běžné kolize
transparent // určuje průhlednost, výchozí hodnota = 1
smooth // určuje rozmazání, výchozí hodnota = 0
preload // určuje, zda se má sprite přednahrát do paměti, hodnoty 1 nebo 0
xorig // poloha originu v pixelech – x-ová souřadnice (vodorovný směr)
yorig // poloha originu v pixelech – y-ová souřadnice (svislý směr)
a takto už vypadá konkrétní zápis, v eventu create nebo např. start_game:
Nyní tento sprite (hrac.png), uložený do globální proměnné(global.spr_hrac), vykreslíme v eventu draw, pomocí funkce draw_sprite_ext;
Zápis funkce:
draw_sprite_ext // název funkce
spr // název spritu, v našem případě proměnné, které je přiřazen tento sprite
subimg // sprite index, čili pořadí sub-snímku, pokud jde o samostatný snímek je
výchozí hodnota -1
x //x-ová souřadnice
y // y-ová souřadnice
xscale // faktor zvětšení v x-ovém(vodorovném) směru, je-li menší než 1, sprite je vykreslený zmenšený, je-li větší než 1, sprite je vykreslený zvětšený
yscale // jako předchozí, platí pro y-ový (svislý, vertikální) směr
rot // rotace, čili otočení snímku, udává se ve stupních (hodnoty 0-359)
col // barva průhlednosti, výchozí hodnota pro průhlednost je c_white;
alpha // průhlednost spritu, udává se v rozmezí 0-1, povolena jsou desetinná místa, čím je hodnota nižší,tím více je obrázek průhledný.
Pokud nastavíte větší než 1, GM bude zvětšení dopočítávat, což ne vždy vypadá dobře, ale je to poměrně nenáročné na výkon počítače.
Pokud dáte xscale nebo yscale menší než 1 a větší než 0, GM bude přepočítávat sprite a vykreslovat jej zmenšený. Zmenšený sprite vypadá téměř vždy výrazně lépe než zvětšený, cenou je vyšší zátěž na počítač.
Obecně se mi v praxi vyplatilo, zvláště u výbuchů, kouřových efektů apod., nakreslit raději maximální velikost spritu, a i přes výše uvedenou náročnost nechávat vykreslovat sprite zmenšený a průběžně jej zvětšovat na maximální velikost. Při rozumném použití je zpomalení zanedbatelné a výsledný grafický efekt perfektní.
U dynamicky zvětšovaných spritů se nevyhnete dosazení proměnných na pozici xscale a yscale, s těmi můžete libovolně počítat, třeba ve stepu nebo jindy/jinde. Toho lze opět využívat k všemožným účelům. Banalita, ale nemusí být zřejmá, zvláště pokud jsme tyto funkce doposud nepoužívali.
V případě, že nastavíte xscale nebo yscale do záporných hodnot, budou se sprity vykreslovat převráceně v odpovídající ose souměrnosti.
Pokud nastavíte xcale a yscale napevno na hodnotu rovnou 1 – což bude u drtivé většiny spritů (postavy, interface, pozadí oken a roomu...), výše uvedené starosti odpadají.
Příklady konkrétního zápisu:
Za x, y, xscale, yscale, rot a alpha má smysl dosadit – a často je to velmi výhodné - námi vytvořené proměnné, to umožní s grafikou dynamicky pracovat.
Zápis pak může vypadat třeba takto:
draw_sprite_ext(global.spr_berserk_aura, -1, obj_hrac.x, obj_hrac.y, prom_xscale, prom_yscale, prom_berserk_rotace, c_white, prom_aura_alpha);
Grafika je načítaná externě, není přibalena ke hře, spustitelný soubor má menší velikost. Tento postup (externí načtení přes sprite_add_alpha v případě GM7, případně sprite_add v GM8 a následné vykreslení přes draw_sprite_ext) je velmi výhodný. Proč?
Hra se rychleji načítá.
Funkce draw_sprite_ext (opět v GM7, GM8 je v tomto směru bezproblémový) zpracovává 8-bit alpha kanál, grafika ve hře bude mít dokonale hladké okraje bez zubů.
Pokud nadeklarujete globální proměnné do jednoho objektu ve hře, šetříte výrazným způsobem paměť, hra je méně náročná na počítač.
Můžete jednoduše vytvářet speciální světelné efekty: lasery, výbuchy, aury...
Veškerou grafiku ve hře můžete kontrolovat z jednoho místa, což je pohodlné a výhodné pro správu, údržbu a editaci, zejména u větších projektů.
Alpha
Alpha = matematicky vyjádřená průhlednost. V GM se udává v hodnotách 0-1, přičemž jsou povolena desetinná místa. Čím je hodnota nižší, tím více je obrázek průhledný.
Pixel
Pixel je nejmenší nedělitelná část obrázku, jeden obrazový bod.
Alpha kanál (alpha transparency channel)
Je složka pixelu udávající hodnotu průhlednosti tohoto pixelu.
Pro zpracování obrazu s průhledností nemusí být alfa kanál součástí bitmapového obrázku, ale může být jako samostatná bitmapa (další obrázek). Potom takový obrázek označujeme jako alpha masku.
Alpha kanál je přímo součástí obrázku, informace o průhlednosti si obrázek nese v sobě. Alpha maska je samostatný obrázek, který se aplikuje na obrázek, který chceme mít průhledný. Technicky vzato se jedná o dvě řešení téhož. Výsledný efekt je nakonec stejný.
Alpha maska funguje na principu odečtu světlosti pixelu použitého v maskovacím obrázku. Čím světlejší je pixel masky, tím průhlednější bude maskovaný obrázek. Pro příklad se podívejte níže na obrázek s andílky.
Alpha = 1; //obrázek je zcela neprůhledný
Alpha = 0.5; //obrázek je z poloviny průhledný
Alpha = 0.1; //obrázek je z 90% průhledný
Alpha = 0; // obrázek je zcela průhledný, není vidět
Alpha = 0.5; //obrázek je z poloviny průhledný
Alpha = 0.1; //obrázek je z 90% průhledný
Alpha = 0; // obrázek je zcela průhledný, není vidět
Jak jsme si řekli výše, alpha maska/alpha kanál určuje jak moc má být obrázek průhledný.
Průhlednost, potažmo alpha maska je dvojího druhu:
1-bitová alpha maska určuje průhlednost na úrovni dvou (2na1) stavů:1 a 0. Zcela průhledný nebo zcela neprůhledný. 1-bitovou alpha masku využívá grafický formát GIF. Proto, i když jsou obrázky průhledné, jsou kostrbaté, zubaté.
Tento jev jde odstranit antialiasingem na úrovni barev. To znamená, že autor obrázku při okrajích zvolí barvy odpovídající k pozadí na kterém se bude pohybovat. Není to sice moc elegantní řešení, navíc je poměrně pracné a náročné na zručnost autora, ale dá se s úspěchem používat.
8-bitová alpha maska určuje průhlednost na úrovni 256 (2na8) stavů. 8-bitovou alpha masku využívá grafický formát PNG. Obrázek tak může být v různých částech jinak průhledný.
Toho se dá v GM výborně využít jednak při pseudo-vektorové grafice, ale zejména ve spolupráci s blend_mode funkcemi, kdy jdou velmi jednoduše tvořit efektní výbuchy, lasery, aury a všemožné světelné efekty, které jsou navíc v tomto podání velmi nenáročné na výkon.
Game maker ve verzi 7 má jedno nepříjemné omezení. Sám o sobě neumí korektně zpracovat alpha kanál. Pokud však obrázek načteme externě, nemá s jeho vykreslením sebemenší problém. Game maker ve verzi 8 již zpracovává 8bitový alpha kanál zcela korektně.
Jak načíst obrázek s alpha maskou do Game makeru 7?
Do nějaké, nejlépe globální, proměnné si načteme obrázek pomocí funkce sprite_add_alpha, která se zapisuje takto:
sprite_add_alpha(fname, imgnumb, precise, transparent, smooth, preload, xorig, yorig);
sprite_add_alpha //název funkce
fname // cesta k souboru, zadává se do uvozovek, např.: “grafika/hrac/hrac.png“
imgnumb // sprite index, pokud jde o samostatný snímek je výchozí hodnota -1
precise // určuje kolize: 1 = precizní kolize, 0 = běžné kolize
transparent // určuje průhlednost, výchozí hodnota = 1
smooth // určuje rozmazání, výchozí hodnota = 0
preload // určuje, zda se má sprite přednahrát do paměti, hodnoty 1 nebo 0
xorig // poloha originu v pixelech – x-ová souřadnice (vodorovný směr)
yorig // poloha originu v pixelech – y-ová souřadnice (svislý směr)
a takto už vypadá konkrétní zápis, v eventu create nebo např. start_game:
global.spr_hrac = sprite_add_alpha(“gfx/hrac/hrac.png“, -1, 1, 1, 0, 0, 16, 16);
Nyní tento sprite (hrac.png), uložený do globální proměnné(global.spr_hrac), vykreslíme v eventu draw, pomocí funkce draw_sprite_ext;
Zápis funkce:
draw_sprite_ext(spr, subimg, x, y, xscale, yscale, rot, col, alpha);
draw_sprite_ext // název funkce
spr // název spritu, v našem případě proměnné, které je přiřazen tento sprite
subimg // sprite index, čili pořadí sub-snímku, pokud jde o samostatný snímek je
výchozí hodnota -1
x //x-ová souřadnice
y // y-ová souřadnice
xscale // faktor zvětšení v x-ovém(vodorovném) směru, je-li menší než 1, sprite je vykreslený zmenšený, je-li větší než 1, sprite je vykreslený zvětšený
yscale // jako předchozí, platí pro y-ový (svislý, vertikální) směr
rot // rotace, čili otočení snímku, udává se ve stupních (hodnoty 0-359)
col // barva průhlednosti, výchozí hodnota pro průhlednost je c_white;
alpha // průhlednost spritu, udává se v rozmezí 0-1, povolena jsou desetinná místa, čím je hodnota nižší,tím více je obrázek průhledný.
Poznatky k parametrům xscale a yscale
Pokud nastavíte větší než 1, GM bude zvětšení dopočítávat, což ne vždy vypadá dobře, ale je to poměrně nenáročné na výkon počítače.
Pokud dáte xscale nebo yscale menší než 1 a větší než 0, GM bude přepočítávat sprite a vykreslovat jej zmenšený. Zmenšený sprite vypadá téměř vždy výrazně lépe než zvětšený, cenou je vyšší zátěž na počítač.
Obecně se mi v praxi vyplatilo, zvláště u výbuchů, kouřových efektů apod., nakreslit raději maximální velikost spritu, a i přes výše uvedenou náročnost nechávat vykreslovat sprite zmenšený a průběžně jej zvětšovat na maximální velikost. Při rozumném použití je zpomalení zanedbatelné a výsledný grafický efekt perfektní.
U dynamicky zvětšovaných spritů se nevyhnete dosazení proměnných na pozici xscale a yscale, s těmi můžete libovolně počítat, třeba ve stepu nebo jindy/jinde. Toho lze opět využívat k všemožným účelům. Banalita, ale nemusí být zřejmá, zvláště pokud jsme tyto funkce doposud nepoužívali.
V případě, že nastavíte xscale nebo yscale do záporných hodnot, budou se sprity vykreslovat převráceně v odpovídající ose souměrnosti.
Pokud nastavíte xcale a yscale napevno na hodnotu rovnou 1 – což bude u drtivé většiny spritů (postavy, interface, pozadí oken a roomu...), výše uvedené starosti odpadají.
Příklady konkrétního zápisu:
draw_sprite_ext(global.spr_hráč, -1, 100, 100, 1, 1, 45, c_white, 0.5);
draw_sprite_ext(global.spr_hráč, -1, x, y, 1, 1, direction, c_white,1);
draw_sprite_ext(global.spr_hud_pozadi, -1, view_xview, view_yview, 1, 1,
direction, c_white, 1);
draw_sprite_ext(global.spr_hráč, -1, x, y, 1, 1, direction, c_white,1);
draw_sprite_ext(global.spr_hud_pozadi, -1, view_xview, view_yview, 1, 1,
direction, c_white, 1);
Za x, y, xscale, yscale, rot a alpha má smysl dosadit – a často je to velmi výhodné - námi vytvořené proměnné, to umožní s grafikou dynamicky pracovat.
Zápis pak může vypadat třeba takto:
draw_sprite_ext(global.spr_berserk_aura, -1, obj_hrac.x, obj_hrac.y, prom_xscale, prom_yscale, prom_berserk_rotace, c_white, prom_aura_alpha);
Proč je výhodné vykreslovat grafiku/sprity tímto způsobem a jaké jsou možnosti užití?
Grafika je načítaná externě, není přibalena ke hře, spustitelný soubor má menší velikost. Tento postup (externí načtení přes sprite_add_alpha v případě GM7, případně sprite_add v GM8 a následné vykreslení přes draw_sprite_ext) je velmi výhodný. Proč?
Hra se rychleji načítá.
Funkce draw_sprite_ext (opět v GM7, GM8 je v tomto směru bezproblémový) zpracovává 8-bit alpha kanál, grafika ve hře bude mít dokonale hladké okraje bez zubů.
Pokud nadeklarujete globální proměnné do jednoho objektu ve hře, šetříte výrazným způsobem paměť, hra je méně náročná na počítač.
Můžete jednoduše vytvářet speciální světelné efekty: lasery, výbuchy, aury...
Veškerou grafiku ve hře můžete kontrolovat z jednoho místa, což je pohodlné a výhodné pro správu, údržbu a editaci, zejména u větších projektů.
Komentáře
Přidat nový
Pro přispívání musíte být přihlášen
Zapsal Bullet catcher - 26.02.2010 18:32
Mně už tohle Pepa vysvětloval, takže jsem to pochopil :) Pěkné a s obrázkama, to je u tohoto důležité.
Zapsal Burák - 23.02.2010 09:32
Pěkný článek, JayaJ - to chce zkoušet v praxi, testovat, hrát si s tím a naučíš se to hned ;o)
Zapsal JayaJ - 22.02.2010 12:05
Pěknej tutorial, jen se v tý průhlednosti pořád matlám, skusim si to přečíst ještě několikrát a snad to pochopim :D Gw



