IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

9. diel - Pohyb v GML časť 3.

V minulých dieloch sme riešili, ako zariadiť, aby sa objekty pohybovali presne tam, kam chceme buď rovno alebo po vopred definovanej dráhe. To je síce pekné, ale často sa pri tvorbe hier stáva, že vopred nevieme, kam alebo kadiaľ sa majú objekty pohybovať. Sú to typicky prípady, keď je pohyb určený polohou iných objektov, ktorých výskyt ovplyvňuje hráč alebo náhoda. Napr. v hre Pac-Man príšerky nemajú pevnú dráhu, ale podľa určitých pravidiel si ešte len hľadajú v bludisku. Alebo ak chceme vytvoriť simulátor biliardu, bude pohyb ovplyvňovaný úderom hráča a nemôžeme ho teda vopred nijako nastaviť.

Vektory

V prípade, že je pohyb definovaný ako súčet viac vplyvov, je výhodné použiť jednoduché vstavané vektorové sčítanie. Tí, čo poznajú len základy matematiky možno nevie, čo to taký vektor je. Takže stručne zhrniem, čo možno nejednodušeji: všeobecne ide o dvojicu čísel spojených jedným významom, tu konkrétne smer a rýchlosť. Ako sa číslom určí rýchlosť si nie je ťažké predstaviť. Vyššie číslo - vyššiu rýchlosť. U smere je to zložitejšie. Predstavme si kružnici okolo objektu. Rozdelíme ju na dieliky tak, že začneme sprava nulou. Štvrť otáčky bude mať 90 dielikov (stupňov). Celá otáčka bude mať 360 dielikov a 720 budú dve otáčky dokola. Smer teda v Game Makeru určuje číslo od nuly do 359 tak, ako znázorňuje táto kružnice:

Direction v game maker - Game maker - základy a ikonky

V Game Makeru je vektor pohybu napevno spojený s objektom. Jeden objekt - jeden vektor. Každý objekt má svoje vstavané parametre speed a direction, ktoré dohromady určujú vektor pohybu. Ak použijete nejakú pohybovú funkciu alebo ikonu, v skutočnosti meníte tento vektor.

Hm, a čo s tým?

V prvom rade možno vektor pohybu pevne určiť. Buď zmenou jednotlivých vlastností alebo použitím funkcie motion_set (dir, speed).

Tento kód:

//nahoru
direction=90;
speed=1;

/*              je totéž jako:                            */
//nahoru
motion_set(90,1);

/*              a výsledek je stejný jako např.:         */
vspeed=-1;  //přímá změna další vestavěné proměnné - vertical speed

Zapamätajte si, že direction + = 180 spôsobí obrátenie smeru pohybu či už bol pôvodne kamkoľvek.

Zatiaľ to vyzerá celkom jednoducho, aj keď sa časti vektora (smer, rýchlosť) mení samostatne. Akú má teda výhodu ich spojenie? Skúste si predstaviť, čo sa stane, keď budeme sčítať dva smery. Keď sčítame napr. Pohyb nahor (90) rýchlosťou 1 s pohybom doľava (180) o rovnakej rýchlosti, dostaneme 270, čo je pohyb dole o rýchlosti 2. To ale vôbec nezodpovedá fyzikálne realite. Tak sa to robiť nedá. Preto má Game Maker funkciu, ktorá to urobí za nás: motion_add (dir, speed). napr:

motion_add(90,1); //přičte ke stávajícímu pohybu ještě pohyb vzhůru.

Jednoduché, fyzikálno korektné a bez matematických vzorcov.

Vyskúšajte si ukážku Vectors - pôsobenie viac vektorov naraz

Ťahaním ľavej myši zo stredu objektov určíte vektormi a po stlačení SPACE sa objekt začne pohybovať podľa súčtu týchto vektorov. Rýchlosť zodpovedá dĺžke vektora. Vektory sa započítajú do pohybu len raz a to bezprostredne po stlačení SPACE. Nový stisk SPACE zastaví pohyb a umožní nové nastavenie. Pravú myšou zmažete vektory pre daný objekt.

