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

Введение в GameplayKit: часть 1

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

Russian (Pусский) 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?  Если вам нужно внести какие-либо изменения, вам придется изменить свой код более чем в одном месте, это достаточно утомительно и потом приведет к большому количеству ошибок. Но, что произойдет, если вы захотите добавить новый тип башни. Вы будете в третий раз копировать  и вставлять код?

Кажется, лучший способ разместить всю логику в родительский класс 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
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.