Tutoriál na tvorbu skákaček 1 - Pohyb a skok

Ostatní jazyky GameMaker Plošinovky Tutoriál na tvorbu skákaček 1 - Pohyb a skok

(Napsal Mark Overmars - (C) YoYo Games Ltd, pro devbook.cz přeložil sdraco)

Plošinovky jsou velmi rozšířené a to hlavně na mobilních zařízeních. Na scénu se díváte ze strany. Hráč ovládá postavu, která prochází světem. Svět je sestavený z plošin. Hráč může po těchto plošinách chodit, skákat nebo spadnout z jedné plošiny na druhou. Může využívat žebříky nebo lana k tomu, aby se dostal na jíné místo atd. Na plošinách jsou objekty, které hráč sbírá, nepřátelé, kterým se vyhýbá nebo které zabíjí, páky, které po stisknutí otevírají dveře atd. Hráč také potřebuje tréning, aby uměl přeskákat přes nebezpečné oblasti. V některých skákačkách vidíte najednou celý level, ale většinou vidíte pouze tu část s postavou. V takovém případě přibývá další výzva ve formě hledání té správné cesty.

Tvorba dobré skákačky není nic jednoduchého a to ani s Game Makerem. Jsou zde 3 důležité aspekty, se kterými musíme počítat:

  • Vytvořit přirozený pohyb postavy.
  • Vytvořit dostatečný počet druhů nepřátel, pozadí atd.
  • Pečlivě navrhovat levely tak, aby byly zábavné a jejich obtížnost narůstala.

V tomto tutoriálu se naučíme vytvořit jednoduchou plošinovku v Game Makeru. Hru si vytvoříme v několika fázích. Jednotlivé fáze naleznete jako editovatelné hry na konci článků. Mají jen jeden level, ve kterém jsou znázorněny určité funkce. Můžete je použít jako základ pro vaši hru.

Základ

Začneme s tou nejednodušší plošinovkou. Naleznete ji v souboru platform1.gmk. V každé plošinovce jsou 2 základní objekty: postava ovládaná hráčem a blok, který je použit na plošiny, po kterých se postava chodí. Ten samý blok se často využívá i pro zdi, přes které hráč nemůže projít. Potřebujeme 2 sprity: jeden pro postavu a druhý pro blok. Pro postavu použijeme jednoduchý míček. Pro blok použijeme černý čtverec. Vytvoříme si 2 objekty. Objekt blok je solid a neobsahuje žádné události ani akce. Prostě tam leží. Objekt postava je mnohem komplikovanější.

Pohyb

Jak definovat pohyb postavy je hlavní náplní této části tutoriálu. Problém je, že postava musí chodit po horní straně plošin. Nesmí plošinami procházet. Když postava vyskočí nebo spadne, musí na další plošinu správně dopadnout. Způsobů, jak postava může chodit, skákat a padat, je nespočet. Různé skákačky (plošinovky) používají různé modely. Běžně používáme k ovládání pohybu 3 klávesy. Levá šipka by měla postavu posunout doleva, pravá doprava a šipka nahoru nebo mezerník (space) vyvolá skok.

Nejdříve se zamyslíme nad pohybem doleva a doprava. Prvním rozhodnutím bude, zda necháme postavu měnit svůj směr jen když je na plošině nebo ji necháme ovládat i během skoku nebo pádu. I když druhá možnost není přirozená (je dosti složité pohybovat se doleva, když zrovna padáte), rozhodli jsme se tu první zavrhnout, což znamená, že povolíme horizontální pohyb kdykoli a bez ohledu na to, kde postava zrovna je. Vede to k lepší hratelnosti a vlastně se to i jednodušeji implementuje (programuje).

Musíme se rozhodnout ještě o jedné věci a to zda bude mít pohyb konstantní rychlost nebo se bude zrychlovat tím, že držíte klávesu. Z důvodu jednoduchosti zůstaneme u první možnosti. Povolení zrychlení vylepšuje hru, hráč se musí například rozeběhnout po dráze, aby mohl přeskočit velkou díru.