Kedy vektory použiť?

Na začiatku tvorby hry si dobre rozmyslite, či budete pohyb riešiť pomocou vektorov a prečo. Uvedomte si, že ak meníte súradnice x a y priamo, nebudú vstavané funkcie vedieť, že sa objekt vôbec pohybuje a zmena pomocou motion_add nebude robiť čo má. Ďalej je prakticky nemožné zabezpečiť dôveryhodnú zrážku viac objektov, keď s ich vektormi pohybu zároveň práve manipulujete napr. Vďaka klávesnicové udalosti. Naopak sú vektory perfektné pre ozvláštnenie pohybu nepriateľov alebo prekážok.

Pohyb vymedzený prekážkami (2D bludisko) a prenasledovanie iného objektu

Tu je potrebné pochopiť, že hľadanie cesty v bludisku je matematicky zložitá vec a že úlohy na prvý pohľad jednoduché pre človeka sa počítači vysvetlí len veľmi ťažko. Cesta von z bludiska nemusí vôbec existovať alebo ich naopak môže existovať viac. Game Maker má funkcie, ktoré uľahčujú základnú prácu s hľadaním cesty medzi prekážkami.

Motion Planning - plánovanie pohybu

Nutnosťou je, aby objekty mali svoj sprite, ktorý musí obsahovať rozumne nastavenú masku (časti obrázku, kde maska nie je, sú ignorované - nemožno na ne kliknúť, nemožno zistiť náraz do iného objektu a neberú sa do úvahy pre hľadanie cesty). Tvorbu správne masky pre sprite si môžete vyskúšať na priloženej ukážke Maska pre Sprite. Voľba precise sa snaží urobiť masku automaticky podľa alfa kanálu - transparentnosti. Ovplyvniť sa to dá pomocou alpha tolerancie posuvníka. Často je ale výhodnejšie nastaviť masku ručne niektorým z bežných tvarov kruh, obdĺžnik, atď. Alebo jednoducho plný celý sprite. Voľba separate collision mask umožní mať rôzne masky pre každú snímku animovaného sprite.

Masky sprites v game maker - Game maker - základy a ikonky

Objekty slúžiace ako prekážky by mali mať zapnutú vlastnosť solid, ktorá slúži práve na ten účel. Ako solid môže byť nastavený aj vlastnú cestu hľadajúcich objekt - má zmysel, keď sa potrebuje vyhýbať tiež inštanciám seba samého.

Rovno k cieľu

Keď máme všetko pripravené (objekt, prekážky, sprite s maskou), môžeme priamo použiť niektorú z nasledujúcich funkcií a objekt sa priamo začne pohybovať (dajte ich do eventu Step):

mp_linear_step(x,y,stepsize,checkall)
mp_linear_step_object(x,y,stepsize,obj)
mp_potential_step(x,y,stepsize,checkall)
mp_potential_step_object(x,y,stepsize,obj)

(Fungujú podobne ako ikona Step Avoiding - urobia kúsok pohybu v danom smere a vyhnú sa prekážkam)

Vždy určujete súradnice cieľa x a y, stepsize udáva veľkosť posunu behom jedného priebehu funkcie (teda väčšinou 1x za udalosť Step) a checkall možno mať true pre porovnanie so všetkými objekty (pomalé) alebo false pre porovnanie iba s tými, ktoré majú nastavené Solid. Variant obsahujúce obj porovnáva ako prekážku len jediný typ objektu. Celý systém sa ešte riadi nastavením:

mp_potential_settings(maxrot,rotstep,ahead,onspot)

To však môžete voľne ignorovať, pretože základné hodnoty bývajú väčšinou v poriadku. Objekt vždy skúsi priamu cestu a potom sa skúša pootočiť po rotstep krokoch až po maxrot alebo do nájdenie cesty. Ahead hovorí, ako ďaleko sa objekt pozerá pred seba, či tam nie je prekážka. Malý ahead jazdí okolo prekážok veľmi tesne. Onspot (true / false) určuje či sa objekt smie točiť aj na mieste alebo sa musí točiť vždy iba s pohybom vpred (cca ako auto).

