Game Maker jednoduše #4 – Doplňky plošinové hry

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.

Úvodem

Tento díl plynule navazuje na ten předchozí, kdy jsem popsal tvorbu skákačky. Tentokrát k ní doděláme další doplňky jako blok proskočitelný jen zespodu, výtah, led, zpomalovací blok, nebo lano. Základ skákačky z minula jsem mírně poupravil, protože bude potřeba horizontální rychlost. Vzhledem k tomu, že má být tutoriál pro ty alespoň částečně pokročilejší, dovolím si nezabývat se detaily, pouze stručně popsat změny a pokračovat rychle dál.

Námraza a zpomalovací blok

Námrazou myslíme blok, na kterém hráč klouže. Nemění to jeho rychlost, ale rozebíhá se delší dobu a taktéž brzdí déle. V samotném objektu nebudeme nic programovat, vše bude řešit objekt hráče. Na zpomalovacím bloku půjde hráč poloviční rychlostí a opět vše bude řešit hráč. Objekty si pojmenujeme oIce a oSlow, zaklikneme jim solid, odklepneme visible (terén budeme tvořit tilesety) a máme hotovo.

Lano

Objekt lana bude zase o ničem. Stejně jako předchozí dva objekty nebude mít žádné scriptování. Lano si pojmenujeme oRope, ale narozdíl od námrazy a zpomalovacího bloku, lano nebude solidní.

Polopropustný blok

Bude to blok, který hráč bude moci proskočit zespoda, ale z vrchu na něm bude stát. Vzhledem k tomu, jak je řešený pohyb u hráče nám stačí pouze ovládat vlastnost solid tohoto bloku. V tomto případě je dobré udělat podmínku tak, že je blok solidní ve všech případech a solidní přestane být jen tehdy, má-li hráč negativní vertikální rychlost vSpeed (letí vzhůru), nebo je hráč ještě uvnitř bloku, a nebo když hráč stiskne šipku dolů:

(Tento kód patří do stepu objektu polopropustného bloku.)

Výtah

To nejlepší na konec! Výtah je totiž většinou oříšek pro většinu nováčků – alespoň jejich skákačky to vypovídají.  Přitom to není zas až tak těžké… V první řadě je potřeba nějak ošéfovat pohyb. My ho vyřešíme tak, že se výtah bude pohybovat nahoru a dolu dokud nenarazí na solidní blok. Pokud narazí, změní směr a jede zpátky. Problém nastane, když ale pojedeme na výtahu nahoru a nad námi by byl solidní objekt. Je tedy potřeba vytvořit další objekt, který nebude solidní, na který bude reagovat pouze výtah. Objekt pojmenujeme oStop a když se ho výtah dotkne, pojede zpět. Hráče to však nebude ovlivňovat. V create výtahu si pouze nadefinujeme jeho rychlost.

Co se výtahu týče, bude i nebude solidní. Podobně jako u polopropustného bloku budeme toto ovládat ve stepu výtahu.

Výtah se bude chovat jako solidní pouze když na něj hráč skočí zvrchu. Podobně jako u polopropustného bloku, když hráč stiskne šipku dolů, propadne výtahem k zemi. Nejsem zastáncem nesmyslů jako globalvar, proto jsem využil proměnné argument0 a argument1, které jsou přístupné ve všech objektech. Uložíme si do nich odkaz na výtah (id) a směr pohybu výtahu. Spustíme cyklus, který proběhne tolikrát, kolk má výtah nastavenou rychlost. Ověříme kolize a pokud by výtah narazil na solidní objekt, nebo objekt oStop, převrátíme směr výtahu. Poté pohneme výtahem příslušným směrem. Když by ale na výtahu stál hráč, musíme s ním pohnout také. Proto se přes with vlomíme do kontextu objektu hráče (kód ve with se bude chovat jakoby se spustil přímo v objektu hráče a může používat jeho proměnné). Ověříme, jestli hráč skutečně stojí na výtahu a pokud ano, pohneme i s hráčem.

Create event objektu hráče

V tomto eventu budeme opět definovat vlastnosti systému. Od minula přibyly 2 proměnné: hSpeed a change.

mSpeed – rychlost horiznotálního pohybu

grav – je síla gravitace (něco jako gravity)

jump – je rychlost, jakou hráč vyskočí nahoru

change – velikost zrychlení/zpomalení pohybu (v této verzi hráč plynule zrychluje a zpomaluje)

hSpeed – horizontální rychlost (místo gamemakerového hspeed)

vSpeed – vertikální rychlost (místo gamemakerového vspeed)

vMax – maximální rychlost vSpeed

Step event objektu hráče

Na druhém řádku se vezme proměnná vSpeed a přičte se k ní gravitace grav. Celé je to uzavřené ve funkcích min a max, aby hodnota vSpeed nikdy nepřesáhla hranice maximální vertikální rychlosti vMax. Poté se ověří, jestli zrovna neleze hráč po laně. Pokud ano, omezíme rychlost padání na rychlost horizontálního pohybu, aby hráč nelezl z lana dolů rychlostí volného pádu. Potom se spustí cyklus. Jeho vnitřek proběhne tolikrát, kolik je absolutní hodnota proměnné vSpeed. Vezme se pozice objektu, ověří se, jestli je na pozici o pixel vedle po směru vSpeed místo a pokud je, objekt se tam pohne. Pokud narazí na překážku, vynuluje se vertikální rychlost a cyklus se přeruší (break).

Protože v Game Makeru se true/false chová jako čísla 1/0, lze s nimi i počítat. Proto můžeme od sebe odečíst funkce keyboard_check. Dostaneme tak čísla {-1, 0, 1}. -1 vyjde ve chvíli, kdy hráč drží šipku doleva, +1 vyjde když drží šipku doprava a nula vyjde když nedrží nic, nebo naopak obě tlačítka najednou. Tuto hodnotu vynásobíme proměnnou mSpeed, aby jsme mohli dále již pracovat s rychlostí. Dále ověříme, jestli nestojí hráč na zpomalovacím objektu oSlow. Když stojí, vydělíme rychlost /2. Dále máme proměnnou dcc. Ta udává hodnotu zrychlení a základně má hodnotu proměnné change (viz. create). Když hráč ale klouže na ledě, vydělíme zrychlení /4. Hráč bude na ledě 4× pomaleji zrychlovat i zpomalovat a vznikne tak efekt klouzání. Podle těchto zpočtených hodnot se změní proměnná hSpeed. A tím získáváme vše potřebné pro výsledný pohyb. Spustíme opět cyklus. Jeho vnitřek proběhne tolikrát, kolik je rychlost hSpeed. Vždy zjistím kolizi na pozici o pixel vedle po směru pohybu a pokud je volno, pohnu se tam. Pokud narazím na překážku, přeruším cyklus (break), protože již není potřeba dále hledat volné místo.

Pokud hráč stiskne šipku nahoru, budeme buď skákat, nebo lézt po laně. Ověříme tedy nejdřív kolizi s oRope. V případě, že opravdu hráč šplhá po laně, nastavíme proměnnou vSpeed na převrácenou hodnotu grav. To má za následek, že v dalším stepu se k proměnné vSpeed přičte gravitace a vertikální rychlost vyjde nulová. Tím se na laně zbavíme gravitace. Hráč bude po laně šplhat rychlostí mSpeed. V případě že hráč drží šipku nahoru, ale není na laně, ověříme, jestli stojí na zemi. Pokud ano, vyskočíme. Proměnná s vertikální rychlostí vSpeed se nastaví na převrácenou hodnotu proměnné jump (převrácenou protože pohyb nahoru odpovídá odečítání pozice Y) a tím hráč vyskočí.

náhled z přiloženého GMK

GMK ke stažení

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

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

Comments (0)