Corona Game Engine: kdy a jak použít kolizní události

Pravděpodobně jste hráli spoustu mobilních her, které implementovaly fyzikální vlastnosti a chování v určitých aspektech hry. Například skok z plošin v Doodle Jump nebo zbourání hromádek dřeva v Angry Birds.

Ale přemýšleli jste někdy, co stojí za všemi těmito interakcemi a jak ví Doodler, kdy může projít platformou a kdy se od ní odrazit? Jak se může ta hromada dřeva tak realisticky zhroutit, když na ni zasáhne Angry Bird? Ve skutečnosti to není tak těžké. Všichni se dostanou s malou pomocí z kolizních událostí.

Vzhledem k tomu, že většina mých her se vyrábí pomocí Corona Game Engine, použiji k popisu a kódování příkladů souvisejících s tématem implementaci Corona Collision (Physics) a programovací jazyk Lua. Nicméně podobné principy lze snadno aplikovat i na jiné herní stroje, protože mnoho fyzikálních motorů funguje podobně. Corona obecně vykonává s dokumenty skvělou práci, takže v tomto textu můžete vidět několik odkazů na dokumentaci, protože nemělo smysl znovuobjevovat kolo. :)

Pojďme se do toho ponořit!

Celkový přehled

Nejprve je důležité zdůraznit, že každý herní engine používá fyzický motor v pozadí, aby se vypořádal s fyzikou. Zejména se Corona zabývá fyzikou pomocí fyzického motoru Box2D. To vám umožní implementovat funkce ze světa fyziky jednoduše přiřazením fyzikálních vlastností k objektům ve hře a zpracováním jejich interakcí se správnými metodami.

Jedním z nich jsou kolizní události. Umožňují detekovat a řešit kolize mezi fyzickými objekty. Představte si, že hrajete jednoduchou hru, kde postava sbírá padající předměty, chytí ty dobré a vyhne se špatným. Chcete-li zjistit, kdy postava interagovala s padajícím objektem, jednoduše proveďte kontrolu v kolizní události, kterou jste dříve přiřadili znaku a padajícím objektům.

Tato kontrola může být stejně základní jako:

Protože srážkové události jsou detektory fyzické interakce, předpokládá se, že jste dříve přidali fyzikální těla k objektům, se kterými chcete být schopni interagovat. Tato definice je jednoduchá, ale je nutné, pokud chcete, aby vaše objekty odpovídaly fyzickým interakcím.

Můžete například říci:

Jak vidíte, existuje zde několik definic: typ těla (dynamická těla se pohybují pod simulací podle sil, jako je gravitační nebo reakční srážková síla, a přijímají použití rychlosti, statická těla nebudou reagovat na síly jako gravitace a budou se chovat, jako by měly nekonečnou hmotu, kinematická těla se pohybují pod simulací pouze podle jejich rychlosti atd. - o tom se můžete dozvědět více na coronalabs.com) a fyzických vlastnostech, které budou působit při různých fyzikálních interakcích. Například, pokud by naše postava byla míč zasažený do země, odrazil by se docela vysoko, protože velká část jeho rychlosti by se po srážce vrátila (odraz = 0,8). Pokud by naše postava byla muž lezoucí na kopec a nechceme, aby se při lezení naklonil dozadu a spadl, mohli bychom zastavit jeho rotaci kolem konkrétní osy atd.

To vše může znít, jako by implementace vyžadovala spoustu specializovaných znalostí, ale ve skutečnosti to tak není. Mnoho jednoduchých her lze snadno vytvořit pouze se základním porozuměním fyziky, protože motor zvládne většinu věcí za vás.

Konkrétní srážky

Jak jsem již řekl, kolizní události vám umožňují detekovat a zvládat kolizi mezi fyzickými objekty. S Coronou lze definovat několik typů kolizí:

  • předrážka
  • kolize
  • po kolizi

Existuje také dílčí případ každé kolizní události, která ji definuje jako:

  • místní srážka
  • globální kolize

Který vyberete, záleží na tom, co plánujete.

Začněme globální a místní kolizí. Lokální srážky se nejlépe využívají v scénářích srážky jeden k mnoha, zatímco globální srážky se nejlépe využívají v mnoha srážkových scénářích - specifika získáte na stránce coronalabs.com. Takže naše postava, chytání dobrých padajících předmětů a vyhýbání se špatným by se perfektně hodila k místní kolizní události. Pokud vaše hra měla více postav, zvažte použití globální kolizní události, která je definována jako globální runtime, která detekuje kolize mezi všemi fyzickými objekty ve hře.

Lokální kolizní události jsou popsány pomocí parametrů self a event, což představuje samotný objekt a mimo jiné další objekty Corona, které se účastní kolize. Objekty zobrazení Corona mají opravdu skvělou funkci - chovají se jako tabulky Lua, což znamená, že k nim lze snadno přidat různá data, jako jsou jména, identifikátory nebo kategorie. To se používá zejména při řešení kolize. Ke každému dobrému a špatnému objektu (např. „Dobrý“, „špatný“) lze přidat identifikátor a porovnáním těchto identifikátorů uvnitř kolizní události je velmi snadné zjistit, který z nich právě hráč sbíral. Pokud je to dobrý, můžete hráči udělit body. Pokud ne, můžete snížit jeho životní body.

Tento scénář lze snadno vytvořit pomocí pravidelné kolize. To znamená, že jste schopni detekovat fyzické kontakty mezi objekty, kterým je přiřazeno fyzické tělo. Tato událost sestává z počáteční a ukončené fáze, takže můžete provádět akce na počátečních a přerušených kontaktních okamžicích. Představte si například, že stavíte vesmírnou hru, jako je Malá galaxie, a pomocí techniky fyzických kloubů jste definovali gravitační pole vaší planety. S počáteční a ukončenou fází srážkové události jste mohli zjistit, kdy satelit vstoupil a opustil gravitační pole planety, a poté provést určité akce. Vraťme se k naší postavě chytající překážky a uvidíme, jak to vypadá v akci.

Nejprve vytvořím několik globálních konstant pro řešení různých velikostí obrazovky. Tento přístup se může u jednotlivých vývojářů lišit. Tato metoda souvisí s velikostí obsahu definovanou v souboru config.lua a osobně jsem shledala, že tato metoda je pro mé použití nejvhodnější.

Vytvořím také globální výčet, který později použiji jako identifikátor padajících objektů:

Dále implementuji potřebnou knihovnu, spustím fyziku a vypnu gravitaci:

Dále budu tvořit naši postavu. Například (stejně jako padající předměty) bude představován jednoduchým kruhem:

Znak má vlastnost ukotvení Y nastavenou na 1. To znamená, že jeho referenční bod osy Y je nastaven na nejnižší bod. V důsledku toho, když je umístěn do středu obrazovky, bude tam umístěno dno kruhu. To bude velmi důležité v pozdějším příkladu „Doodle Jump“ (po srážce).

Jak bylo uvedeno výše, všem objektům, které by se měly účastnit fyzických interakcí, musí být přiděleno fyzické tělo:

Všimněte si, že jsem definoval znak jako senzor. To znamená, že jiný fyzický objekt nebude schopen fyzicky interagovat s postavou (žádné odskoky, žádné tření atd.), Ale stále budeme schopni detekovat kolize. Tento princip se často používá, když nechceme, aby se objekty srážely a létaly kolem obrazovky kvůli následujícímu fyzickému chování, ale jednoduše zjistí, kdy interagovaly a udělaly něco na základě samotné interakce (např. Zvýšení nebo snížení skóre).

Nyní vytvořme funkci pro generování padajících objektů:

Tato funkce bude volána s časovačem, generuje objekt každé 2 sekundy a animuje ho z horní do dolní části obrazovky. Jak vidíte, každá překážka je označena dříve definovaným výčtem a pro vizuální diferenciaci bude každý dobrý padající objekt zbarven zeleně, zatímco špatný bude zbarven červeně.

Nyní se možná divíte, proč nastavím padající předměty také jako senzory? Ve vypracovaném scénáři hry můžete chtít použít akcelerometr, aby se vaše postava naklonila doleva a doprava ke sbírání / vyhýbání se padajícím objektům a náhodně generovala polohu, kde padající objekt začne svou cestu do spodní části obrazovky. Pokud zúžíte časový interval potřebný k vygenerování objektu, jak hráč postupuje ve hře, je pravděpodobné, že některé překážky budou generovány velmi blízko u sebe.

Pokud by nebyly nastaveny jako senzory, srážely by se a chovaly se velmi nepřirozeně, protože přechody (nikoli gravitace!) Se používají k přesunu objektů z horní do dolní části obrazovky. Tímto způsobem, zejména pokud se jejich klesající rychlost liší, se mohou volně procházet navzájem a stále můžete detekovat kolize znaků s těmito objekty, protože oba jsou definovány jako fyzikální těla.

Nyní je čas definovat naši kolizní událost ve formě funkce:

Aby tato událost měla jakýkoli účinek, musí být spojena a svázána s naší postavou:

Náš posluchač nyní „poslouchá“ jakékoli fyzické interakce, se kterými se naše postava zapletla. Jakmile interaguje s padajícím objektem, provede se jednoduchá kontrola, zda uživatel shromáždil dobrý nebo špatný objekt. Za každý nasbíraný dobrý objekt je uživateli uděleno 10 bodů. Na druhou stranu, pokud sbírá špatný předmět, jeho body se sníží o 10. Když je to hotovo, padající objekt bude odstraněn a postava bude pěkně animována, aby vizuálně ukázala, že došlo ke kolizi.

Podívejme se na výsledky!

Hra na chytání objektů v akci

Jak vidíte, bylo to vše snadno proveditelné, protože v pozadí je fyzikální motor, který se zabývá všemi složitými věcmi pro vás. Celý kód si můžete stáhnout zde.

Nyní se podívejme, jak lze předběžnou kolizi snadno použít k dosažení zajímavého chování. Možná nejlepším příkladem by bylo vytvoření plošinovky typu Doodle Jump se skákací postavou. Věřte tomu nebo ne, tato základní herní funkce není implementována obtížněji než předchozí funkce „chytání objektů“. To samé začneme tím, že nejprve definujeme prvky uživatelského rozhraní a dáme jim fyzikální tělo.

Tentokrát se jedná o hráče a sadu pevně zakódovaných platforem:

Znovu si všimněte, že platformám je dán identifikátor a tentokrát jsou definovány jako statická těla, zatímco znak je stále dynamický. Důvodem je gravitace:

Aby platformy nemohly spadnout a spadnout, musí být definovány jako statická těla, což znamená, že nebudou reagovat na síly, jako je gravitace. Na druhou stranu musí být náš hráč stažen pokaždé, když skočí. Všimněte si, že kotevní bod Y naší postavy je opět nastaven na nejnižší bod. To bude použito v případě předkolizní události a zkontroluje, zda je pozice postavy (jeho nohy) nad nebo pod platformou, se kterou se chystá srazit.

Pokud jsou jeho chodidla dole, deaktivujte kontakt. Pokud jsou jeho nohy nahoře, trochu ho zatlačte do vzduchu:

Předrážka je trochu hlučná a může při každém kontaktu vystřelit několikrát. Chcete-li dát naší postavě pouze jeden tlak do vzduchu na jeden kontakt, můžeme získat jeho lineární rychlost a na základě značky rychlosti (směr Y) určit, zda postava padá dolů a blíží se k platformě. Protože počáteční rychlost naší postavy je 0, musíme ho na začátku trochu zatlačit a je dobré jít!

Platformová skoková hra v akci

Dalším krokem by bylo vytvoření funkce pro náhodné generování platforem a jejich posunutí směrem dolů, jak postava vyskočí. Protože to není toto téma, nechám to na jiném blogu. Chci jen zmínit, že těchto konkrétních mechanismů lze dosáhnout pomocí různých přístupů. Pro příklad jsem si vybral tento. Nebojte se experimentovat! Celý demo kód si můžete stáhnout zde.

Poslední, ale v neposlední řadě, je post-kolizní událost. Je to jediná kolizní událost, kde jsou hlášeny kolizní síly a tření (opět více informací na coronalabs.com). Co to pro vás znamená jako vývojáře hry? Na základě těchto hodnot můžete například určit sílu a množství určitých událostí.

Pokud děláte pinball, můžete hrát zvuk netopýra, který udeří do míče úměrný síle události. Pokud stavíte hokejovou hru a používáte částice k zobrazování sekání ledu, když pádlo zasáhne puk, můžete vydat více částic silnějším zásahem.

Pro tento příklad vytvořím míč zasažený kruhem naší postavy.

Míč je umístěn svisle pod postavou. Teď na to aplikuji nějakou sílu, nasměruji ji na postavu, ale s náhodnými hodnotami síly X a Y, takže můžete vidět rozdíly v konečném výsledku (chování) poté, co byl míč mírně odlišný a zasáhl postavu v jiném bodě.

Událost po střetu může být definována takto:

A konečný výsledek vypadá takto:

Hra po střetu v akci

Postava se po zásahu pohybuje docela realisticky, že? Vše, co jsme udělali, bylo nastavit několik vlastností k objektům a samotnému fyzickému světu. Je to proto, že veškerá mechanika za touto událostí pro vás zpracovává fyzikální motor. Celý kód najdete zde.

Závěr

Jak vidíte, manipulace s kolizí je velmi užitečná. Vzhledem k tomu, že fyzický motor dělá většinu věcí na pozadí, mnoho základních (ale velmi účinných) věcí lze snadno dosáhnout pouhým základním pochopením fyziky a samozřejmě herního enginu, se kterým pracujete.

Kolizní události mohou a měly by být spárovány s různými dalšími událostmi, takže máte nekonečné možnosti, omezené pouze výkonem a vaší fantazií.

__________
Jsme k dispozici pro partnerství a otevřeni pro nové projekty. Pokud máte nápad, o kterém byste chtěli diskutovat, podělte se o něj s naším týmem!