Jak byste měli vědět, postavu lze rozhýbat mnoha způsoby. Můžeme nastavit rychlost pohybu nebo jednoduše postavu přímo posouvat. V plošinovkách je nejjednodušší nechat vertikální pohyb automaticky (jak uvidíme níže) ale horizontální si řešit po svém. Je to docela jednoduché. V události Keyboard pro klávesu <left> zkontrolujeme, zda je na relativní pozici (-4, 0) volno (zaškrtněte relative, znamená to, že souřadnice počítáme od postavy a ne od začátku místnosti). Pokud ano, poskočíme s postavou na tuto pozici (jump to point). S pravou klávesou to bude podobné. Podívejte se na přiloženou ukázku.

Skok

Jako další budeme potřebovat vertikální pohyb. To bude složitější. Pro pád postavy využijeme gravitaci. Měl by se však zastavit, když se dotkneme podlahy. Také budete chtít určit maximální rychlost pádu, jinak bude postava padat příliš rychle. (To není hezké a zároveň to způsobuje problémy v implementaci, např. postava proletí přes podlahu, protože se pohybuje příliš rychle.) Abychom toto vyřešili, do step události postavy vložíme kontrolu, zda je pozice pod postavou volná. Pokud ano, postava je ve vzduchu a nastavíme gravitaci kladnou hodnotu. Jinak ji nastavíme na 0. Také nastavíme proměnnou vspeed, která představuje vertikální rychlost. Pokud je větší než 12, vrátíme ji zpět na 12. Tímto způsobem vertikální rychlost limitujeme na 12. Takže událost vypadá nějak takto (ikony vykřičníků jsou pouze komentáře a nejsou nutné):

Step událost pro skok

Dále musíme správně dopadnout na podlahu. Je to složitější, než se zdá. Stane se to tehdy, když postava koliduje s pevným objektem (solid). V této události bychom měli nastavit vertikální pohyb na 0. To však zanechá postavu vznášející se kousek nad zemí. (Důvodem je, že objekt je vrácen na svou předchozí pozici před kolizí.) My ale chceme postavu posunout přesně na bod, kde ke kolizi došlo. Naštěstí je k tomu v Game Makeru akce:

Akce Move to contact Move to Contact. S touto akcí můžete posunout instanci daným směrem tak, aby dosáhla požadovaného objektu. Pokud instance s objektem již koliduje, akce se neprovede. Jinak je instance postavena těsně před kolizi. Můžete specifikovat směr i maximální vzdálenost k posunu. Také můžete zvolit mezi pevnými objekty a všemi objekty.

Tuto akci použijeme. Jako směr napíšeme proměnnou direction, ve které je uložen směr pohybu instance. Jako maximální vzdálenost zvolíme 12 (i přesto, že to není úplně potřeba):

Akce Move to contact

Takže celé událost kolize postavy s blokem bude vypadat takto:

Dopadnutí na zem

Mohli byste namítat, že toto potřebujeme udělat jen tehdy, když narazíme na plošinu pod námi. Ale vlastně se chceme přesunout na kontaktní pozici i v případe, že je plošina nad námi nebo se dotkneme zdi ze strany. Je tu jedna důležitá věc, která je často přičinou problémů: Předpokládáme, že původní pozice postavy je volná (collision free). Sice to očekáváme, ale vždy tomu tak není. Častou chybou je, že pokud má postava animovaný obrázek, kolizní masky se mění každý step. Může se stát, že nový obrázek na minulé pozici bude stále kolidovat. Ujistěte se, že postava má pouze jednu masku kolize. Naštěstí Game Maker od verze 8 dává všem animovaným obrázkům stejnou masku kolize. I přesto když změníte obrázek, problém se opět projeví, více naleznete v další části tutoriálu.

Nakonec musíme postavě nastavit skok, když stikneme šipku nahoru. Musí se to však stát jen tehdy, když postava stojí na zemi. Nejdříve tedy zkontrolujeme, zda pozice pod postavou koliduje a pokud ano, nastavíme vertikální rychlost například na -10. Určitě si budete chtít pohrát s hodnotami 10 pro vertikální rychlost a 0.5 pro gravitaci, abyste dostali pohyb, který chcete.

Nyní je základ pro skákačku hotový. Navrhněte si level s nějakými plošinami a zdmi, které budou potomky objektu block (budou mít block nastavený jako parrent). Vložte do místnosti instanci hlavní postavy a jsme hotoví.


 

Stáhnout

Staženo 1167x (11.4 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentáře
Zobrazit starší komentáře (14)

Avatar
tomasnagy07
Člen
Avatar
tomasnagy07:

Je prominte ja jsem to napsal asi blbe ja mam taky vykonej comp mam 8Gb ram a 6 jader na 3,2 GHz a 64 bit windows takze tim to neni ja myslel ukladani jako hry myslim kdyz ji vytvarim a casto ukladam treba udelam novy objekt a hned ulozim atd... atd.... mohlo by to zpusobit nejaky nasledky ohledne sekani nebo tak?? moc bych to potreboval :/ diky predem za odpoved ;)

 
Odpovědět 11.8.2012 15:55
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na tomasnagy07
David Čápka:

Uložení nemá na běh žádný vliv.

Odpovědět 11.8.2012 16:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
tomasnagy07
Člen
Avatar
tomasnagy07:

Tak nevim proc se to stalo,a co hodne objektu spritu,atd... je tohle mozny i kdyz bych se divil ze by to pocitac nedal :/ doufam ze neotravuji ale ta rada je pro mne hodne cena :/.

 
Odpovědět 11.8.2012 16:40
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na tomasnagy07
David Čápka:

To není ani tak o počítači, jako o tom, jak GameMaker uvnitř funguje. Není neznámé, že na tom není moc dobře a je velmi pomalý, zvláště, když máš na scéně moc objektů. Přečti si tento článek: http://www.itnetwork.cz/…ytvorene-hry

Odpovědět 11.8.2012 16:46
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
tomasnagy07
Člen
Avatar
tomasnagy07:

Je fakt diky moc mi to pomohlo a snad uz nic nepotrebuju moc diky.

 
Odpovědět 11.8.2012 21:50
Avatar
tomasnagy07
Člen
Avatar
tomasnagy07:

ách ne :( :( uz to zase nejde exportoval jsem sprity a objekty abych mel klid a udelal jsem to znova a proste se to porad seka a seka nevim cim to je je to divny neni nejak mozny ze bych sem tu hru dal v tom stavu aby jsi se na to mrknul az by jsi mel cas a pokusil se zjistit kde je chyba jsem zoufalej po nejaky dobe se to zacne sekat a to nemam ani vic nez 3 objekty v mistnosti kde hraju mam tam jenom hrace a zed,pak mam jeste menu ale pochybuju ze to za neco muze nevite co s tim ja uz jsem z toho v haji :( :( a nemuzu na to proste prijit :/. je to nejak mozny s tou hrou?

 
Odpovědět 11.8.2012 22:44
Avatar
Martan04
Člen
Avatar
Martan04:

Mne se to hybe doleva nebo doprava jenom kdyz je to ve vzduchu. Nevite proc?

 
Odpovědět 29.12.2012 18:01
Avatar
TomBen
Redaktor
Avatar
Odpovídá na tomasnagy07
TomBen:

Zkusils změnit proces priority?
Stejně by se ti nemělo nic sekat. Na průměrném počítači by měly v klidu
běhat stovky objektů i kontrolou kolize. Jiné GM věci ti jedou normálně?

Odpovědět 29.12.2012 19:03
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Martan04
TomBen:

Ukázka pod příspěvkem funguje normálně. Zkoušel jsem to a jelo to.
Jediné, co omezuje pohyb je kontrola kolize. Takže máš buď špatně masku
nebo je objekt posazený o pixel pod podlahu nebo nějaká podobná chybka.
Popisovaný efekt má např. zapomenuté vynulování vertikální rychlosti
při kontaktu s pevnými objekty.

Odpovědět 29.12.2012 19:13
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Grimor
Člen
Avatar
Odpovídá na Martan04
Grimor:

V zmáčknutí UP musíš nastavit check collision y=1

 
Odpovědět 28.3.2014 19:11
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.

Zobrazeno 10 zpráv z 24. Zobrazit vše