четверг, октября 30, 2008

Дублируем DisplayObject. AS3

Как известно, дублировать как в AS2 клипы уже нельзя - нет такого метода. Странно конечно, и зря. В шаблонной структуре приложения это было бы очень полезно.

Но в AS3 есть множество средств, которыми можно это сделать. Для начала, порыщем в Google.

Duplicate Movie Clip Action Script 3 (взято у Senocular, в котором есть этот исходник).
Этот метод уже стал классикой, судя по тому, как много на него ссылается блогов и форумов. Он также описан на Flashere. Идея такова: извлекается класс исходного дисплей-объекта var targetClass:Class = Object(target).constructor;, инстанцируется, и в него переносятся основные свойства исходного дисплей-объекта.

as3 duplicate DisplayObject. Здесь класс исходного дисплей-объекта получается аналогичным образом. Отличие лишь в том, что передаваемые свойства автоматически извлекаются посредством рефлексии - метода describeType.

Creating Class Instances from a DisplayObject in AS3. Здесь имя класса получается более хитрым способом - из строки, возвращаемой getQualifiedClassName. Затем, getDefinitionByName возвращает класс исходного дисплей-объекта.

Других, более вменяемых способов решения я пока не нашел. Почему "более вменяемых"? Да потому, что все эти способы имеют одно очень существенное ограничение. Они не дублируют произвольный дисплей-объект. То есть дублируемый объект должен обязательно иметь обозначенное в Linkage имя класса. Если мы протрейсим имя класса произвольного клипа, это будет MovieClip или SimpleButton, а инстанцируя их, мы получаем просто пустые клипы.

Таким образом, дублировать клип вышеперечисленными способами нельзя если клип не имеет имени класса в Linkage.
Это еще полбеды. Ведь мы всегда можем просто взять, да и указать это имя.
Но.
А если мы внедряем в наше приложение некий клип при помощи [Embed] , который в дальнейшем надо распарсить и что-то в нем дублировать?
Это что-то мы никогда не сможем дублировать, т.к. никакие Linkage-классы из внедряемой библиотеки не распознаются - они не переносятся в ApplicationDomain.

Кстати, интересное замечание по второму способу с рефлексией: describeType для объектов из внедряемой библиотеки выдает тэги описания свойств как "accessor", в то время как для объектов из подгруженной библиотеки - "variable".

Итак, вывод - универсального решения нет, и выход один - всё делать "ручками". Или я ошибаюсь?

* * *

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

* * *

Да, интуиция поискать по запросу loadBytes не подвела. Внедрил SWF вышеуказанным способом, загрузил через Loader.loadBytes. Отлично! Даже фреймовые скрипты работают. Всё как обычный Loader.load.

Единственная оговорка: Я загружаю классы в ApplicationDomain.currentDomain. При этом, параметр checkPolicyFile необходимо установить в false:
var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);

