104. [game] Взаимодействия юнитов на игровом поле. GameController и UnitActions

Game – Серия статей посвященных разработке flash-игр на языке ActionScript. Игры для соц.сетей и мобильных платформ iOS, Android.
http://flashpress.ru/blog/category/game/
Серия статей на тему использования анимации персонажей в коде ActionScript 3.0
  1. Анимация персонажа
  2. Анимация персонажа. Продолжение
  3. Управление анимацией персонажа с помощью клавиатуры
  4. Управление анимацией персонажа с помощью сенсорного экрана. Создаем мультиплатформенное приложение
  5. Взаимодействия юнитов на игровом поле. GameController и UnitActions
  6. Хочу продолжение > хочу

Вы читали все предыдущие статьи серии? Тогда вы знаете как написать контроллер для управления анимацией персонажа на игровом поле. Так же мы разбирали принципы создания кросс платформенных приложений, на примере создания игрушки для Web и iOS/Android платформ. А если таких юнитов(контроллеров) на игровом поле будет несколько? В этом случае нам нужны контроллеры для управления группой других контроллеров. В этой статье мы напишем базовый контроллер игры GameController, который будет осуществлять управление и взаимодействие между другими контроллерами. К концу статьи, мы заставим одного юнита атаковать, а другого получать урон в момент удара. Но все по порядку …

Создаем главный контроллер

Создайте в каталоге game/ каталог controller/, а в нем класс GameController:

Вот как будет выглядеть главный класс приложения GameApp:

Здесь должна быть флешка. Установите Flash Player


Конечно флешка не сильно отличает от того чтобыло раньше, но мы создали каркас контроллера для дальнейшего наполнения игровой логикой.


Взаимодействие юнитов

Если в предыдущем примере, нажать на клавишу пробел, юнит атакует, при этом противник стоит без движения – не очень красиво. Давайте сделаем так, чтобы противник получал урон в момент удара.

Здесь в обработчике события об атаке(метод attackHandler) мы проходим циклом по всем юнитам, и если найден юнит который стоит ближе чем на 100 пикселей к активатору – этот юнит получаем удар(wound). Вы можете сделать здесь более сложное условие, например надо бы сделать проверку кому принадлежит юнит, чтобы юниты не получали удара от своих – мы опустили эту проверку. Такая проверка осуществляется с помощью модели юнита. Модель – это класс который хранит всю информацию о юните, такую как:

  • Кому принадлежит юнит
  • Сколько у него жизней
  • Какой у него уровень защиты и т.д.

Подключение модели юнита(и приложения в целом) мы реализуем в одном из следующих уроков этой серии. Следите за выпуском.

Здесь должна быть флешка. Установите Flash Player


Попробуйте подойти одним юнитом к другому, используя стрелки на клавиатуре, а затем нажмите клавишу пробел для атаки. Вы увидите что активатор проигрывает анимацию атаки, а цель – анимацию получения удара. Правда выглядит не правдоподобно, потому что анимация получения удара проигрывается сразу, до того как активатор закончит свой замах. Попробуем решить эту проблему. Можно конечно подправить анимацию получения удара(wound) так, чтобы юнит в первые несколько секунд ничего не делал, и начинал проигрывать wound только через несколько кадров… а если будет юнит у которого подготовительное время для атаки чуть больше, например это маг, которому нужно время на прочтение заклинания из книги. Лучше это сделать так: откройте исходник анимации юнита, и на таймлайне, в середине анимации attack поставьте метку damage(в том месте где заканчивается замах для удара). Посмотрите пример исходников для двух юнитов здесь и здесь.

Для начала нам необходимо немного подправить классы отображения анимации юнита. Добавляем в AnimationData переменную которая будет сообщать на каком кадре стоит метка damage:


Класс UnitView будет выглядеть так:

Здесь мы просто сохраняем номер кадра где лежит метка damage.


Мы конечно можем реализовать обработку метки damage в классе главного контроллера, но если мы будем все действия реализовывать в одном классе, может получится так что этот класс станет очень большим и поддерживать его в рабочем состояние будет уже очень сложно, не говоря уже о дальнейшем развитии. Поэтому мы попробуем выделить процесс атака+получение удара в отдельный класс, который будет называться Действие(Action). Напишем для начала базовый класс Action для все действий которые мы будем писать в будущем:

Не очень то много кода в этом классе, но ничего, в будущем возможно у нас появятся куски кода которые будет необходимо выделить в базовый класс для всех действие. Не злоупотребляйте практикой создания базовых классов для всего подряд, это может усложнить систему, вместо того чтобы упростить – необходим баланс между универсальностью и легкостью понимания системы.

Класс-действие для атаки AttackAction будет выглядеть так:

Данный класс не воспроизводит анимацию wound сразу после наступления события attack. Мы подписываемся на событие ENTER_FRAME, и ждем пока не появится кадр с меткой damage. Как только такой кадр получен – проигырваем анимацию wound у всех юнитов, который стоят ближе чем 100 пикселей к активатору.


Измененный класс GameController:

Попробуйте теперь напасть одним юнитом на второго, вы увидите что получение удара происходит в нужный момент, и анимация в целом выглядет привлекательнее:

Здесь должна быть флешка. Установите Flash Player

Рефакторинг класса GameController

Обратие внимание как сократился объем кода в методе attackHandler, этим самым мы упростили класс GameController. Если продолжать рефакторинг, можно попробовать выделить код, который выделяем юнитов на поле в отдельный класс UnitSelectController, и поместить этот контроллер в главный контроллер GameController. Смысл этой операции в том, что главный контроллер может только управлять другими, более младшими контроллерам, и в нем нет низкоуровневого кода.

Главный контроллер приложения в итоге получится очень стройным, в котором нет ничего лишнего. Посмотрите какая красота:


Класс UnitSelectController который управляет выбором юнитов на игровом поле:

Такое выделение кода в отделыный контроллер удобно тем, что мы сможем при необходимости быстро изменить логику выбора юнитов. Например если вы хотите сделать так чтобы юниты выбирались не кликом мыши по ним, а с помощью кнопок с цифрами на клавиатуре. В этом случае вы сможете подменить класс так, что главный контроллер останется без изменений и даже не заметит разницу.

Опять же надо помнить что излишнее количество классов может усложнить систему. Не забывайте поддерживать баланс между универсальностью и управляемостью системы, чтобы она не вышла из под контроля!
Серия статей на тему использования анимации персонажей в коде ActionScript 3.0
  1. Анимация персонажа
  2. Анимация персонажа. Продолжение
  3. Управление анимацией персонажа с помощью клавиатуры
  4. Управление анимацией персонажа с помощью сенсорного экрана. Создаем мультиплатформенное приложение
  5. Взаимодействия юнитов на игровом поле. GameController и UnitActions
  6. Хочу продолжение > хочу
Game – Серия статей посвященных разработке flash-игр на языке ActionScript. Игры для соц.сетей и мобильных платформ iOS, Android.
http://flashpress.ru/blog/category/game/

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 1816 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




Комментарии Facebook:




Комментарии WordPress: