Как стать автором
Обновить

Разрабатываем игру на AS3 (Часть 2: мини-игра «Duck Hunt»)

Время на прочтение5 мин
Количество просмотров7.7K

рисунок 4
Duck Hunt

Цель: разработка компьютерной игры
Целевая аудитория: начинающие, интересующиеся, зеваки
Инструменты: ActionScript 3.0


Содержание цикла





Введение


В предыдущих выпусках...
  • Возможно, слегка размытое введение;
  • Определён некоторый набор замечаний;
  • Созданы и описаны требуемые инструменты;
  • Поставлена задача для настоящей части.


Вдохновением для мини-игры стала старая тёплая "Duck Hunt". Однако повторение чего бы то ни было практически лишает этот процесс творчества, превращая его в скучную рутину. Да и копии такой игры, скорее всего, уже есть (осторожно, можно получить эстетический шок от полёта уток). Необходимо помнить, что создаётся небольшая игра, поэтому не стоит перегружать её лишними особенностями (и так есть довольно забавные вариации).
Будем делать некоторую сборную пародию на старенькие компьютерные игры, тем самым обосновав любое замеченное использование предметов чужого авторского права, на которые делается пародия.



Эскиз


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

рисунок 5
Duck Hunt. Эскиз


Прототип



Замечание 10:
Для абстрактных целей можно было бы придумать какую-то простенькую анимацию (статический чёрный квадрат), но т.к. у меня уже была анимация для уток, то я счёл допустимым создавать сразу нужные мне цели. На рисунке 6 представлена простая UML диаграмма:

рисунок 6
Duck Hunt. UML. Диаграмма разработанных классов
На абстрактном экране CDisplay летают абстрактные цели CTarget, которые выпускает CTargetEmitter, используя для этого абстрактную фабрику целей CTargetFactory. Пользователю предлагается сбивать цели абстрактным оружием CWeapon (с магазином выстрелов CWeaponMagazine).
На рисунке 7 приведён снимок экрана получившегося прототипа.

рисунок 7
Duck Hunt. Прототип
Утки CDuckTarget extends CTarget становятся целями, которые предлагается уничтожать из однозарядной (CSniperRifleMagazine extends CWeaponMagazine) снайперской винтовки CSniperRifle extends CWeapon.


Замечание 11:
CRandomTargetFactory extends CTargetFactory позволяет объединить разные фабрики целей в одну, таким образом, CTargetEmitter может выпускать разные цели по определённой стратегии (в данном случае псевдослучайным образом).

Игра CGame — это последовательный набор раундов CRound, которые нужно отображать на экране. А общая статистика CStatistic игры складывается из статистики за каждый раунд. CRound несёт в себе всю необходимую информацию для того, чтобы в него можно было играть: сколько и с какой скоростью выпускать целей, какие эффекты использовать, что считать за успешное завершение раунда и т.д.


Сравнение разработки с использованием и без использования модульного тестирования
Ответ на один из вопросов г-на meiciuc.
Зачем модульное тестирование в ActionScript? А чем ActionScript так плох? Ну хорошо, не надо перечислять. Я хотел сказать, что модульное тестирование — это зарекомендовавшая себя практика вообще. Попробуйте почитать:
  1. Is Unit Testing worth the effort? [closed];
  2. Как не выстрелить себе в ногу;
  3. Об использовании модульных тестов и TDD.

Теперь задам свой вопрос иначе: чем так хорош ActionScript, что для него не будет это работать?

Следует обозначить, что сначала игра была реализована в виде программы в почти один класс, который в «лучших традициях» делает всё. На рисунках 8 и 9 можно посмотреть на снимки экрана данного творения. Этот вариант даже остался доступен в Git: alx.duckhunt.CDraft.

рисунок 8
Duck Hunt. Первая версия