K cieľu chceme mieriť krivkou (vyžaduje GM Pro)

Nasledujúca skupina funkcií pracuje rovnako ako tie predchádzajúce, len jej výsledkom nie je priamo pohyb, ale cesta - path. Túto cestu musíme mať prázdnu vopred vytvorenú v resources (create path).

mp_linear_path(path,xg,yg,stepsize,checkall)
mp_linear_path_object(path,xg,yg,stepsize,obj)
mp_potential_path(path,xg,yg,stepsize,factor,checkall)
mp_potential_path_object(path,xg,yg,stepsize,factor,obj)

Aby sa objekt začal skutočne pohybovať, musí sa vytvorená cesta k pohybu použiť pomocou:

path_start(path,speed,endaction,absolute);

(Musí byť použitá rovnaká cesta ako vo funkciách pre motion planning)

V priloženej ukážke Labyrint Motion Planning

je ako cieľ použitý pohybujúci sa objekt. Vykresľujú sa pritom pohybové cesty tak, ako sú postupne vypočítavané a to aj v prípade, že sa nepodarilo nájsť cestu priamo k cieľu. Všimnite si, že ak je objekt follower pomalší v pohybe ako objekt runner, akokoľvek dobre nájdená cesta mu nepomôže. Rýchlosť meníte tlačidlami po strane. Princíp prepínače (radio button) má mnoho použitie, takže si ho prezrite a iste budete schopní používať ho aj vo svojich programoch.

Sieť prekážok - úplne odlišný spôsob

Najpokročilejší systém priechodu bludiskom aký GM ponúka, je mp_grid. Pomocou funkcie mp_grid_create sa založí sieť štvorcov čiže buniek - cells. Čím bude počet buniek vyššia, tým presnejší bude aj výpočet (ale aj pomalšie). Funkcia mp_grid_add_in­stances vie označiť časti siete ako nepriechodné tým, že sieť porovná s polohou inštancií objektov. Výhodou je, že prekážky možno pripraviť do siete pred začiatkom akéhokoľvek pohybu. Samotné použitie sa robí pomocou funkcie:

mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag)

Významný rozdiel oproti funkciám z predchádzajúcej sady je ten, že sa nerieši sprite objektu a priechod sa počíta ako jednopixelové cesta z bodu xstart, ystart do xgoal, ygoal. Výsledok sa opäť premietne do obsahu cesty path. Parameter allowdiag povoľuje alebo zakazuje pohyb šikmo v sieti.

Ukážka siete

V priloženej ukážke je dobre vidieť ako to funguje, keď stlačíte Shift - zobrazí sa mapa s oblasťami možného priechodu. (vykresľovanie mapy je pomalé a je určené je pre testovanie) Klikaním môžete pokladať do bludiska objekty food, ku ktorým sa hlavný objekt bude snažiť nájsť cestu. Ako cieľ sa berie vždy najbližší (vzdušnou čiarou) a je teda logické, že sa niekedy stane, že dva alebo viac sú rovnako ďaleko. V ukážke je to riešené obchvatom - interval zisťovanie nových vzdialeností je náhodný. Môžete skúsiť prerobiť ukážku na zisťovanie vzdialeností podľa dĺžky cesty a overenie robiť až vtedy, keď hlavný objekt nájde pôvodný cieľ.

Ak ovládnete všetky funkcie uvedené v tomto článku, môžete sa stať majstrami bludísk.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 183x (4.8 MB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker

 

Predchádzajúci článok
Pohyb v GML časť 2.
Všetky články v sekcii
Game maker - základy a ikonky
Preskočiť článok
(neodporúčame)
Pohyb v GML časť 4.
Článok pre vás napísal TomBen
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
-
Aktivity