Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

10. diel - Pohyb v GML časť 4.

Dnešný diel TBA je tematicky zameraný na zmenu dynamiky pohybu. Ak ste skúšali vytvoriť v Game Makeru hry ktorých hlavným princípom bol pohyb, mohli ste naraziť na problém, ako ovládať rýchlosť pohybu objektov a mať ju pod kontrolou aj v prípade, že sa priebežne všelijako mení. Ak chcete mať napr. Elegantný pohyb nepriateľov, môže sa hodiť pár princípov, ako si systém ich pohybu zbytočne nekomplikovať a pritom mať pohyb presne taký, aký zodpovedá zámeru.

Trenie

friction - Game maker - základy a ikonky

Jedna zásadná a úžasne jednoduchá vec je trenie (friction). Funguje jednoducho ako v ikonách SetFriction, tak v GML ako premenná friction. Ide o hodnotu o ktorú bude každým Step znížená rýchlosť akéhokoľvek pohybu vytvoreného vstavanými pohybovými funkciami. Či už sa vám napr. Lopta pohybuje ktorýmkoľvek smerom, ak použijete trenie, tak sa po chvíli sám zastaví a bude stáť, kým do neho zas niekto nekopne a rýchlosť mu nedodá. Pôsobí to veľmi realisticky a určite to používajte, kde môžete.

Typické hodnoty sú niečo ako 0.01 a podobne. Vysoké hodnoty zastaví pohyb skôr, než vôbec začne. Je potrebné si uvedomiť, že sa rýchlosť zníži naozaj každým stepi a bežná rýchlosť pohybu býva menšia ako desať. Pri rýchlosti 10 a trenie 1, by lopta zastavil za desať stepu. Čo pri room_speed 30, ktorá sa bežne používa, znamená, že úplné zastavenie bude trvať len tretinu sekundy. Ak budete robiť pohyb pomocou vlastných funkcií, meniť ručne x, y alebo pohyb vytvoríte animácií, budete musieť trenie nahradiť tiež. Napr. ak pohyb realizuje animácie (objekt sa nehýbe, ale mení sa obrázok, čiže snímky v jeho sprite), určuje rýchlosť pohybu premenná image_speed. Keď budete image_speed znižovať o hodnotu friction, bude efekt rovnaký ako keby išlo o bežný pohyb pomocou ikon alebo pomocou nastavenia hspeed.

V ukážke nazvanej Náhrada Friction v animácii to môžete vidieť hotové tak, ako som to naklikal za pár minút vrátane primitívne animácie. Animácia je síce naozaj hrozná a je to len rýchla náhrada skutočného pohybu, ale ako princíp postačí. Má iba dva obrázky, ktoré sa mení počas posunu vpred, čo robí pohyb dosť trhaný. Ak budete pohyb animácie plynulo zastavovať alebo zrýchľovať, musí mať vaše animácie naopak čo najväčší počet snímok. Keď už spomínam zrýchľovaní, tak ak nastavíte friction ako záporné, bude sa naopak zrýchľovať. Je to celkom jasné - GM nerieši, akú hodnotu do friction dáte a jednoducho ju odpočíta. Odčítanie záporné hodnoty je to isté čo pripísanie kladné. Nezabúdajte na obmedzenie maximálnej hodnoty, inak časom budú objekty tak rýchle, že nebude ľahké spoznať, čo sa vlastne deje.

Priama zmena hodnôt

Je jasné, že pri pohybe tvorenom neustálym nastavovaním súradníc x, y nebude klasické trenie fungovať (priama zmena súradníc obchádza vstavané pohybové mechanizmy) a musí sa na to inak. Základom je systém viac premenných. Napr. pohyb doprava by sme riešili vo Stepu ako

x+=1;

kde číslo 1 reprezentuje rýchlosť.

Keď napíšeme:

x+=s;
s+=1;

pôjde už o zrýchlení. A rovnako tak aj zrýchlenie sa môže meniť. Takže niečo ako zvyšovanie zrýchlenie:

x+=s; s+=z; z+=1;

z = 1,2,3,4,5,6, ...
s = 1,3,6,10, ...
x = 1,4,10,20, ...

Na začiatku to vyzerá väčšinou ako najľahší spôsob, ale môže ľahko dôjsť na pomerne zložitú matematiku z oblasti diferenciálneho počtu a každopádne sa asi zapotíte pri písaní a počítaní, ak nepôjde práve o tento najjednoduchší prípad s celými číslami. Ako základ si môžete preštudovať ukážku nazvanú Lietadlo, kde si dôkladne preštudujte správanie lietadla.

Game maker - základy a ikonky

Zrýchľovací a brzdiaci účinok je definovaný číselne priamo v kóde (0.01 zrýchlenie a 0.05 spomalenie) v udalosti Step. Nájdite je, zmeňte ich a sledujte, čo to urobí. Všimnite si, že keď do objektu pridáte klasickej friction, nebude sa nijako prejavovať. Ukážka mimochodom obsahuje slušný sprite miniatúrneho lietadla, ktorý môžete použiť aj vo vašich hrách. Keď sa potom zmienite v credits o inšpirácii týmto seriálom, budem rád, ale nie je to podmienkou.

Sinus

V ukážke s priamym nastavením je spomalenie a zrýchlenie konštantné, teda nemenné. Čo keď ale chceme, aby sa zrýchlenie menilo? K plynulému spomalenie alebo zrýchlenie je možné výhodne použiť jednu z najznámejších a tiež pre hry jednu z najužitočnejších matematických funkcií, a to je práve sinus. Grafom funkcie sínus je vlnovka, z ktorej keď si vyberieme správny kúsok, dostaneme krásny plynulý nábeh. Vhodné hodnotami medzi - (π / 2) a (π / 2), ale je možné použiť aj inú časť, pretože sínus sa pozdĺž osi x neustále dookola opakuje. Game Maker má konštantu π predpripravené a preto možno kdekoľvek v kóde písať rovno pi / 2.

Game maker - základy a ikonky

Ako vidno z grafu, môžeme si vybrať tú časť, ktorá sa nám hodí. Ak potrebujeme, aby nárast bol na začiatku prudký a postupne slabol, použijeme časť od nuly do + π / 2. Ak potrebujeme začínať s pomalou zmenou a postupne vplyv silnieť, použijeme časť od -π / 2 do nuly. Aby hodnoty neboli záporné stačí k výsledku pripočítať jedna a deliť dvomi. Tým bude výsledok vždy v rozsahu 0 až 1.

Možno to vyzerá zložito, ale keď sa pozriete na kód ukážky Dynamika pomocou funkcie sínus, uvidíte, že ide o jeden riadok výpočtu a autá zrýchľujú a spomaľujú úplne plynulo. Všimnite si, že som použil absolútnu hodnotu funkcie sínus (abs (sin (t)), čím som sa zbavil záporných hodnôt iným spôsobom. Ako som už spomenul, funkcia sínus sa pozdĺž osi x donekonečna opakuje, takže možno použiť parameter rastúce stále vpred.

S funkciou sinus určite experimentujte dlho a dôkladne. Je to zaujímavá funkcia použiteľná k realistickému pohybu a ešte o nej bude reč v ďalších dieloch.

Plná kontrola nad dynamikou

Pre tých, ktorí sa neboja GML kódu, tu mám pripravenú lahôdku. Vytvoril som editor dynamiky, v ktorom je možné voľne editovať krivku dynamického priebehu ako sa komu zapáči. Editor exportuje GML skript do schránky Windows (clipboard), takže stačí vo vašej hre založiť nový skript v resources, do neho dať vložiť (Ctrl + V) a máte hotový špeciálny ovládač dynamiky použiteľný pre akýkoľvek pohyb, vrátane animácie. Vstupom je číslo v rozsahu, ktorý nastavíte pri editácii a skript je vlastne funkcia vracajúci hodnoty z grafu, ktorý ste pri editácii vytvorili.

Game maker - základy a ikonky

Číselné hodnoty nastavujete pravú myšou, ľavá funguje pre ťahanie. Pod klávesom F1 sa skrýva malý tutoriál, ktorý opisuje ukážkové použitie editora aj výsledného skriptu. Priložená je hotová ukážka jednoduchého zastavenie auta aké opisuje tutoriál. Skript generovaný editorom si vytvára cestu (path) s náhodne zvoleným názvom, takže aj keď použijete niekoľko rôznych generovaných skriptov, nemal by vznikať problém so zhodou názvu krivky. Keby došlo k vygenerovaniu rovnakého názvu, možno ho ručne zmeniť v editore v položke označenej path. Samozrejme, ak sa na to cítite, môžete exportovaný skript akokoľvek upravovať aj mimo editor ručne. Hodnoty parametra menšia ako rozsah dávajú nastavenej Minimum a hodnoty parametra väčšie ako rozsah, dávajú nastavenej Maximum, takže sa pri použití skriptu nemusíte príliš báť, že prekročíte hranice stanovené grafom. V editore funguje Save (F5) a Load (F6). V zipsu je pribalený save, ktorý obsahuje krivku popisovanú v tutoriálu.

Použitie editora dynamiky nie je obmedzené nutne len na klasický pohyb. Úspešne som ho otestoval aj pri zmene rýchlosti priebehu animácie. Renderované roztrieštenie planétky s 360T zábery som zmenil tak, aby sa najprv časti rozprskla rýchlo, ale ich let potom trval dlhšie. Bolo to niečo podobné ako sa robí vo filmoch pre zdôraznenie efektu výbuchu. Pôvodne som myslel, že to sem priložím, ale malo to 89MB v zazipované forme a to by sa asi nechcelo hneď každému sťahovať. Každopádne princíp je jasný. Namiesto rýchlosti alebo polohy objektu sa mení image_speed alebo priamo image_index. Ak budete robiť posúvajúce titulky, ktoré na konci zastavujú, myslím, že editor dynamiky by to mohol elegantne vyriešiť. Hlavnou výhodou je, že keď výsledok nevyzerá na prvýkrát hneď dobre, nie je nič jednoduchšie, než trochu poťahom v editore krivku a behom pár sekúnd máte novú opravenú verziu.

To by tak bolo k dynamike pohybu asi všetko. Keby niečo nebolo jasné, nebojte sa opýtať v komentároch pod článkom. Prípadne keby sa v editore objavili nejaké fatálne ERROR, všetko hláste sem. (Pri páde prezrite game_errors.log a dajte vedieť) Keď budete chcieť editor šíriť na svojich stránkach, dávajte len link na stiahnutie z ITnetwork, aby bol prehľad o počte stiahnutí. Podľa počtu užívateľov budem totiž prispôsobovať svoj čas venovaný supportu. Dynamicky. :-)


 

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é 152x (6.25 MB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker

 

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