рисунок 9
Duck Hunt. Первая версия
Как видите, очень похоже на то, что мы получили как «прототип».
Данное творение разрабатывалось «на коленке». Так что действительно у меня была возможность сравнить разработку с использованием и без использования модульного тестирования. Я даже вёл учёт времени, так что мог бы поделиться и конкретными цифрами, но, если честно, разработка велась от случая к случаю, и будет не совсем корректно производить это сравнение. На время влияло слишком много факторов. В конечном счёте, я даже отказался от идеи вести журнал потраченного времени.
Я бы хотел отметить, что вы можете ознакомиться с крайне простой структурой alx.duckhunt.CDraft. Возможно, тестирование здесь было бы лишним. Однако посмотрите на то, что получилось в этой статье (дальше будет ещё сложнее). Как только сложность проекта переходит из односложной поделки на коленке в что-то более сложное, выигрыш от применения даже частичного модульного тестирования становится ощутимым:
  • Проводить рефакторинг легче;
  • Исправлять ошибки, и, что немаловажно, не допускать их «реинкарнации» легче;
  • Повторно использовать код, а не ошибки, легче;
  • Время поиска ошибки разрабатываемого приложения много меньше (Субъективно).

Конечно, если вы разрабатываете баннер на Flash, всё это будет вам не нужно.

Вопрос заслуживает отдельной статьи, которую я не планировал писать.


Кстати...
  1. Применён шаблон проектирования Абстрактная фабрика [CTarget; CTargetFactory], [CDuckTarget; CDuckTargetFactory], [CCloudTarget; CCloudTargetFactory];
  2. Применён шаблон проектирования Фабричный метод CWeapon::createMagazine;
  3. Применён своего рода шаблон проектирования Компоновщик [CTargetFactory; CRandomTargetFactory];
  4. Применён шаблон проектирования Наблюдатель [CDisplay; IDisplayListener], CWeapon implements IDisplayListener; CGame implements IDisplayListener.




«Duck Hunt»



Замечание 12:
Хочу огорчить, но идея встраивания мини-игры в другую игру постепенно перестала мне нравиться по определённым эстетическим причинам. Поэтому вы её, скорее всего, не увидите в этой роли. Но будем последовательны, оформим игру как отдельную, не пропадать же добру.
Не будем обсуждать здесь, какой из меня «дизайнер». CDuckHuntGame extends CGame добавляет в нашу мини-игру пользовательский интерфейс и некоторое оформление.
CNickGenerator — это простой генератор забавных ников, свойственных одной известной игре.
Облака определяются как цели обычным образом (CCloudTarget extends CTarget, CCloudTargetFactory extends CTargetFactory). Уничтожать такие цели не нужно, поэтому они выведены за пределы текущего списка целей. Фабрика умеет из облака-примитива генерировать анимацию для облаков различных размеров. На рисунке 10 можно полюбоваться на пример того, что получается.

рисунок 10
Duck Hunt. Демонстрация облаков
На рисунке 11 приведён снимок экрана получившейся игры.

рисунок 11
Duck Hunt

Замечание 13:
В статью SWF-ролик не вставить, а мой сайт на бесплатном хостинге явно не будет рад даже относительно небольшому наплыву посетителей. Я решил поискать площадку, где я бы мог разместить свой ролик, и он бы был доступен всем желающим. В процессе поиска нашёлся сервис «rawgit.com», который предоставляет замечательную возможность открыть файл, размещённый на «github.com», прямо в браузере.
Демонстрация игры (внимание! звук!).


Замечание 14:
Если вы будете пытаться самостоятельно собрать SWF-ролик, то обратите внимание, что для того, чтобы все утки были на месте, их сначала нужно удалить из проекта, а потом снова добавить. Вот так странно работает Flash. Исправление этой ситуации мы получим позже, когда появится инструмент настройки контекста приложения.


Заключение


В следующем выпуске:
  • Мы вернёмся к утилитам: инструмент тестирования и инструмент настройки контекста приложения;
  • Учтём ошибку первой статьи: там будет, во что поиграть.



Теги:
Хабы:
+4
Комментарии9

Публикации

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн