понедельник, 16 апреля 2012 г.

Первая игра на FlixelNME

Вот и вышла первая игра на FlixelNME -- Pakkuman's Defense -- это своего рода смесь Pac-man с Tower Defence. Автор игры - Ido Yehieli (Tametick)
Вот вольный перевод отрывка отзыва об игре с сайта http://www.indiegamemag.com:
А вы знали, что первоначально игра Pac-Man должна была называться Puck-Man - производное от японского “паку-паку” - хлопать ртом. А знаете ли вы также, что эта игра станет в сотни раз лучше, если в ней будут элементы товер дефенса? Pakkuman Defense - это одна из таких ретро-игр, в которых намешаны разные элементы. Но кроме обаяния, китча и чувства удовлетворения от уничтожения проклятых привидений в ней есть стратегическая глубина.
Смысл прост: вы играете в Pac-Man, но собираемые точки используются в качестве местной валюты для покупки башен, уничтожающих привидения. И такой простой прием резко меняет всю игру. Так как на поле расположено ограниченное число точек, то вы можете построить строго ограниченное число башен, поэтому важно выбирать наиболее эффективное расположение башен, так как привидения бесконечно респавняться. Случайный дизайн карт более сложный, нежели в оригинале, на них могут быть и тупики и множество мест, где вас могут окружить, поэтому размещение башен вдвойне важно. Другим ключевым моментом является то, что собранные на одном уровне точки переносятся на другой, и если вы потратите все свои деньги на одном уровне, то на следующем вас может ждать катастрофа.
По мнению автора обзора у игры есть два основных недостатка: это отсутствие жизней у главного героя (даже оригинальный Pac-Man не был так жесток в этом отношении) и немного "привередливое" управление, которое иногда не срабатывает. Хотя эти проблемы и вносят свой вклад в общую сложность игры, все-таки они не являются решающими.
Pakkuman Defense - это полностью новое и успешное осмысление идеи Pac-Man.

Игру Pakkuman Defense можно приобрести на сайте http://www.indiebuskers.net/ в составе Buskers Bundle. Данный комплект из 5 инди-игр продается по модели Pay-what-you-want (плати сколько хочешь) и на момент публикации этого поста было продано всего 435 бандлов.

UPD: Оказалось, что Pakkuman Defense - не первая игра на FlixelNME, до нее Ido Yehieli написал игру Fuel, повествующую об астронавте, вынужденном приземлиться на астероиде в поисках топлива для своего корабля:
Эта игра была создана в рамках конкурса 7DRL (Seven Day Roguelike Challenge) и поиграть в нее можно совершенно бесплатно (ссылки для скачивания доступны на странице игры).


суббота, 7 апреля 2012 г.

Обзор интересностей за март-начало апреля

Прошедший месяц был довольно насыщен событиями, связанными с flash-разработкой: это и выход flash player 11.2 и AIR 3.2 (добавившим поддержку stage3D на мобильных платформах), и публикация планов корпорации Adobe o премиум-фичах flash player (данная новость вызвала множество негативных отзывов у разработчиков). Но об этом Вы и сами наверняка знаете (если интересуетесь этой технологией). А в этом посте я хотел бы выделить несколько наиболее интересных для меня релизов:
1. Pixelizer - это фреймворк для написания игр на AS3, в основе которого лежит идея компонентов. Как пишет о нем сам автор, этот движок имеет гибкую структуру и легко расширяем. Текущая версия (0.4.2) для вывода графики использует блиттинг и включает компоненты для:
  • работы с текстом (который мне очень понравился и я собираюсь его внедрить в свой порт flixel);
  • систему обнаружения и разрешения столкновений; 
  • систему ввода данных (мышь и клавиатура);
  • поддержка вложенности компонентов;
  • spritesheets, animations and tilemaps;
  • звуковой менеджер;
  • систему кеширования объектов и т.д. 
 По моему мнению, он довольно перспективен, а его разработчик не намерен прекращать разработку и на страничке репозитория проекта можно увидеть дальнейшие планы по развитию проекта.
2. Molehill-версия известного теста производительности BunnyMark (на момент публикации сайт был недоступен, но скоро должен заработать) + серия уроков по созданию игры в жанре SHMUP. Эти статьи будут полезны тем, кто хочет разобраться и понять основы работы со stage3D для разработки двумерных игр. Ну а тем, кому неинтересна техническая сторона вопроса, а охота сразу приступить к созданию игр с поддержкой 3D-ускорителей, можно посоветовать обратиться к уже существующим фреймворкам (Starling, ND2D, Genome).
3. Axel2D - библиотека для создания 2D-игр с поддержкой 3D-ускорителей. Главной особенностью считаю то, что API этого движка практически один-в-один повторяет API Flixel, отличающегося исключительной простотой использования. Кроме этого в данном движке мне понравилась реализация систем частиц, позволяющая отображать одновременно сотни тысяч частиц при 60 fps.
Но так как этой библиотеке всего неделя, то есть и слабые стороны, а именно - отрисовка спрайтов, которая ведется отдельно для каждого из них, а не пакетно, что, конечно же, не позволяет работать одновременно с большим их количеством. Плюс имеются некоторые недоработки (по словам автора) с обработкой ошибок и инициализацией движка. Однако, как мне кажется, движок очень интересный и при некоторой доработке может стать преемником flixel (или может быть интрегрирован в него).
Это были главные для меня новости из области flash-разработки за прошедший месяц. А какие были для Вас?

четверг, 5 апреля 2012 г.

Динамическая генерация текстурных атласов

Давно задумываюсь: "А не попытаться ли перевести Flixel на Stage3D?" Сам автор движка обещал, что когда новая версия flash-плеера с аппаратной поддержкой 3D получит достаточно широкое распространение, то он добавит эту фичу. Но новостей от него пока не слышно; тема на форуме фликселя, посвященная планам по разработке новой версии, тоже довольно давно не обновлялась. Поэтому и мысли такие. Кроме того, в сети появилось несколько очень хороших уроков по stage3D, в которых рассматривается использование нового API для разработки двумерных игр. Из них можно вынести очень полезные сведения, связанные с оптимизацией графики:
  • необходимо минимизировать количество вызовов метода drawTriangles(), т.к. он довольно ресурсоемок;
  • также следует использовать как можно меньше текстур, т.к. размеры текстур могут иметь строго определенные значения (64х64, 128х128, 256х256, 512х512, 1024х1024 или 2048х2048). И если в Вашей игре используется множество маленьких изображений, для каждого из которых Вы будете создавать новую текстуру, то видеопамять будет расходоваться нерационально (в каждой такой текстуре будет много "пустого места") и довольно быстро закончится.
 Для решения этих проблем рекомендуется использовать "пакетный рендеринг" (не знаю, правильный ли я использую термин, на английском он пишется batch-rendering), при котором мы за один вызов метода drawTriangles() пытаемся отрисовать все полигоны, использующие одну и ту же текстуру. Для этого нам и понадобится генерация текстурных атласов, вынесенная в заголовок статьи и позволяющая значительно уменьшить количество текстур (о пакетном рендеринге я скорее всего напишу в следующей статье). Суть его в следующем: на входе мы имеем множество мелких изображений, а на выходе -- одно (это в идеале) большое. На русском языке уже есть, по крайней мере, одна статья от flash-сообщества, посвященная этому вопросу -- класс для генерации текстурных атласов, в ней дается исходник класса, использующий рекурсивный метод построения атласа. Данный класс мне показался не слишком понятным, а так хотелось самому разобраться в алгоритме, благо что в статье приведена ссылка на англоязычную статью по данному вопросу, из которой и становится ясен общий принцип.
Для хранения данных о субтекстурах (вставляемых в атлас изображениях) строится специальное дерево, в узлах (объекты класса Node) которого хранятся размеры, положение и прочая нужная информация. При этом каждый узел может иметь не более двух поддеревьев (левое и правое). Первоначально, когда наше дерево пустое, в нем имеется только один пустой корневой узел root. При попытке добавить в дерево новое изображение производится проверка, не превышает ли размер вставляемого изображения размера всего атласа. Затем осуществляется поиск подходящего по размерам пустого узла, в который мы можем вставить новую картинку, для этого должны выполняться 2 условия: узел должен быть "пустым" (не содержать в себе изображение и не иметь вложенных в него других узлов -- т.е. вставлять картинку мы можем только в "листья" дерева) и его размеры не должны быть меньше вставляемого изображения. Поиск таких узлов ведется с помощью нисходящего обхода в глубину, данный метод отличается тем, что он не является рекурсивным. О данном методе я прочитал в книге А.А. Кубенского "Структуры и алгоритмы обработки данных...", эта книга, к сожалению, уже нигде не продается (я бы купил себе эту книгу только ради диска с исходниками, которых не найти), но в сети можно легко найти отсканированный вариант. Поиск в дереве начинается с корневого узла и опускается ниже к "листьям", при этом приоритет отдается левым поддеревьям нашего дерева. Если в дереве находится отвечающий условиям поиска узел, то с ним проводятся следующие действия:
  1. В него вставляются два узла, общий размер которых равен размеру данного (родителя). При этом, как мы понимаем, узел может делится или по горизонтали, или по вертикали. Для того чтобы решить, как нам делить узел, мы находим разницу между ширинами и высотами этого узла и вставляемого изображения. Если разница по ширине окажется больше, то узел мы делим по горизонтали, в противном случае -- по вертикали (как на иллюстрации ниже).
  2. Берем первый из вставленных таким образом узлов и делим его снова на два узла. Размер первого такого "внука" будет равен размеру вставляемого изображения, а второй "внук" будет занимать оставшееся место (также см. иллюстрацию).
Вставка нового изображения в атлас
В общем, алгоритм не сложен, но требует понимания базовых структур данных и принципов работы с ними. Так что крайне рекомендую почитать какой-нибудь из соответствующих учебников.
Мою реализацию текстурного атласа (на as3) можно скачать здесь.