Инструменты создания искусственного интеллекта

Недавно съездил с докладом на Casual Connect. Как обычно бывает после подобных встреч, вернулся с массой впечатлений. Час общения с компетентными людьми даёт больше опыта и знаний, чем пол-года сёрфинга в сети. Поэтому в очередной раз советую всем: посещайте такие мероприятия как можно чаще и не пропустите FlashGamm, который пройдёт 4-5 декабря в Киеве (я там тоже буду).

Но сейчас не об этом. Выкладываю свою презентацию с CasualConnect Kiev 2010, а также код и небольшой пример как с ним работать.

[kml_flashembed movie="http://xitri.com/wp-content/uploads/2010/10/cc2010.swf" height="412" width="550" /]

Цель доклада — немного изменить подход к программированию ИИ персонажа. Иными словами — как задать персонажу сложное поведение во время игры, когда он выполняет большой набор действий и принимает новые решения. В качестве «умного» объекта могут быть не только бегающие в игре объекты. Это также может быть «окружающая среда» (например, уровень игры, который напускает на вас противников, когда вам легко играть или подкидывает аптечку, когда у вас мало жизней). Читать далее Инструменты создания искусственного интеллекта

Заготовка для флеш-игры или как сделать себе приятно

Раньше я считал флеш-игру сделанной, когда в неё можно было начать играть, нажав Ctrl+Enter во флеше. И почему-то я не учитывал что нужно ещё сделать странички с заставкой, главным меню, настройками и т.д. Хотя часто этот процесс может отнять несколько дополнительных дней. А ещё обиднее, если эти дни не учитывались при оценке стоимости игры. Вообщем, каждый раз к самой игре нужно разрабатывать ещё и саму оболочку-интерфейс. Со временем это становится неинтересно и хочется как-то использовать свои предыдущие наработки. Можно взять свою предыдущую работу, выкинуть оттуда всё лишнее и на тебе — интерфейс готов. Чтобы даже на это не тратить время, полезно иметь под рукой прототип интерфейса-оболочки для flash-игры.

Я просто выложу исходник и поясню как там всё работает. Это первый код на AS3, опубликованный здесь мною.  Статья также будет полезной тем кто хочет перейти на 3-ю версию ActionScript, но ещё не сделал этого. Сам пример и ниже пояснения к нему:

[kml_flashembed movie="http://xitri.com/wp-content/uploads/2010/10/interfaceas3.swf" height="400" width="550" /]

Код писался во FlashDevelop, компиляция при помощи FlexSDK. Вся графика зашита в SWC библиотеки, которые встраиваются в проект.

Тем кто не понял что я только что написал, дальше небольшой ликбез в помощь:

Вводная

Так получилось, что редактор кода во флеше (Flash IDE) очень убогий. Для меня загадка почему Adobe не придаёт этому большого значения. Возможно чтобы люди покупали ещё и Flash Builder. Так или иначе, большинство опытных программистов пишут ActionScript код во внешних редакторах (используя кучу возможностей: шаблоны кода, автоподсказки и автозавершение кода, генерация кода, рефакторинг и многое другое), а Flash используется только для рисования и анимации, а иногда, вообще обходятся без него.
Мне кажется что FlashDevelop — самый простой и удобный редактор для создания AS3 проектов. Возможны несколько режимов работы во FlashDevelop:

  1.  Вы пишете в FD только код, а флешку компилируете во Flash IDE (так называют наш любимый Adobe Flash) — это самый простой способ, который требует минимум изменений в своём сознании. Вся графика остаётся во FLA-файле.
  2. Всё — и написание кода, и компиляция — делается в FD. Но для этого нужно дополнительно скачать FlexSDK, Java и Debug Flash Player (чтобы наблюдать trace и сообщения об ошибках). Графику в этом случае удобно упаковывать в SWC-библиотеку (галочка выставляется во флеше в Publish Settings). Потом эта библиотека подключается в проект в FD и вы можете использовать всё что нарисовали.

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

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

По сути дела

В проекте 2 SWC-библиотеки: одна содержит графику интерфейса, другая нужна для графики самой игры.
Я предпочитаю такой подход к работе с графикой: для любого значимого объекта создаётся отдельный класс, а графика создаётся внутри него через оператор new (таким образом я могу расширять мой класс от любого другого, а не только от Sprite или MovieClip).

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

Я сделал стандартный набор страниц. которые обычно вставляют во флеш-игрушки: Меню, Инструкции, Настройки, Таблица рекордов и Авторы.

Чтобы добавить свои страницы, вам нужно сделать следующее:

  1. Создать во флеше клип с графикой для вашей страницы (в файле lib/pageUI.fla) и выставить в свойствах ему экспортный класс, указав базовым классом flash.display.Sprite — так меньше памяти расходуется.
  2. Создать класс страницы, расширив BasePage.
  3. “Зарегистрировать” страницу методом pageManager.register(). Таким образом он узнает об этой странице и подпишется на её внутренние события. У меня в примере регистрация происходит в классе Main

Переключить страницу можно двумя способами: pageManager.showPage(pageClass:Class) — если у вас есть ссылка на объект PageManager или разослав событие PageEvent.NEED_PAGE из класса страницы (в примере переключение так и работает).

Смена страниц  происходит не моментально, а плавно. Если хотите изменить, перепишите методы show() и hide() в классах страниц (или измените в базовом классе). Важно только знать, что после появления или скрытия страница рассылает соответствующее событие. Например, если использовать TweenLite, то переход может быть типа того:

public function show():void { 
        visual.alpha = 0;
        TweenLite.to(visual, 1, {alpha:1, onComplete:function():void{dispatchEvent(new PageEvent(PageEvent.SHOW_COMPLETE))}});
}

Если же какие-то страницы вам не нужны, просто не регистрируйте их и удалите соответствующие классы и клипы.

Страница GamePage — это по сути контейнер для самой игры. Пихайте её сюда и проверяйте как работает.

Для тех кому влом переходить на сторонний редактор, в папке src лежит InterfaceAS3.fla. В нём тоже можно компилировать, правда без прелоадера.

Исходник для скачивания GameInterfaceAS3