Lekce 8 - Pohyb v GML část 2.

Pohyb v GML část 2.
Tak jako minulý díl bude i tohle pokračování celé o pohybu. V předešlém díle jsem trochu obešel pohyb definovaný křivkou tak, že jsem použil vestavěné cesty – path. Je to určitě nejsnazší způsob, ale je to jen jedna z mnoha možností. Teď si ukážeme, jak na souřadnice pohybu převést jakoukoli matematickou funkci, kterou si vygooglíme někde na netu.
Výběr funkce
Vyhledáme si na netu nějaké funkce podle jejich podoby – grafu: google search
Když se nám nějaká zalíbí, tak si opíšeme její rovnici. Mě se třeba dost líbí tahle:
y = sin(x)/x
Vybral jsem si celkem dobře, protože jejím základem je funkce sinus,
kterou Game Maker přímo umí počítat. Pokud budete dělat složitější
věci, budete muset funkci upravit tak, aby se skládala jen z věcí, které
GM zná viz
seznam funkcí. Když si nebudete vědět rady, zkuste
hodit dotaz na ITnetwork nebo u velice složitých věcí na nějaké
matematické fórum. PS: matematikům nevykládejte nic o programování, jinak
se vám budou snažit radit i v tom
Úprava vstupních hodnot
Protože funkce dává a bere málokdy hodnoty zrovna o velikosti souřadnic obrazovky, musíme zajistit správné zvětšení nebo zmenšení. Nejprve zjistíme jaká x si funkce žádá, aby vypadala dobře. V tom pomůže např. wolfram alpha, který nakreslí graf a vypíše základní hodnoty. Takže si připravíme rozsahy:
minimum=-40.5; maximum=+40.5; velikost_rozsahu=abs(maximum-minimum);
Řízení pohybu
Uděláme si pomocnou proměnnou t, která bude znamenat fázi pohybu a bude se měnit od 0 do 1 podobně jako to bylo u rovného pohybu v minulém díle.
t=0; //začátek pohybu - lze volně nastavit
Zajistíme zvyšování t o nějakou malou hodnotu. Čím menší krok, tím bude pohyb plynulejší, přesnější, ale taky pomalejší. Takže např.:
t+=krok;
t=frac(t); //když je větší než jedna, tak zas od začátku
Úprava výstupních hodnot
Zjistíme si rozsahy výstupních hodnot z grafu. Když jsou malé, zvětšíme, když jsou velké, zmenšíme. Musí se prostě přiblížit hodnotám souřadnic. Pamatujte si:
zvětšování hodnot = násobení zmenšování hodnot = dělení posun dolů = sčítání posun nahoru = odčítání
Já si pro nastavení rozsahu pomůžu novou proměnnou s.
s=minimum+(t*velikost_rozsahu); if (s==0) s=0.0001; // zabrání dělení nulou
Výpočet
Poslední proměnná j už bude obsahovat vlastní funkci:
j=sin(s)/(s);
Výsledné souřadnice:
x=t*room_width; // x jede plynule zleva doprava y=(room_height/2)-(j*200); // y = f(x) pak je posunuto a zvětšeno
V přiložené ukázce jsou objekty, které se pohybují pomocí výše uvedené funkce a jsou podloženy grafem, takže je dobře vidět, jak se toho přesně drží. Pohyb podle matematické funkce může být ve hrách zajímavý – nepřátelé se k vám nemusí přibližovat hloupě rovně. Lze simulovat pohyby biče nebo tryskající fontány. Samozřejmě se to dá taky využít ve škole při studiu vlastností funkcí. Všimněte si třeba různé „hustoty“ funkce v různých částech.
VOLITELNÝ DODATEK PRO MATEMATICKY ZDATNÉ
Matematická křivka složená z mnoha funkcí - aneb křivka může mít jakýkoli tvar.
čtěte jen na vlastní nebezpečí
Připravil jsem něco jako vyšší dívčí pro matfyzáky a podobné. (ve skutečnosti stačí kvalitní střední technická nebo všeobecná matematika VŠ) Pokud nic takového nejste, můžete si prostě jen pustit exe z přílohy.
O co jde?
Je to výpočet Bézierovy křivky, tj. křivky, která je dána sadou bodů. První a poslední bod je součástí křivky, ostatní body jen křivku do určité míry přitahují k sobě, přibližně jako magnety. Bodů může být libovolně mnoho a lze tak vytvořit křivku libovolného tvaru čistě umisťováním bodů.
Kdo se kouknul na wiki, si teď klepe na čelo, že jsem se pomátl a že začátečníkům vysvětluji věci složitější, než je celý Game Maker. Něco pravdy na tom je, ale berte to především jako ukázku toho, že i tak složitou matematiku lze rozložit na jednoduché elementy, které Game Maker umí. Dělá se to tak, že si definujete funkce vlastní. Jak to vypadá, můžete vidět, když si otevřete ukázku bezier.gmk a podíváte se do složky Scripts. Mám tam definovány tři funkce: factorial, binom a bernstain. Moc je teď nestudujte.
Prakticky užitečná informace je to, že když si např. skript factorial zkopírujete do své hry nebo programu, můžete kdekoli v kódu gml napsat, factorial(číslo) a funkce spočítá faktoriál onoho čísla. PS: faktoriál čísla je součin čísla a všech přirozených čísel nižších než číslo samo až po jedničku.
Např: factorial(5)=5*4*3*2*1, tedy 120.
Detailní princip výpočtu Bézierovy křivky nebudu moc rozvádět - kdo by měl zájem, může mě kontaktovat přes PM. Stručně řečeno se musí s každým bodem spočítat jeho váha a ta rozhoduje, jak moc bude bod křivku přitahovat.
Ukázka se ovládá jednoduše. Křivka se sama automaticky napíná mezi všemi body, které jsou aktuálně v místnosti podle pořadí jejich vzniku. Tažením můžete body přemisťovat, shift+levá myš do volné plochy přidá nový bod na konec křivky a pravá myš existující body smaže. Klidně pusťte ukázku a všechny body odklikejte pryč pravou myší, pak držte shift a naklikejte levou body nové. Koukejte přitom, jak se křivka kroutí podle nových bodů. Když chcete ostrý úhel dejte víc bodů do jednoho místa.
V zipu jsou navíc přiloženy ve formě gmres obě pozadí využitelná pro vykreslení grafů. Vkládájí se pomocí Import Resources z menu. (import vyžaduje plnou verzi GM8.x)
Pokud byl matematický dodatek na vás přeci jen příliš, berte to jako
vzdálený cíl a nenechte se odradit.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 175x (2.44 MB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker