Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Xcode

Úvod do GameplayKit: část 2

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called An Introduction to GameplayKit.
An Introduction to GameplayKit: Part 1
An Introduction to GameplayKit: Part 3

Czech (Čeština) translation by Jakub Dokoupil (you can also view the original English article)

To je druhá část Úvod do GameplayKit. Pokud jste ještě prošel první část, pak doporučuji přečíst tento výukový program první před pokračováním s tímhle.

Úvod

V tomto tutoriálu budu vás učit o dvě další funkce GameplayKit rámce, který můžete využít výhod:

  • agenti, cílů a chování
  • pathfinding

Využitím agenti, cílů a chování, budeme stavět v některých základních umělé inteligence (AI) do hry, kterou jsme začali v první části tohoto seriálu. AI umožní naše červené a žluté nepřátelské dots zaměřit a pohybovat směrem k naší modrý hráč bod. Budeme také implementovat pathfinding rozšířit na tomto AI procházet kolem překážek.

Pro tento kurz můžete použít svou kopii dokončené projektu z první části této série nebo stáhnout novou kopii zdrojového kódu z GitHubu.

1. zmocněnci, cílů a chování

V GameplayKit, agenti, cílů a chování se používají v kombinaci s sebou k definování jak různé objekty přesunout ve vztahu k sobě navzájem v celé scéně. Pro jeden objekt (nebo SKShapeNode v naší hře) Začněte vytvořením agenta, který je reprezentován třídou GKAgent. Však pro 2D hry, jako je ta naše, musíme použít konkrétní třídy GKAgent2D.

Třída GKAgent je podtřída GKComponent. To znamená, že vaše hra je třeba používat struktury založené na entitě a komponenty jak jsem vám ukázal v prvním kurzu této řady.

Látky představují pozici, velikost a rychlost objektu. Potom přidejte chování, reprezentovaný třídou GKBehaviour tomuto agentovi. Konečně vytvořte soubor cílů, reprezentované třídy GKGoal a přidat je do objektu behavior. Cíle lze použít k vytvoření mnoha různých herních prvků, například:

  • posun směrem k agent
  • odklon od agenta
  • seskupování blízko u sebe s jinými látkami
  • putování po určité pozice

Vaše chování objektu sleduje a počítá všechny cíle, které do něj přidáte a pak předává tyto údaje zpět na původce. Uvidíme, jak to funguje v praxi.

Otevřete projekt Xcode a přejděte na PlayerNode.swift. Musíme nejprve zkontrolujte, zda že odpovídá protokolu GKAgentDelegate PlayerNode třídy.

Dále přidejte následující blok kódu do třídy PlayerNode.

Začneme tím, že přidání vlastnosti do třídy PlayerNode, tak, že máme vždy odkaz na objekt aktuální hráč agent. Dále realizujeme dvě metody protokolu GKAgentDelegate. Implementace těchto metod, zajišťujeme, že hráč bod na obrazovce vždy odrážet změny, které GameplayKit.

AgentWillUpdate(_:) metoda se nazývá těsně před GameplayKit vypadá prostřednictvím chování a cíle tohoto zástupce určit, kde by měl pohybovat. Podobně agentDidUpdate(_:) metoda se nazývá rovnou po GameplayKit dokončení tohoto procesu.

Naše implementace těchto dvou metod zajišťuje, že uzel, co vidíme na obrazovce odráží změny, které provede GameplayKit a že GameplayKit používá poslední pozice uzlu při provádění výpočtů.

Dále otevřete ContactNode.swift a jeho obsah nahraďte následující implementace:

Implementací protokolu GKAgentDelegate v třídě ContactNode, umožníme pro všechny další body v naší hře se s GameplayKit, stejně jako náš hráč bod.

Nyní je čas nastavit chování a cílů. Aby to fungovalo, musíme se postarat o tři věci:

  • Přidejte hráče uzlu agenta k jeho osobě a nastavte jeho delegáta.
  • Konfigurace agentů, chování a cílů pro všechny naše nepřátelské teček.
  • Aktualizujte všechny z těchto činitelů ve správný čas.

Za prvé otevřete GameScene.swift a na konci didMoveToView(_:) metoda, přidejte následující dva řádky kódu:

Tyto dva řádky kódu přidat agenta jako součást a nastavte agenta delegát bude samotný uzel.

