Jak na tlačítka v GameMaker

Ostatní jazyky GameMaker Ostatní 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ženo 11x (2.11 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (2)

Článek pro vás napsal Garrom Orc Shaman
Avatar
Autor se několik let zabýval tvorbě videoher v nástroji GameMaker. Poslední dobou se intenzivně učí používat Unity3D za použití jazyku C#..inu má se ještě hodně co učit.

Jak se ti líbí článek?
Celkem (2 hlasů) :
3.53.53.53.5 3.5


 


Miniatura
Předchozí článek
Atmosféra v GM
Miniatura
Všechny články v sekci
GameMaker - Ostatní

 

 

Komentáře

Avatar
Xan95
Člen
Avatar
Xan95:

V GM už jsem dlouhou dobu nedělal a nemám ho nainstalovaný, proto jsem to pořádně neprojel.

1.) Zdá se mi, že tvůj kód bude fungovat jen pro obdélníková tlačítka. Pro kontrolu myši nad tlačítkem jsem používal tento kód. Měl by být pixel perfect podle masky

if (position_meeting(mouse_x, mouse_y, self)) // myš na objektu
{
        if (mouse_check_button_pressed(mb_left)) // klik na objekt
        {
                //...
        }
}

2.) Máš text tlačítka rovnou ve spritu... Pokud budeš mít 20 stejných tlačítek s různým textem, budeš mít 20 spritů => zabírá to více místa a když budeš chtít změnit styl tlačítka? Ale fuj...
Místo toho udělej jeden sprite bez textu a nech text vykreslovat objektem.

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).

3.) Vůbec si jim nevysvětlil, jak udělat různé akce při kliknutí na tlačítko. Tudíž logicky budou duplikovat objekty... GM tuším nemá delegáty... Dělal jsem to tak, že jsem si vytvořil proměnnou např. "skript_pri_klik­nuti". Při vytvořní instance tlačitka jsem samozřejmě nastavil text a skript a při kliknutí jsem kontroloval, zda skript existuje a pokud ano, tak jsem ho vyvolal.

 
Odpovědět 30. června 12:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.