Jak na tlačítka v GameMaker
Zdravím, já jsem DrMrkev a všechny vás vítám u mého tutoriálu.
Úvod
Spoustě lidem, co dělají v Game Makeru, dělá problém interakce pomocí tlačítek. Spousta z vás to řeší tak, že pro každé tlačítko mají objekt zvlášť, což je jen tak mimochodem šeredně špatné řešení. V tomto tutoriálu vás naučím jak můžete mít i milion tlačítek a stále pouze jediný objekt.
Teorie
Budeme mít skript, který bude vykreslovat tlačítko a
vracet true
, pokud bude myš na tlačítku. Tlačítko samotné
bude sprite s dvěma snímky, jeden pro tlačítko v klidu a druhý se zobrazí,
pokud je myš na tlačítku. Náš skript bude vracet true, pokud je myš na
tlačítku z toho důvodu, že tento skript je v podstatě kontrola souřadnic,
což se dá použít kdekoliv (např. Máte tlačítko s symbolem
„?“ a pokud na něj najedete, ukáže se text). Kdyby
vracel true při kliknutí, tak by tak široké využití neměl.
Příprava
Připravíme si jeden skript („scrButton“), jeden sprite s dvěma snímky („sButton“) a jeden objekt („oButtons“).
Pozn.: Na sButton nenastavujte origin (původ), udělat to můžete, ale vzhledem k použitým funkcím je to naprosto zbytečné. První snímek u sButton bude tlačítko v klidu a druhý bude tlačítko, pokud je ne něm myš.
Skript
Náš skript bude vykreslovat tlačítko a kontrolovat zda je myš na tlačítku, pokud ano vrátí true:
///scrButton(x, y, spr, scl) ret = false; h = (sprite_get_height(argument2) * argument3); w = (sprite_get_width(argument2) * argument3);
První řádek je nápověda. Při psaní kódu se bude zobrazovat v dolní části okna. Ret je návratová hodnota, „h“ a „w“ jsou šířka a výška obrázku, do které je připočítáno roztažení (onen argument3).
if (mouse_x > argument0 && mouse_y > argument1 && mouse_x < (argument0 + w) && mouse_y < (argument1 + h)) { draw_sprite_stretched(argument2,1,argument0,argument1,w,h); ret = true; }
Podmínka může vypadat složitě, ale v principu je to velice jednoduché.
Kontrolujeme, zda jsou x a y souřadnice
větší, než levý horní roh tlačítka a zároveň menší
než pravý dolní roh tlačítka.
draw_sprite_stretched
vykreslí sprite s určitou výškou a
šířkou, a pokud je podmínka splněna, nastaví ret na true.
else { draw_sprite_stretched(argument2,0,argument0,argument1,w,h); ret = false; }
Pokud podmínka splněna není, vykreslíme sprite s prvním snímkem a ret nastavíme na false.
return ret;
Tento řádek nám vrátí ret jako návratovou hodnotu, což je jediný důvod, proč tu je.
Tímto je náš skript hotový, nyní vypadá takto
///scrButton(x,y,spr,scl) ret = false; h = (sprite_get_height(argument2) * argument3); w = (sprite_get_width(argument2) * argument3); if (mouse_x > argument0 && mouse_y > argument1 && mouse_x < (argument0 + w) && mouse_y < (argument1 + h)) { draw_sprite_stretched(argument2,1,argument0,argument1,w,h); ret = true; } else { draw_sprite_stretched(argument2,0,argument0,argument1,w,h); ret = false; } return ret;
Objekt
Nyní se přesuneme do oButtons, kde budeme mít naprogramovaná naše tlačítka. Bude to na dva způsoby. V prvním bude tlačítko stát na místě, mezitím co v druhém bude vyvoláno kliknutím pravého tlačítka myši.
Statické tlačítko
--Create Event-- hover = false;
Proměnná hover nám říká, zda je myš na tlačítku. Bude se rovnat návratové hodnotě našeho tlačítka (scrButton).
--Draw Event-- hover = scrButton(100,100,sButt1a,2);
Pomocí našeho skriptu vykreslíme tlačítko a návratovou hodnotu uložíme do proměnné hover.
Pozn.: Funkce fungují, i když jsou použity jako hodnota nebo podmínka. V podmínce by to fungovalo také a skript je v podstatě námi vytvořená funkce.
--Step Event-- if (hover == true && mouse_check_button(mb_left)) { // činnost tlačítka, pro ukázku zvedneme skóre score = score++; }
Zde reagujeme na zmáčknutí tlačítka a podmínka kontroluje, zda je myš na tlačítku a zároveň je stisknuto levé tlačítko myši. V bloku této podmínky může být takřka cokoli, co se má vykonat při stisku tlačítka, pro ukázku jsme zvedli skóre o 1.
PopUp (vyskakovací) tlačítko
Toto tlačítko je zobrazeno, pokud hráč klikne pravým tlačítkem kamkoli a opět schováno pokud klikne jinam, než na tlačítko, z čehož plyne, že bude o něco složitější.
--Create Event-- hover = false mX = 0 mY = 0 sel = false
Proměnná hover nám říká, zda je myš na tlačítku. Bude se rovnat návratové hodnotě našeho tlačítka (scrButton). Proměnné mX a mY jsou souřadnice vyskakovacího tlačítka. Proměnná sel určuje, zda je tlačítko zobrazeno (sel je zkratka „selected“, eng. vybráno).
--Step Event-- if (mouse_check_button_pressed(mb_right)) // Blok1 { sel = true; mX = mouse_x; mY = mouse_y; } if (mouse_check_button_pressed(mb_left) && hover = false) // Blok2 { sel = false; } if (hover == true && mouse_check_button(mb_left)) // Blok3 { score = score++; }
Blok1 kontroluje, zda bylo zmáčknuto pravé tlačítko. Pokud ano, je proměnná sel nastavena na true a poměnné mX a mY jsou nastaveny na souřadnice myši. V Bloku2 si hlídáme, zda hráč klikl jinam než na tlačítko, v tom případě tlačítko zavřeme. Blok3 zajišťuje samotnou interakci, opět jsme použili příklad se zvednutím skóre (ovšem stejně jako u statického tlačítka zde může být cokoli co tlačítko vykonává).
--Draw Event-- if (sel == true) { hover = scrButton(mX,mY,sButton,2); }
Pokud je proměnná sel nastavena na true, je tlačítko aktivní a vykreslováno. Návratovou hodnotu opět ukládáme do proměnné hover, protože s ní pracujeme v Step Eventu. Tlačítko vykreslujeme na mX a mY, protože kdybychom zadali přímo souřadnice myši, tlačítko by myš následovalo, což ale my nechceme.
Gratuluji. Právě jste se naučily, jak používat tlačítka v Game Makeru, aniž byste dělali nějaká zvěrstva (jako například objekt pro každé tlačítko). S trochou kreativity to můžete dotáhnout ještě dál a udělat na tomto základě třeba check box nebo slider. Osobně doufám, že jsem vás dnes naučil něco užitečného.
DrMrkev se se všemi loučí a přeje vám krásný zbytek dne.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 23x (2.11 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker