10. díl - Pohyb v GML část 4.

Ostatní jazyky GameMaker Základy Pohyb v GML část 4.

Dnešní díl TBA je tématicky zaměřen na změnu dynamiky pohybu. Pokud jste zkoušeli vytvořit v Game Makeru hry jejichž hlavním principem byl pohyb, mohli jste narazit na problém, jak ovládat rychlost pohybu objektů a mít ji pod kontrolou i v případě, že se průběžně všelijak mění. Chcete-li mít např. elegantní pohyb nepřátel, může se hodit pár principů, jak si systém jejich pohybu zbytečně nekomplikovat a přitom mít pohyb přesně takový, jaký odpovídá záměru.

Tření

friction
Jedna zásadní a úžasně jednoduchá věc je tření (friction). Funguje snadno jak v ikonách SetFriction, tak v gml jako proměnná friction. Jde o hodnotu o kterou bude každým Stepem snížena rychlost jakéhokoli pohybu vytvořeného vestavěnými pohybovými funkcemi. Ať už se vám např. míč pohybuje kterýmkoli směrem, použijete-li tření, tak se po chvíli sám zastaví a bude stát, dokud do něj zas někdo nekopne a rychlost mu nedodá. Působí to velice realisticky a určitě to používejte, kde můžete.

Typické hodnoty jsou něco jako 0.01 a podobně. Vysoké hodnoty zastaví pohyb dřív, než vůbec začne. Je třeba si uvědomit, že se rychlost sníží opravdu každým Stepem a běžná rychlost pohybu bývá menší než deset. Při rychlosti 10 a tření 1, by míč zastavil za deset Stepů. Což při room_speed 30, která se běžně používá, znamená, že úplné zastavení bude trvat pouze třetinu vteřiny. Pokud budete dělat pohyb pomocí vlastních funkcí, měnit ručně x,y nebo pohyb vytvoříte animací, budete muset tření nahradit také. Např. pokud pohyb realizuje animace (objekt se nehýbe, ale mění se obrázek, čili snímky v jeho sprite), určuje rychlost pohybu proměnná image_speed. Když budete image_speed snižovat o hodnotu friction, bude efekt stejný jako kdyby šlo o běžný pohyb pomocí ikon nebo pomocí nastavení hspeed.

V ukázce nazvané Náhrada Friction v animaci to můžete vidět hotové tak, jak jsem to naklikal za pár minut včetně primitivní animace. Animace je sice opravdu hrozná a je to jen rychlá náhrada skutečného pohybu, ale jako princip postačí. Má pouze dva obrázky, které se mění během posunu vpřed, což dělá pohyb dost trhaný. Pokud budete pohyb animace plynule zastavovat nebo zrychlovat, musí mít vaše animace naopak co největší počet snímků. Když už zmiňuji zrychlování, tak pokud nastavíte friction jako záporné, bude se naopak zrychlovat. Je to celkem jasné – GM neřeší, jakou hodnotu do friction dáte a prostě ji odečte. Odečtení záporné hodnoty je totéž co přičtení kladné. Nezapomínejte na omezení maximální hodnoty, jinak časem budou objekty tak rychlé, že nebude snadné poznat, co se vlastně děje.

Přímá změna hodnot

Je jasné, že při pohybu tvořeném neustálým nastavováním souřadnic x,y nebude klasické tření fungovat (přímá změna souřadnic obchází vestavěné pohybové mechanismy) a musí se na to jinak. Základem je systém více proměnných. Např. pohyb doprava bychom řešili ve Stepu jako

x+=1;

kde číslo 1 reprezentuje rychlost.

Když napíšeme:

x+=s;
s+=1;

půjde už o zrychlení. A stejně tak i zrychlení se může měnit. Takže něco jako zvyšování zrychlení:

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čátku to vypadá většinou jako nejsnazší způsob, ale může snadno dojít na poměrně složitou matematiku z oblasti diferenciálního počtu a každopádně se asi zapotíte při psaní a počítání, pokud nepůjde právě o tento nejjednodušší případ s celými čísly. Jako základ si můžete prostudovat ukázku nazvanou Letoun, kde si důkladně prostudujte chování letadla.

Zrychlovací a brzdící účinek je definován číselně přímo v kódu (0.01 zrychlení a 0.05 zpomalení) v události Step. Najděte je, změňte je a sledujte, co to udělá. Všimněte si, že když do objektu přidáte klasické friction, nebude se nijak projevovat. Ukázka mimochodem obsahuje slušný sprite miniaturního letounu, který můžete použít i ve vašich hrách. Když se pak zmíníte v credits o inspiraci tímto seriálem, budu rád, ale není to podmínkou.

Sinus

V ukázce s přímým nastavením je zpomalení a zrychlení konstantní, tedy neměnné. Co když ale chceme, aby se zrychlení měnilo? K plynulému zpomalení nebo zrychlení lze výhodně použít jednu z nejznámějších a také pro hry jednu z nejužitečnějších matematických funkcí, a to je právě sinus. Grafem funkce sinus je vlnovka, ze které když si vybereme správný kousek, dostaneme krásný plynulý náběh. Vhodné hodnoty leží mezi –(π/2) a (π/2), ale je možné použít i jinou část, protože sinus se podél osy x neustále dokola opakuje. Game Maker má konstantu π předpřipravenu a proto lze kdekoli v kódu psát rovnou pi/2.

Jak patrné z grafu, můžeme si vybrat tu část, která se nám hodí. Pokud potřebujeme, aby nárůst byl na začátku prudký a postupně slábl, použijeme část od nuly do +π/2. Pokud potřebujeme začínat s pomalou změnou a postupně vliv sílit, použijeme část od -π/2 do nuly. Aby hodnoty nebyly záporné stačí k výsledku přičíst jedna a dělit dvěma. Tím bude výsledek vždy v rozsahu 0 až 1.

Možná to vypadá složitě, ale když se podíváte na kód ukázky Dynamika pomocí funkce sinus, uvidíte, že jde o jeden řádek výpočtu a auta zrychlují a zpomalují zcela plynule. Všimněte si, že jsem použil absolutní hodnotu funkce sinus (abs(sin(t)), čímž jsem se zbavil záporných hodnot jiným způsobem. Jak už jsem zmínil, funkce sinus se podél osy x donekonečna opakuje, takže lze použít parametr rostoucí stále vpřed.

S funkcí sinus určitě experimentujte dlouho a důkladně. Je to zajímavá funkce použitelná k realistickému pohybu a ještě o ní bude řeč v dalších dílech.

Plná kontrola nad dynamikou

Pro ty, kdo se nebojí gml kódu, tady mám připravenu lahůdku. Vytvořil jsem editor dynamiky, ve kterém lze volně editovat křivku dynamického průběhu jak se komu zlíbí. Editor exportuje gml skript do schránky Windows (clipboard), takže stačí ve vaší hře založit nový skript v resources, do něj dát vložit (Ctrl+V ) a máte hotov speciální ovladač dynamiky použitelný pro jakýkoliv pohyb, včetně animace. Vstupem je číslo v rozsahu, který nastavíte při editaci a skript je vlastně funkce vracející hodnoty z grafu, který jste při editaci vytvořili.

Číselné hodnoty nastavujete pravou myší, levá funguje pro tažení. Pod klávesou F1 se skrývá malý tutoriál, který popisuje ukázkové použití editoru i výsledného skriptu. Přiložena je hotová ukázka jednoduchého zastavení auta jaké popisuje tutoriál. Skript generovaný editorem si vytváří cestu (path) s náhodně zvoleným názvem, takže i když použijete několik různých generovaných skriptů, neměl by vznikat problém se shodou názvu křivky. Kdyby došlo k vygenerování stejného názvu, lze ho ručně změnit v editoru v položce označené path. Samozřejmě, pokud se na to cítíte, můžete exportovaný skript jakkoli upravovat i mimo editor ručně. Hodnoty parametru menší než rozsah dávají nastavené Minimum a hodnoty parametru větší než rozsah, dávají nastavené Maximum, takže se při použití skriptu nemusíte příliš bát, že překročíte meze stanovené grafem. V editoru funguje Save (F5) a Load(F6). V zipu je přibalen save, který obsahuje křivku popisovanou v tutoriálu.

Použití editoru dynamiky není omezeno nutně jen na klasický pohyb. Úspěšně jsem ho otestoval i při změně rychlosti průběhu animace. Renderované roztříštění planetky s 360ti snímky jsem změnil tak, aby se nejprve části rozprskly rychle, ale jejich let pak trval déle. Bylo to něco podobného jako se dělá ve filmech pro zdůraznění efektu výbuchu. Původně jsem myslel, že to sem přiložím, ale mělo to 89MB v zazipované formě a to by se asi nechtělo hned každému stahovat. Každopádně princip je jasný. Místo rychlosti nebo polohy objektu se mění image_speed nebo přímo image_index. Pokud budete dělat rolující titulky, které na konci zastavují, myslím, že editor dynamiky by to mohl elegantně vyřešit. Hlavní výhodou je, že když výsledek nevypadá na poprvé hned dobře, není nic snazšího, než trochu potahat v editoru křivku a během pár vteřin máte novou opravenou verzi.

To by tak bylo k dynamice pohybu asi všechno. Kdyby něco nebylo jasné, nebojte se zeptat v komentářích pod článkem. Případně kdyby se v editoru objevily nějaké fatální errory, všechno hlaste sem. (při pádu prohlédněte game_errors.log a dejte vědět) Když budete chtít editor šířit na svých stránkách, dávejte pouze link na stažení z devbooku, aby byl přehled o počtu stažení. Podle počtu uživatelů budu totiž přizpůsobovat svůj čas věnovaný supportu. Dynamicky. :-)


 

Stáhnout

Staženo 129x (6.25 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal TomBen
Avatar
-

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Pohyb v GML část 3.
Miniatura
Všechny články v sekci
GameMaker - základy a ikonky
Miniatura
Následující článek
GameMaker tutorial - 1. Díl

 

 

Komentáře

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.

Zatím nikdo nevložil komentář - buď první!