Implementace initialSpawn metody dále nahraďte následující implementace:

Nejdůležitější kód, který jsme přidali se nachází v if příkaz, který následuje příkaz switch. Pojďme si tento kód řádek po řádku:

  • Nejprve přidat agenta do entity jako komponenty a nakonfigurovat jeho delegáta.
  • Dále jsme přiřadit pozice agenta a přidat agenta do uloženého pole agentů. Budeme přidávat tuto vlastnost GameScene třídy v chvíli.
  • Pak vytvoříme objekt GKBehavior s jediné GKGoal zaměřit současné hráčem. Parametr váha v tomto inicializátoru slouží k určení, které cíle by měla mít přednost před ostatními. Představte si například, že máte cíl zaměřit konkrétní agent a cíl se vzdálit od jiného agenta, ale chcete cílení cíl upřednostněna. V tomto případě byste mohli dát cílení cíle hmotnosti 1 a ustoupit stranou cíl váha 0,5. Toto chování je pak přiřazen k nepřátelské uzlu agenta.
  • A konečně, musíme nastavit masové, maxSpeed a maxAcceleration vlastnosti agenta. Tyto změny ovlivní, jak rychle objekty lze přesunout a otočit. Nebojte se, hrát si s těmito hodnotami a uvidíme, jak to ovlivňuje pohyb nepřítele tečky.

Dále přidejte následující dvě vlastnosti do třídy GameScene:

Agenti pole se použije k udržovat odkaz na nepřátelské agenty ve scéně. LastUpdateTime vlastnost se používá k výpočtu času, které uplynulo od poslední aktualizace scény.

Implementace update(_:) metody GameScene třídy konečně, nahraďte následující implementace:

V metodě update(_:) jsme spočítat čas, který uplynul od poslední scéně aktualizovat a aktualizovat agenti s touto hodnotou.

Sestavení a spusťte aplikaci a začít přesouvat po celém scénu. Uvidíte, že nepřátelské tečky pomalu začne, pohybující se směrem k vám.

Targeting enemies

Jak můžete vidět, zatímco nepřátelské body cílové hráč, že není pohybovat kolem bílé bariéry, místo toho se snaží pohybovat skrze ně. Udělejme trochu chytřejší s pathfinding nepřátele.

2. pathfinding

S GameplayKit framework můžete přidat komplexní pathfinding do hry tím, že kombinuje fyzika těla s GameplayKit třídy a metody. Pro naši hru budeme jej nastavit tak, aby nepřítele tečky bude cíl hráč tečku a současně pohybovat kolem překážek.

Pathfinding v GameplayKit začíná s vytvořením grafu scény. Tento graf je sbírka jednotlivých míst, také označovány jako uzly a spojení mezi těmito místy. Tato připojení definovat, jak konkrétní objekt můžete přesunout z jednoho místa do druhého. Graf lze modelovat dostupné cesty ve scéně v jednom ze tří způsobů:

  • Kontinuální prostor obsahující překážky: Tento model graf umožňuje hladké cesty kolem překážek z jednoho místa do druhého. Pro tento model GKObstacleGraph třída se používá pro graf, GKPolygonObstacle třídy pro překážky a třídu GKGraphNode2D pro uzly (umístění).
  • Jednoduché 2D mřížky: V tomto případě platná umístění může být pouze ti s celočíselných souřadnic. Tento model graf je užitečný, když vaše scéna má odlišné mřížky rozvržení a není nutné hladké cesty. Při použití tohoto modelu objekty lze pohybovat pouze vodorovně nebo svisle v jednom směru v daném okamžiku. Pro tento model GKGridGraph třída se používá pro třídu GKGridGraphNode pro uzly a grafu.
  • Kolekce umístění a propojení mezi nimi: to je nejvíce obecný model graf a je doporučována pro případy, kdy objekty přesunout mezi odlišné prostory, ale jejich konkrétní pozici v rámci tohoto prostoru není nezbytné pro hraní. Pro tento model GKGraph třída se používá pro třídu GKGraphNode pro uzly a grafu.

Protože chceme tečkou hráče v naší hře pohybovat kolem bílé bariéry, budeme používat třídu GKObstacleGraph k vytvoření grafu naší scény. Chcete-li začít, nahraďte následující vlastnosti spawnPoints v třídě GameScene:

Pole spawnPoints obsahuje některé změněné spawn místech pro účely tohoto kurzu. To proto, že v současné době GameplayKit lze vypočítat pouze cesty mezi objekty, které jsou relativně blízko sebe.

Díky velké výchozí vzdálenost mezi body v této hře pár nových spawn body musí přičíst k ilustraci pathfinding. Všimněte si, že jsme také deklarovat vlastnosti grafu typu GKObstacleGraph udržovat odkaz na graf, který vytvoříte.

Dále přidejte následující dva řádky kódu na začátek metody didMoveToView(_:):

V prvním řádku vytvoříme celou řadu překážek z těl fyzika na scéně. Pak vytvoříme objekt grafu pomocí těchto překážek. BufferRadius parametr v tomto inicializátoru slouží k vynutit objektů není přijít do určité vzdálenosti těchto překážek. Tyto řádky je třeba přidat na začátku didMoveToView(_:) metody, protože grafu vytvoříme potřebné v době, kdy je volána metoda initialSpawn.

Nakonec nahraďte metodu initialSpawn s následující implementace:

Začneme vytvořením objektu GKGraphNode2D s výchozím hráč spawn souřadnicemi metodu. Dále jsme připojit tento uzel grafu tak, že lze použít při hledání cesty.

Většina initialSpawn metody zůstává nezměněna. Přidal jsem některé komentáře vám ukázat, kde pathfinding část kódu je umístěn v první if prohlášení. Pojďme si tento kód krok za krokem:

  • Vytvořit další instanci GKGraphNode2D a připojit k grafu.
  • Vytváříme řady uzlů, které tvoří cestu voláním findPathFromNode(_:toNode:) metodu na našem grafu.
  • Je-li řadu uzly cesty byla úspěšně vytvořena, od nich pak vytváříme cestu. Parametr radius funguje podobně jako bufferRadius parametru z před a definuje, kolik objekt může opustit vytvořenou cestu.
  • Vytvoříme dva GKGoal objekty, jednu pro následující cestu a druhý pro pobyt na cestě. Parametr maxPredictionTime umožňuje cíl k výpočtu jak nejlépe to lze dopředu, zda se něco přerušit z následující/zůstat na této konkrétní cesty objektu.
  • Konečně jsme vytvořit nové chování s těmito dvěma góly a to přiřadit agentovi.

Bude také zjistíte, že jsme odstranit uzly, které vytváříme z grafu, jakmile jsme hotovi s nimi. To je vhodné sledovat, jak to zajistí, že uzly, které jste vytvořili není v rozporu s jinými výpočty pathfinding později.

Sestavení a spuštění aplikace ještě jednou a zobrazí se dvěma tečkami, které potěr velmi blízko vás a začít přesouvat směrem k vám. Budete muset spustit hru vícekrát, pokud se obě množí jako zelené tečky.

Pathfinding enemies

Důležité!

V tomto kurzu zvykli jsme si GameplayKit pathfinding funkce Povolit nepřátelské body zaměřit tečka hráč kolem překážek. Všimněte si, že je to jen pro praktický příklad pathfinding.

Pro hru s skutečná produkce by bylo nejlepší k provedení této funkce tím, že kombinuje přehrávač cílení kanonýr dříve v tomto kurzu s cílem vyhnout se překážce vytvořené metodou init(toAvoidObstacles:maxPredictionTime:) pohodlí, které si můžete přečíst více o v GKGoal tříd.

Závěr

V tomto tutoriálu jsem vám ukázal, jak lze využít agenty, cílů a chování v hrách, které mají strukturu součást entity. Zatímco pouze jsme vytvořili tři cíle v tomto kurzu, existuje mnoho více k dispozici pro vás, který si můžete přečíst více o v GKGoal tříd.

Rovněž jsem vám ukázal jak implementovat některé pokročilé pathfinding ve vaší hře tak, že vytvoříte graf, sada překážek a cíle dodržovat tyto cesty.

Jak vidíte, existuje obrovské množství funkcí, které jsou k dispozici prostřednictvím GameplayKit rámce. V třetí a poslední části této série budu tě učit o generátory náhodná hodnota je GameplayKit a jak vytvořit vlastní pravidlo systém zavést některé fuzzy logika do vaší hry.

Jako vždy prosím nezapomeňte napsat své návrhy a zpětnou vazbu.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.