Еще раз спасибо Garbage Collector. Глядя на дату спасительного поста, я понимаю, что здорово отстаю :(.

среда, октября 29, 2008

Снимаем сливки с FlashGamm

Мы, кто поленился/не смог/не захотел поехать в Киев на Flash Game Meeting, грыз ногти и рвал волосы на голове от сознания собственного бессилия, затаив черную зависть, рассматривал отчеты и фотки с довольными и улыбающимися лицами, и выжидал, выжидал сглатывая слюну, когда же наконец поступит информация не про невообразимые впечатления, чудесную организацию и респекты, а про Flash, деньги и эти чертовы игры.

Теперь ликуйте! Читайте! Ха-хахаа! Вот они! Здесь! Доклады! Даа! Презентации! И мы станем участниками FlashGamm!

Презентация от Badimа.
Запоминаем: freeonlinegames.com, agame.com, gimme5games.com, yougame.com, flashgamelicense.com, mochiads.com, cpmstar.com, gamejacket.com, blog.elite-games.net. Ха-хаа! Теперь мы станем еще богаче!

Мало. Черт, мало! Подождем пока.

* * *

Вот, пошло-поехало! Сейчас посмотрим, чем они там занимались:
Презентация от Xitri: Использование флэш-игр в рекламе. Кто догадался в архивы их засовывать... Места на сервере что ль не хватает?
Игровой банер, честно говоря, странная идея для банера. Убедит в обратном? Смотрим.
Не, не убедил. Закон банера - заставить юзера кликнуть и впарить ссылку. Можно как-то еще использовать "следование за мышкой", но клик должен быть один, а про клаву я совсем молчу.
Хотя, для имиджевой рекламы, пожалуй, вполне сгодится. Пожалуй убедил. Еще бы послушать сам доклад, конечно...

Презентация от Mokus: Архитектура ММО на основе платформы Flash.
Немногословно... Не в пример предыдущей. Хоть бы аудио-треки прилагали, что-ли. Смотреть без объяснений бессмысленно.

Презентация от Ильи Курылева: Поиск инвестора под браузерную игру. Презентация очень вменяемая, представляю, какой интересный был доклад. Информация, на мой взгляд, очень ценная, хотя я в этой области совсем не ориентируюсь. Но общее представление и кучу незнакомых слов я получил. Спасибо! Про РБК сказано верно. Сейчас тут полный дурдом...

Презентация Ada Chen. Making Money From Web Games – The Pain Free Way. Представитель Mochi Media - компании, предоставляющей нам возможность зарабатывать на наших flash-творениях. Отпишем несколько названий: Armor Games, Crazy Monkey Games, Hallpass, AddictingGames, Kongregate, FlashGameLicense, Microsoft, King.com, MyGame.com, Shockwave, Meez, Candystand, MTV, IGA, Double Fusion, WildTangent, Nonoba, Mindjolt.

Презентация Семён Фриш: Флеш казино - интерфейс, игры, административная часть. Странная презентация - swf почти 3 Мб и всего несколько слайдов... В общем всё понятно. Без доклада имеет малую ценность. Да вообще, по мне, так делать казино - дело скучное и невысокоморальное.

Презентация от Стефан “memphys” Кейш: “Социальное волшебство”, или как продавать дороже. (Пока не смог посмотреть - закрыт доступ к rapidshare.com).

Пока всё что есть. Осталась Альтернатива и некий Tom Krcha.

* * *

Презентация Антона Волкова: Как сделать игру с помощью AlternativaPlatform. Да... Ребята хорошо подготовились. Презентация в html-формате. Текста почти нет, зато какие демки! И еще игра прилагается: ballance (подглючивает правда, но вообще, конечно, очень впечатляет).

понедельник, октября 27, 2008

Имитация воды

Сегодня на повестке дня - эффект имитации ряби на поверхности воды. Воду имитировать не так сложно, есть разные подходы.

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

Поглядим, какие эффекты делают наши коллеги:

Realistic Flash Water Effect - AS2. Вода получается сочетанием Bitmap.perlinNoise и DisplacementMapFilter. Вода смотрится вполне реалистично, если не считать недостатка отсутствия перспективы.
Кстати, мой коллега разрабатывал flash-заставку для Алых парусов. Он изначально сделал ставку на искажения водяной поверхности при помощи именно такого метода. Увы, требования заказчика по производительности были столь высоки, что эффект пришлось убрать... А было очень сильно сделано. К сожалению, фильтры на больших площадях очень медленны.

Здесь: Water effect, обошлись без фильтров и сделали всё масками. Смотрится конечно слабовато да и работы многовато. Но, для тех, кто не хочет дружить с flash-программированием, то вполне сойдет.
Сюда же отнесу и вот этот вариант: Flash Water Effects - пример для совсем начинающих.

Довольно продвинутый способ создания ряби, плюс имитация подводных каустиков: Water caustic effects with Flash/AS2. Демка смотрится довольно свеженько, но как-то не совсем реалистично. А всё из-за того, что карта подводных каустиков не генерируется, а является секвенцией. И сгенерирована она специальной программой, неким Caustics Generator. Что же, такой подход тоже имеет право на существование и, возможно, пожертвовав памятью на секвенцию карты, мы выиграем в производительности. А я думаю, что для того, чтобы на лету генерировать такую графику, ресурсов надо прилично, да и алгоритм еще поискать/разработать придется.

Смотрим далее: несравненный блог #Laboratory Andre Michelle и эффект Water. К сожалению, для него нет исходников. Приходится просто любоваться...

Продолжаем любоваться на воду: Rain Drop Water Effect. Сайт предлагает купить flash-компоненты с различными эффектами. Мы, безусловно, вежливо отказываемся и продолжаем рыскать.

Люди выкладывают исходный код на форумах: например, здесь - water effect. Правда нет демки, а прежде чем потратить время на проверку, хочется знать, ради чего. Пока пропустим, но будем иметь в виду.

По соседству лежит еще код: is this water effect possible in AS3? Он позволяет скрывать/появлять изображение с эффектом искажения. Как-то не очень...

Следующий претендент: Water ripples revisited (AS3-only version). Вот это то что надо! Есть Демка с "волнующейся" поверхностью и исходники. Думаю, здесь стоит остановиться и поэкспериментировать. О результатах обязательно отпишусь. Добавлю, что сам блог еще свежий, но пестрит очень любопытными демками с исходниками.

Попутно нашелся вот такой эффект: interactive water AS3 experiment. Из крана течет вода, которую мышкой можно потрогать. Выглядит интересно. Вообще, видно, что автор любит забавляться с партиклами и это у него хорошо получается.

Пока это всё, что я смог нарыть про эффект водяной ряби. Причем, помню, что видел еще что-то стоящее по этой теме, но, увы не смог найти. Буду рад помощи.

* * *

Вспомнил еще одну статью по анимации воды: Море воды - программная анимация и не только, и здесь же: Еще раз о воде - самый главный секрет. Очень полезные примеры имитации воды с помощью анимационных приемов и капельки программирования.

* * *

Уже поступают новые решения: Облака с отражением в воде - генеруемые облака, отражающиеся в генерируемой воде. Думаю, если подобрать хорошее сочетание цветов, можно получить довольно реалистичную картинку. Вот еще демка, правда без исходников.