25.06.2009

Suitcase Construction 2 - Data Independence

Ek. Выбрал префикс для своего фреймворка. Раньше Ek казалось каким-то кривым, но со временем решился приписывать к названию основных классов этот префикс. После релиза можно будет делать библиотеку. DEVCENTER удален из проекта, вся сборка редактируется ручками. Утилиты по созданию ресурсов теперь думаю писать отдельным air приложением.
UI. Реализована почти вся механика простейшего пользовательского интерфейса. Не обошлось без экспериментов, но в целом все очень просто, как всегда. AS3 обладает очень хорошими возможностями по разбору XML, так что я не вижу ничего сложного написать за пару дней свой game-based интерфейс. Ведь тогда он будет обладать своей оригинальностью, а вы всегда будете точно знать что-где-как. Я не люблю когда в играх используют flex библиотеку. Мало того что она генерирует много бесполезного кода (в контексте дизайна игрового интерфейса, конечно), так ещё не все там там отлажено и быстро, во что многие стараются верить.
Data. Уровни и описания окружения вынесены в xml, теперь их можно создавать/редактировать "на лету". По ходу разработки туда уйдут все описания диалогов, расположение слотов, монстры/боссы и другое.
Game. В игре появились пользователи (профайлы) и полноэкранный режим. Чемодан в ярости, губка на измене. И вообще кажется, что Игра движется в правильном направлении, так что не хочу спойлить :3

summer time

Три хвостика. Теперь можно смотреть мультики.

18.06.2009

max/msp: floating dial

Расскажу немного про крутелки из предыдущего сообщения maxmsp: oneshot patcher.

Тут два варианта развития событий, которые ползают по зеленой и розовой ветке соответственно.
1. Сигнал поступает на вход. Тогда мы обновляет циферблат, подаём на выход и устанавливаем dial в нужное положение.
2. Пользователь крутит ручку, поэтому мы берем это значение подаем на выход и обновляем циферблат.

Команда "set" устанавливает значение таких элементов как dial, number и т.д. НО при этом объект не кидает это значение дальше. Если бы мы подключили это напрямую, то получилось бы кольцо и max выдал бы нам stack overload.

16.06.2009

IGDC 47: Run'n'Gun

Закончился 47-ой конкурс русских независимых разработчиков на тему Run'n'Gun. С первым местом полностью согласен, это Doj и его веселый хардкорный run'n'gun про очки.

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

Flash Render Performance

По опыту портирования Duckstazy, где я так же рисовал всё "вручную", я могу сказать: используйте draw и copyPixels только для post-processing эффектов :))) Потому что, как оказывается, flash 9 и flash 10 сами очень хорошо справляются с отрисовкой своих display объектов. Он автоматически вычисляет какие участки нужно перерисовывать, генерирует mipmap уровни для bitmapdata. Правда есть одна неудобная вещь. Если вы хотите чтобы у вашей картинки всегда считались subpixels, то по документации вы сразу думаете поставить PixelSnapping.NEVER в создание bitmap объекта... но если скейл 1 и rotation 0, то всё равно привязка пикселей работает. Чтобы это исправить можно поставить скейл в 0.99, это заставит flash считать subpixels и всё будет ГЛАДЕНЬКО :) Так что, ребята, не используйте отрисовку вручную там, где это flash сделает за вас очень быстро.

Ещё одна неприятность, с которой я столкнулся уже в suitcase project - это резкое снижение fps, если начинаешь быстро двигать курсором в области flash приложения. Понятно из-за чего. Непонятно почему, если это не interactive объекты. Исправляется просто, установкой mouseEnabled и mouseChildren вашего top display контейнера в false.

Помните, что непрозрачные битмапы рисуются на ПОРЯДОК быстрее. 2^n х 2^m картинки рисуются так же быстрее. Клиппинг начинает работать если устанавливать в контейнер-прослойку scrollRect области клиппинга. Хороший прирост скорости для top контейнера можно обеспечить установив scrollRect, opaqueBackground и cacheAsBitmap (что у меня вначале никак не укладывалось в голове).

На сегодняшний день этого не хватает, чтобы создавать хотя бы в 640*480 хорошие атмосферные игры, но нужно пытаться выжать максимум. Кстати, можно делать old-school графику, которая будет очень быстро рисоваться, т.к. софтварный smoothing очень жрёт производительность.

13.06.2009

max/msp: oneshot

Дож в комментариях написал, что ждёт подробнейших отчётов. Ну с того и начну. Я решил собрать oneshot коробочку и даже немного подзапарился. Пришло небольшое понимание логики маршрутизации сообщений и сигнала. Больше разобрался с объектом bpatcher (patcher-in-box), Пользуюсь теперь прототипами объектов, т.е. можно настроенный объект сохранить в прототип и потом быстренько создавать его копию где угодно. Начнём.

Создать oneshot казалось элементарной задачей, пока я не запутался в куче соединений. Ну как-то разобрался.



Коробочка на картинке сверху. Для нее потребовалось создать два своих dial объекта, т.к. стандартный dial работает с целыми числами. Мои крутелки принимают действительное значение, если этот параметр будет моделироваться из-вне, обрезают его, устанавливают крутёлку в нужное положение и передают значение на выход. На выход передаётся значение так же, если пользователь изменяет значение. Первая изменяется от 0.0 до 1.0, вторая от -0.5 до 0.5. Более подробно про крутелку. Больше ничего примечательного в коробочке не делал.


