Game Maker jednoduše #2 – Fyzika vodní hladiny

Notice: This article was moved from our old webpage and was not translated. We decided to move them here because they were quite popular and it would be a shame to delete them.

Co si představit pod pojmem “fyzika vodní hladiny”?

Vytvoříme si systém který bude simulovat vlnění na vodní hladině. Pohyb vln, jejich sčítání a odrazy, postupné ztráty energie až do uplného zmizení. Protože jsme jen ve 2D prostoru, nebudeme potřebovat ani žádné složité rovnice. Použijeme něco jako částice. Vytvoříme si pár polí, ve kterých budou uložená základní data o částicích. každá ta částice vlastně představuje určitou dávku energie. Ta se sečte a podle výsledné energie se vykreslí vlna o určité velikosti.

Create event

Tentokrát si vystačíme s několika proměnnými a použijeme jednu funkci. Na tento systém si vytvořím objekt. Jeho název je tentokrát celku volný. Můj se jmenuje oWater. Pro určení pozice použijeme klasické gamemakerovské x a y, které má každý objekt. Doplníme to vlastní proměnnou width a height které nám určí obdélník, který bude vyplněn vodou.

Proměnné jsou popsány v komentářích. Budu se spíše věnovat cyklům na konci: Když je vlna na určité pozici, neovlivňuje pouze jeden bod. Ovlivňuje body do vzdálenosti podle proměnné wSpread. A aby vlna nedělala na hladině obdélníky, musí hodnota od její absolutní hodnoty plynule klesat. Proto je zde použita funkce kosinus. Tyto hodnoty si uložíme do pole spread, protože budou za jeden step potřeba mnohokrát a funkce kosinus není z nejrychlejších. Velmi podstatně to urychlí celý systém.

buffer bude pole o velikosti podle počtu bodů na hladině (proměnná points). Na začátku stepu ho vždy vynulujeme, poté se projdou všechny vlny a každá do tohoto pole přičte hodnoty podle své energie. V eventu draw se podle tohoto pole spočítaného ve stepu bude hladina vykreslovat.

Scripty

Budeme potřebovat funkci na mazání vln, která je odstraní z polí. Bohužel, GM nic takového neumí a budeme muset trochu improvizovat. Takže musíme hodnoty pole přeházet a odečíst z proměných tak, aby to fungovalo jako náhrada mazání. Funkci si pojmenujeme delete:

Funkce má pouze jeden argument a to id. Určí, kterou pozici z polí vymazat.

Další funkce, co bude za potřebí, bude přidávat vlny do polí. Pojmenujeme si ji mkwave:

x – pozice X na které se má vlna vytvořit (udává pozici v bodech hladiny, ne v grafických pixelech)

energy – energie vlny: jak moc bude vlna vychylovat hladinu

fading – kolik energie má vlně za step zmizet (nulová hodnota určí, že bude vlna na hladině do nekonečna)

speed . jak rychle má vlna po hladině cestovat (opět v bodech hladiny za step, ne v grafických pixelech)

Step event

Nyní potřebujeme script, který nám přepočítá všechny částice. Půjdeme částici po částici a přičteme k ní její rychlost. Pokud narazí na okraj, buď se částice odrazí, nebo se smaže. V závislosti na nastavení v create (proměnná reflect). Vlně se odečte příslušné množství energie a pokud dosáhne nulové energie, vlna se smaže. Nakonec se energie vlny přičte do pole buffer a tím už bude vlna ovlivňovat hladinu.

Vykreslení

Použijeme funkce draw_primitive_. Ke každému bodu máme už ze stepu spočítanou hodnotu energie, takže stačí projít bod po bodu a vykreslit.

Tvorba vln

Pro tvorbu vln musíme znát, na kterém bodu v arrayi je chceme vytvořit. To se dá spočítat podle proměnných, které jsme definovali v create. Vyrobíme si na zkoušku funkčnosti systému jednoduchý tvořič vln. Když klikneme myší, vytvoří se vlny na pozici X myši.

Tento script si spočítá pozici a pak vytvoří 4 částice. 2 z nich jsou hlavní vlny, kdy jedna jde doprava, druhá doleva a za nimi jdou další 2 vlny se zápornou energií. Díky tomu na hladině tvoří oblouk dolů. Není uplně od věci si na tvorbu částic vytvořit funkci (script). Ve hře se to pak hodí pro tvorbu vln, když třeba hráč spadne do vody…

GMK ke stažení

http://products.sunkenbridge.com/?app=download&id=7

Share on FacebookTweet about this on TwitterShare on Google+Share on Tumblr

Comments (0)