Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Xcode
Code

Ўвядзенне ў GameplayKit: частка 1

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called An Introduction to GameplayKit.
An Introduction to GameplayKit: Part 2

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

Ўвядзенне

Нароўні з усімі новымі функцыямі і фреймворка ў iOS 9 and OS X El Capitan, выпушчаныя ў гэтым годзе, Apple таксама стварыла зусім новы фреймворк для распрацоўшчыкаў гульняў GameplayKit. зякуючы існуючым графічным API (SpriteKit, SceneKit і Metal), якія дазваляюць ствараць цудоўныя гульні на iOS і OS X, Apple выпусціла GameplayKit, каб спрасціць стварэнне гульняў, якія добра працуюць. Гэты фреймворк змяшчае шмат класаў і функцыянальных магчымасцяў, якія могуць палягчаць ці ўскладняць стратэгію вашай гульні.

У гэтым уроку я распавяду вам пра двух асноўных аспектах фреймворка GameplayKt:

  • аб'екты і кампаненты
  • механіка стану

Перадумовы

Для гэтага ўрока вам спатрэбіцца, каб вы запусцілі якая працуе Xcode версіі 7 у OS X Yosemite ці больш познюю версію. Не патрабуецца, але рэкамендуецца, каб у вас было фізічная прылада, якое працуе пад кіраваннем iOS 9, так як вы атрымаеце значна лепшую прадукцыйнасць пры тэставанні гульні на аснове SpriteKit, якая выкарыстоўваецца ў гэтым падручніку.

1. Пачатак работы

Спачатку вам трэба спампаваць стартавы праект для гэтай серыі навучальных праграм ад GitHub. Як толькі вы гэта зробіце, адкрыйце праект у Xcode і запусціце яго або на iOS Simulator, альбо на вашым прыладзе.

Вы ўбачыце, што гэта вельмі простая гульня, у якой вы кіруеце сіняй кропкай і перасоўвае яе па карце. Калі вы сутыкаецеся з чырвонай кропкай, вы губляеце два ачкі. Калі вы сутыкаецеся з зялёнай кропкай, вы атрымліваеце адно ачко. Калі вы сутыкаецеся з жоўтай кропкай, ваша кропка замарожваецца на пару секунд.

Initial Game

На дадзеным этапе гэта вельмі простая гульня, але на працягу ўсёй гэтай серыі ўрокаў і з дапамогай GameplayKit мы збіраемся дадаць больш функцыянальнасці і элементаў у гульнявой працэс.

2. Аб'екты і кампаненты

Першым важным аспектам новай структуры GameplayKit з'яўляецца канцэпцыя структурированиякода, заснаваная на аб'ектах і кампанентах. Яна працуе, дазваляючы распрацоўніку пісаць агульны код, які выкарыстоўваецца многімі рознымі тыпамі аб'ектаў у вашай гульні, захоўваючы пры гэтым добра арганізаваным і кіраваным. Канцэпцыя аб'ектаў і кампанентаў прызначана для ліквідацыі агульнага падыходу, заснаванага на атрыманні ў спадчыну, для сумеснага выкарыстання агульнай функцыянальнасці паміж тыпамі аб'ектаў. Самы просты спосаб зразумець гэтую канцэпцыю - гэта некалькі прыкладаў, якія дапамогуць прадставіць нам апісанае:

Вы ствараеце гульню ў жанры Tower Defense з тремяосновными тыпамі вежаў: агонь, лёд, аднаўленне. Тры тыпу вежаў будуць абменьвацца некаторымі агульнымі дадзенымі, такія як здароўе, памер і сіла. Вашыя вежы агню і лёду павінны быць здольныя атакаваць надыходзячых ворагаў, каб страляць, у той час як вежа лячэння не здольная гэта зрабіць. Усё, што патрабуецца вашай вежы ацаленьня, - гэта адрамантаваць іншыя вежы ў радыусе, калі яны будуць разбітыя.