Схема имеет три входа, они слева сверху, первый - bang сообщение, чтобы проиграть звук, остальные два - скорость и громкость проигрывания. LOAD - вызывает сообщение replace, которое уходит в буффе и просит его загрузить какой-нибудь звук. После этого, когда звук загружен, узнаем о звуке что-нибудь. Имя файла из последнего выхода info~ добавляется к команде set и дальше в текстовое поле коробочки. Длина файла нужна, чтобы знать сколько играть. "#0buffername" - такое имя буферу нужно для того, чтобы каждая копия патча могла играть СВОЙ звук, а не общий. Генерация сигнала происходит с блоков line~ или curve~, которые находятся слава. Блок line~ справа используется, чтобы ограничивать длину проигрываемого отрезка. Что же play~ принимает :) Можно представить график линии x1=0, y1=(начальная позиция в буфере), x2=(время проигрыша), y2=(конечная позиция в буфере). Теперь понятно как делать реверс. А ещё вы знаете, что такое loop? Теперь я сразу представляю сигнал правобокой пилы. Здесь ещё сразу оговорю, что делает curve~. Как ни странно, этот msp-объект генерирует кривую. Для проигрывания это нужно для того, чтобы создать эффект нелинейной скорости. Можно использовать, но я делал это исключительно в познавательных целях. PLAY посылает bang в два блока, которые на уровене комментария "выстрел". В (gate 2) заходит через правый вход, это вообще несущий сигнал, просто gate его отправляет в соответствующий выход. Здесь конкретно выбор выхода зависит от параметра reverse. Второй блок, куда отправляется bang при выстреле, это левый вход блока (float), который получая такое сообщение отправляет сохраненное через правый вход действительное значение в выход. Тут ещё нужно сказать, что $N в сообщениях служит для подстановки в них соответствующих входных аргументов. Я думаю здесь все понятно, если нет, то пообщаемся в комментариях :)

Что вообще можно сделать с этим примитивным объектом? Ничего кроме познания. Дальше я собрал небольшую 16-ти тактовую дорожку.


Сверху чекер включает генерацию тактов от 0 до 15 в ритме 120. Дальше эти такты отправляются на блок select сверху, которая по-очереди зажигает соответствующие лампочки, это сделано просто для наглядности, что такты бегут :) Можно было сделать обычный number box. Далее номер такта формирует сообщение "getcolumn N" которое отправляется в матрицу. Матрица возвращает столбик для соответствующего такта и затем этот столбик распределяется между тремя select блоками, которые при подаче 1 отправляют bang в соответствующий ek_shot патч. Далее сигнал складывается и далее в ek_output. Ну вот запускаем и все играет.. Если есть вопросы - спрашивайте, может я где-то перемудрил.

На будущее.. Теперь просто необходимо разобраться с объектами, которыми можно сохранять/загружать параметры через xml файл. Посмотреть preset объекты.

12.06.2009

КРИ-2009

В этом году не получилось приехать на КРИ-2009. Тем больше интересно читать отчёты от тех, кто посетил конференцию.



OMG KRI PHOTOS by @Dagger

Зеух читал крутой доклад про spu render.
Соответственно отчёт КРИ-2009 от zeux'a.

Димочка, мой инди-дев друг, растянул публикацию своих отчётов почти на целый месяц.

Отчёты от alena-cpp.

Пкхмм! *ехидно* А это, как я понял, отчёт Журналистов индустрии, если кому интересно...



Все телесериалы ушли на летние каникулы, а анлим простаивает. Поэтому, сливаю видео доклада "Играя с Богом" Орловского.

PS. Experimental Gameplay Project уронили. 0 дней без сбоев.. :(

11.06.2009

max/msp learning #1

Всегда хотел создавать электронную музыку, понимать и управлять цифровым сигналом, алгоритмически создавать последовательности звуков, писать свои уникальные синтезаторы, фильтры и семплеры. И вот когда-то давно я читал про то, как autechre сами моделируют свои синтезаторы в max/msp среде. Залез на сайт разработчиков cycling '74 и увидел, что в этой среде работает так же Richard D. James (aphex twin). И вот, сижу учусь работать в max/msp :)


Сегодня собрал простенький патчер, который принимает стереосигнал и делит его на 4 канала для моих колоночек. Тумблер включения/выключения обработки сигнала. Регулятор громкости. Включение/выключение и изменение громкости задают огибающую линию, которая умножается на сигнал, тем самым устраняя его мгновенные разрывы. Иначе будут щелчки, что не очень приятно. Сделал инициализацию ручек при загрузке. Ну и соответственно тест-сигнал.

Конечно, все это элементарные вещи, ради тренировки. До музыки мне ещё да-ле-ко!

10.06.2009

MEGA64



MEGA64: пародии на видеоигры, всякое веселье и Marcus' Corner. Давно нужно было засветить эту передачу.

08.06.2009

Хвосты

Новые тачки,
старая компания..

02.06.2009

Suitcase Construction 1 - Sound FX

Для удобства сделал аудио систему, которая проигрывает звуковые эффекты, обрабатывает панораму и перезагружает ресурсы. Чуть позже она будет ещё музыкой управлять. Всё это очень удобно. Для тестирования наделал звуков в SFXR. Очень быстро происходит добавление новых ресурсов в связке с динамическим asset менеджером. Справа сверху, кстати, иконка звуков из моей тулзы для разработки :) SFX объекты пока приходится дописывать в xml, но это нормально.

Data-driven, как с тобой хорошо.. Я отправил знакомому гейм-дизайнеру версию. Мне приходит ответ, мол панорама не очень, слишком быстро затухает на расстоянии. Я: "поменяй параметр 0.003 на 0.001, значит, в ноде audio атрибут fading". Тем временем вернулся к коду, заменил экспоненциальное затухание на линейное. Запустил пару раз ромашку и убедился, что линейка совсем никуда. И мне сразу приходит сообщение от героя истории: "ставь и оставляй 0.002". Вот так золотая середина победила, и экспонента осталась. Всего за 3 минуты.

PS. Это первая запись для журнала разработки Suitcase Project ^____^