Улічваючы асноўную мадэль гульні, давайце паглядзім, як ваш код можа быць арганізаваны з выкарыстаннем структуры ў наследавання:

  • Бацькоўскі клас Tower, які змяшчае агульныя дадзеныя, такія як здароўе, памер і сіла.
  • Класы FireTower, IceTower і HealTower, якія ўспадкоўваюцца ад класа Tower.
  • У класе HealTower ў вас ёсць логіка, якая адказвае завылячэнне вашых іншых вежаў у пэўным радыусе.

Пакуль гэтая структура ў парадку, але зараз узнікае праблема, калі вам трэба рэалізаваць магчымасці навядзення на мэту для вежаў агню і лёду.  Вы проста капіруеце і ўстаўляеце адзін і той жа код у класы FireTower і IceTower? Калі вам трэба ўнесці якія-небудзь змены, вам прыйдзецца змяніць свой код больш чым у адным месцы, гэта досыць цяжка i потым прывядзе да вялікай колькасці памылак. Але, што адбудзецца, калі вы захочаце дадаць новы тып вежы. Вы будзеце ў трэці раз капіяваць і ўстаўляць код?

Здаецца, лепшы спосаб размясціць ўсю логіку ў бацькоўскі клас Tower. Гэта дазволіць вам мець адзін асобнік кода, які трэба рэдагаваць толькі ў адным месцы. Аднак даданне гэтага кода зробіць клас Tower нашмат больш і складаней, тады, калі не ўсе яго падкласы маюць патрэбу ў гэтай функцыянальнасці. Калі б вы таксама хочаце дадаць дадатковы функцыянал паміж тыпамі вежы, ваш клас Tower паступова стане яшчэ больш, што абцяжарыць працу.

Як вы бачыце, можна стварыць гульнявую мадэль, заснаваную на атрыманні ў наследаванне, але яна можа вельмі хутка і лёгка стаць неарганізаванай і складанай ва ўпраўленні.

Зараз давайце паглядзім, як гэтая ж гульнявая мадэль можа быць структураваная з выкарыстаннем аб'ектаў і кампанентаў:

  • Мы створым аб'екты FireTower, IceTower і HealTower. Можна стварыць больш аб'ектаў для любых тыпаў вежаў, якія вы хочаце дадаць пазней.
  • Мы таксама створым кампанент BasicTower, які будзе ўтрымліваць паказчыкі здароўя, памеру, сілы і т. д.
  • Каб апрацаваць працэс ацаленьня вашых вежаў у пэўным радыусе, мы дадамо компонент Healing.
  • Кампанент Targeting будзе ўтрымліваць код, неабходны для нападу на атакавалых ворагаў.

Выкарыстоўваючы GameplayKit і гэтую структуру, вы зможаце стварыць унікальны тып аб'екта. Для кожнага асобнага аб'екта вы можаце дадаць патрэбныя вам кампаненты. Напрыклад:

  • Кожны аб'ект FireTower і IceTower будзе мець звязаны з ім кампанент BasicTower иTargeting.
  • Ваш аб'ект HealTower будзе мець абодва кампанента BasicTower, так і Healing.

Як вы бачыце, з выкарыстаннем структуры на аснове аб'ектаў і кампанентаў ваша гульня цяпер нашмат прасцей і універсальнейшы. Логіка прыцэльвання павінна быць напісана толькі адзін раз і звязана толькі з аб'ектамі, для якіх яна патрэбна. Аналагічна, базавыя дадзеныя пра вежы па-ранейшаму могуць быць лёгка размеркаваны паміж усімі вашымі вежамі, без неабходнасці дадаваць дадатковыя функцыі.

Яшчэ адна выдатная рэч у гэтай структуры на аснове аб'ектаў і кампанентаў заключаецца ў тым, што розныя кампаненты могуць быць дададзеныя і выдаленыя з аб'ектаў тады, калі вы гэтага захочаце. Напрыклад, калі вы хочаце, каб вашыя вежы ацаленьня адключаліся пры пэўных умовах, вы проста выдаляеце кампаненты Healing з аб'екта да таго часу, покавы не будзеце мець патрэбнага выніку. Ці, калі вы хочаце, каб адна з вашых вежаў агню атрымала на час здольнасць вылечваць, вы можаце проста дадаць кампанент Healing да аб'екта FireTower на некаторы час.

Цяпер, калі мы разабраліся з канцэпцыяй гульнявой мадэлі на аснове аб'ектаў і кампанентаў, давайце воссоздадим яе ў нашай уласнай гульні. У інспектара кода файлаў Xcode знайдзіце тэчку Entities у сваім праекце. Для выгоды ў вас ужо ёсць тры класа структур, але зараз мы будзем ствараць новы аб'ект з нуля.

Абярыце File > New > File ... / Файл > Стварыць> Файл ... або націсніце Command-N, каб стварыць новы клас.  Не забудзьцеся выбраць Cocoa Touch Class з падзелу iOS> Source. Назавіце клас Player і зрабіце яго падкласы GKEntity.

Creating a player entity

Вы ўбачыце, што адразу пасля адкрыцця вашага новага файла Xcode адлюструецца памылка. Каб выправіць гэта, дадайце наступны аператар імпарту ніжэй існуючагааператара import UIKit:

Вярніцеся да файла PlayerNode.swift і дадайце наступныя ўласцівасці да класа PlayerNode.

Затым перайдзіце ў тэчку Components / Кампаненты ў вашым праекце Xcode і стварыце новы клас такі ж, як раней. На гэты раз назавіце клас FlashingComponent і зрабіце яго падкласы GKComponent, як паказана ніжэй.

Creating a flashing component

Кампанент, які вы толькі што стварылі, будзе апрацоўваць мігценне нашай блакітнай кропкі, калі яна будзе сутыкацца з чырвонай кропкай і будзе знаходзіцца ў стане непаражальнасці. Заменіце змесціва FlashingComponent.swift на наступнае:

Рэалізацыя проста захоўвае спасылку на аб'ект SKNode і паўтарае дзеянні з'яўлення і знікнення, пакуль кампанент актыўны.

Вярніцеся да GameScene.swift і дадайце наступны коддзе-небудзь у метадзе didMoveToView (_ :):

Мы ствараем аб'ект FlashingComponent і наладжвальны яго так, каб выканаць яго мігценне на кропцы гульца.  Затым апошняя радок дадае кампанент у аб'ект, каб ён быў актыўным і выконваўся.

Стварыце і запусціце прыкладанне. Цяпер вы ўбачыце, што ваша блакітная кропка павольна знікае і з'яўляецца.

Fading blue dot

Перад тым, як працягнуць, выдаліце ​​код, які вы толькі што дадалі з метода didMoveToView(_ :). Пазней вы дадасце гэты код назад, але толькі тады, калі ваша блакітная кропка ўвойдзе ў стан непаражальнасці.

3. Механіка стану

У GameplayKit механізмы стану дазваляюць лёгка вызначыць і выканаць дзеянне для бягучага стану канкрэтнага аб'екта. Выкарыстоўваючы папярэдні прыклад, некаторыя магчымыя стану для кожнай вежы могуць ўключаць у сябе Active, Disabled і Destroyed. Адным з важных пераваг механікі стану з'яўляецца тое, што вы можаце паказаць, як адно стан пераходзіць у іншае. У трох прыкладах станаў, згаданых вышэй, вы можаце ўсталяваць механіку стану такім чынам, каб:

  • вежа магла стаць Disabled, калі яна Active, і наадварот
  • вежа магла стаць Destroyed, калі на Active або Disabled.
  • вежа не магла стаць Active або Disabled пасля яе Destroyed.

У гульні для гэтага ўроку мы хочам зрабіць гэта вельмі проста і ўнас будуць толькі нармальнае і непаражальным стан вежы.

У тэчцы вашага праекта State Machine стварыце два новых класа. Назавіце іх NormalState і InvulnerableState адпаведна, прычым абодва будуць з'яўляцца падклас класа GKState.

Creating an invulnerable state class

Заменіце змесціва NormalState.swift наступным:

Клас NormalState ўтрымлівае наступнае:

  • У ім існуе просты инициализатор, які захавае спасылку на бягучы вузел гульца.
  • Ён рэалізуецца з дапамогай метода isValidNextState (_ :) Рэалізацыя гэтага метаду вяртае лагічнае значэнне, якое паказвае, ці можа бягучы клас стану змяніцца ў клас стану, які прадстаўляецца параметрам метаду.
  • Клас таксама ўключае рэалізацыю метаду зваротнага выкліку didEnterWithPreviousState(_ :).  У рэалізацыі метаду мы правяраем, ці было папярэдняе стан станам InvulnerableState і, калі метад вяртае true, выдаляецца перарывісты кампанент з аб'екта гульца.

Цяпер адкрыйце InvulnerableState.swift і заменіце ягозмесціва наступным тэкстам:

Клас InvulnerableState очень падобны на клас NormalState. Асноўнае адрозненне складаецца ў тым, што пры ўваходзе ў гэты стан вы дадаеце перарывісты кампанент у аб'ект гульца, а не выдаляеце яго.

Цяпер, калі вашы класы станаў завершаны, адкрыйце PlayerNode.swift зноў і дадайце наступныя радкі ў клас PlayerNode:

Гэты фрагмент кода дадае новае ўласцівасць у клас PlayerNode і гэта зручны метад, каб вярнуцца внормальное стан.

Цяпер адкрыйце GameScene.swift і ў канцы метаду didMoveToView(_ :) дадайце наступныя два радкі.

У гэтых двух радках кода мы ствараем новы аб'ект GKStateMachin з двума станамі і паведамляем яму, якперайсці ў NormalState.

Нарэшце, заменіце рэалізацыю метаду handleContactWithNode(_ :) у класе GameScene наступным:

Калі сіняя кропка гульца сутыкаецца з чырвонай точкойврага, гулец уваходзіць у InvulnerableState на працягу пяці секунд, а затым вяртаецца ў NormalState. Мы таксама правяраем, якое бягучы стан гульца і выконваем толькі дзеянні суперніка, які знаходзіцца ў стане NormalState.

Збярыце і запусціце прыкладанне яшчэ раз і перамяшчацца па карце, пакуль не знойдзеце чырвоную кропку. Калі вы сутыкнецеся з чырвонай кропкай, вы ўбачыце, што ваша блакітная кропка ўваходзіць у яе непаражальным стан і міргае на працягу пяці секунд.

Entering the invulnerable state

Заключэнне

У гэтым уроку я пазнаёміў вас з двума асноўнымі аспектамі фреймворка GameplayKit, аб'ектамі і кампанентамі і механікай стану. Я паказаў вам, як вы можаце выкарыстоўваць аб'екты і кампаненты для структуравання вашай гульнявой мадэлі і змяшчаць усё ў парадку. Выкарыстанне кампанентаў - гэта вельмі просты спосаб сумеснага выкарыстання функцыянальнасці паміж аб'ектамі ў вашых гульнях.

Я таксама паказаў вам асновы механізму стану, у тым ліку тое, як вы можаце кіраваць пераходам ад аднаго стану ў іншы, а таксама, як выконваць код пры знаходжанні ў пэўным стане.

Заставайцеся з намі на працягу другой часткі гэтай серыі ўрокаў, дзе мы збіраемся перанесці гэтую гульню на іншы ўзровень, дадаўшы штучны інтэлект, больш вядомы як ІІ. ІІ дазволіць варожым кропках нацэліцца на гульца і знайсці лепшы шлях для дасягнення мэты.

Як заўсёды, калі ў вас ёсць якія-небудзь каментары ці пытанні, пакіньце іх ніжэй.

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.