Показаны сообщения с ярлыком flash. Показать все сообщения
Показаны сообщения с ярлыком flash. Показать все сообщения

среда, 28 марта 2012 г.

The Game Of Life


Вчера подумалось, что я никогда не писал свою реализацию "Игры жизни" Конвея, хотя это, можно сказать, такая вещь, которую обязан сделать любой разработчик.

Недолго думая, сел и набросал за полтора часа свою версию на flash. Массивы для хранения ячеек решил не использовать - идеально подошла BitmapData, ведь все равно рендерить в Bitmap с нее. Интерфейс прикрутил на флексовских компонентах.

Поиграться можно здесь.

четверг, 22 марта 2012 г.

Linkage Class Generator



В очередной раз начиная небольшой проект на флеше, я обратил внимание что постоянно делаю одну и ту же рутинную операцию: создаю символ, добавляю на него разные элементы (текстовые поля и т.п.), ставлю ему export for actionsript и руками создаю нужный класс, где, по сути, еще раз описываю все созданные элементы полями класса.

Почему-то во флеше нет опции, которая бы автоматически генерировала файлы linkage-классов. Сначала я решил, что наверняка есть какое-то расширение, которое делает это, но, порывшись в Adobe Exchange примерно сорок минут и пересмотрев кучу страниц я понял, что писать его придется самому.

Оказалось, что написание расширений и команд - занятие довольное несложное, благо пишутся они на яваскрипте (мануал по JSFL) и в качестве панелек (если они нужны) используют обычные SWF-ки.

В общем, я написал свою команду, которая автоматически ищет папку с исходниками исходя из указанного в настройках source path и местоположения document class'а и автоматически генерирует в этой папке классы для выделенных в библиотеке символов. Легко и просто.

Расширение через три дня после отправки заапрувили на Adobe Exchange, так что оно доступно для установки по этой ссылке.

среда, 26 октября 2011 г.

Потеря фокуса для событий клавиатуры

Подписались на рассылку событий KeyboardEvent.KEY_DOWN со Stage и решили, что теперь все хорошо? Как бы не так. После нажатия на любую кнопку fl.controls.Button потеряется фокус и листенер перестанет срабатывать, даже если кнопку удалили со сцены.

Выход? В конце листенера нажатия на кнопку дописывать stage.focus = stage

Да, ActionScript 3 такой милый и хороший.

вторник, 20 сентября 2011 г.

Подлючение Flixel при работе с Flash IDE

Flixel - замечательный фреймворк для написания игр. Будучи бесплатным, написан он специально для pure-actionscript, но это не значит, что при создании игры на нем нельзя использовать Flash IDE.

Все, что нужно сделать, это сгенерировать темплейт для вашей игры при помощи вложенного в комплект поставки Flixel скрипта flx.py, после чего назначить созданный as-файл Document-классом вашего fla-файла. Если после этого ваша шаблонная игра скомилируется, то можно больше ничего не делать. Если же нет (к примеру, у вас не Flash CS5.5, а Flash CS4, как в случае с моим макбуком), то придется пройти еще один шаг.

Открываем класс org.flixel.FlxGame и находим там вот такую строку (скорее всего, под номером 33):

[Embed(source="data/nokiafc22.ttf",fontFamily="system",embedAsCFF="false")] protected var junk:String;

И комменируем неподдерживаемый параметр embedAsCFF:

[Embed(source="data/nokiafc22.ttf",fontFamily="system"/*,embedAsCFF="false"*/)] protected var junk:String;

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

Warning: 1090: Migration issue: The onMouseDown event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0. You must first register this handler for the event using addEventListener ( 'mouseDown', callback_handler).

Находим файл /Applications/Adobe Flash CS4/en/Configuration/ActionScript 3.0/EnabledWarnings.xml

В нем находим строку

<warning id="1090" enabled="true" label="kWarning_DepricatedEventHandlerError">EventHandler was not added as a listener.</warning>

и меняем enabled на false

<warning id="1090" enabled="false" label="kWarning_DepricatedEventHandlerError">EventHandler was not added as a listener.</warning>

Наслаждаемся.


пятница, 29 июля 2011 г.

Сохранение пропорций изображения при масштабировании в одну строку

Кстати, а как вы обычно сохраняеете пропорции картинки при масштабировании? Делите одну сторону на другую?

А ведь в as3 есть гораздо более красивый способ. Изменяете размеры картинки до нужных размеров контейнера, а потом восстанавливаете пропорции таким незамысловатым образом:

image.scaleX < image.scaleY ? image.scaleY = image.scaleX : image.scaleX = image.scaleY;

Ленивые могут скопипастить себе полный метод:

function resizeObject(target:DisplayObject, maxWidth:Number, maxHeight:Number, keepAspect:Boolean=true):void
{
    target.width = maxWidth;
    target.height = maxHeight;
    if (keepAspect) 
    {
        target.scaleX < target.scaleY ? target.scaleY = target.scaleX : target.scaleX = target.scaleY;
    }
}

воскресенье, 10 июля 2011 г.

Экспорт SWF в MOV и мувиклипы

Давно не приходилось экспортировать собранные swf-файлы в видео, а тут понадобилось - заказчику требовалось открыть получившийся анимированный логотип в Final Cut. Помнится, раньше (наверное, это было еще в Flash 5 - давно я не экспортировал видео) с экспортом swf в видео часто бывали проблемы - ролик получался с непроигрывающимися мувиклипами, застывшими на первом кадре и иногда даже неработающими фильтрами.

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

Но тут обнаружилось, что флеш теперь прекрасно экспортирует видео, но есть одна особенность - по умолчанию он проигрывает видео в памяти до последнего кадра главного таймлайна и останавливает запись. Соответственно, если в главном таймлайне у вас всего один кадр и в нем мувиклип кадров на шестьсот, то видео у вас все равно получится длиной в один кадр. Но есть и решение - смотрим длину мувиклипа по времени и выставляем его в настройках экспорта в  mov (на изображении ниже выставлено шесть секунд):


Теперь видеозахват не закончится, пока не проиграется ваш мувиклип.

среда, 22 июня 2011 г.

Заметка о SWFAddress

Есть замечателная яваскриптовая библиотека для диплинкинга в Flash, называется SWFAddress. В ней все замечателньно, но когда доходит до подготовки Flash-сайта к развертыванию, на последних стадиях верстки порой выясняется, что диплинкинг работает, но только наполовину: адрес в строке меняется, но браузерные кнопки "назад" и "вперед" ничего не делают.

Можно очень долго сидеть и дебажить, а разгадка, скорее всего, проста: нужно поместить загрузку SWFObject  раньше, чем SWFAddress на странице:

<script src="/js/swfobject.js" type="text/javascript"></script>
<script src="/js/swfaddress.js" type="text/javascript"></script>

среда, 20 апреля 2011 г.

Ошибки в работе flash.utils.getTimer

BlooDHounD тут рассказал в своем блоге на флешере об ошибке, которая порой возникает с методом getTimer из flash.utils на некотрых платформах и может стать критичной для работы приложений.

Обязательно к прочтению, на мой взгляд.

пятница, 15 апреля 2011 г.

Исправление ошибки с установкой расширений на Flash CS4 и CS5

Периодически на системах с установленной русской локалью приходится сталкиваться с ошибкой установки расширений для Adobe Creative Suite. Внешне никак не проявляется - вроде кликнул два раза по mxp-файлу с расширением для Flash, например, увидел запустившийся Adobe Extension Manager, который радостно сказал, что все установилось. Запускаешь после этого нужное приложение (тот же Flash IDE, например) и не можешь нигде найти установленное расширение.

В чем же проблема? Чтобы понять это, заглянем в папку <домашняя папка>/Библиотеки/Application Support/Adobe/Flash CS5/ (это для OSX, а для Windows, скорее всего, папка в <домашняя папка>/Application Data/Adobe/Flash CS5/ или как-то так).

Что же мы там увидим?


Расширения ставятся в разные папки для разных локалей. Проблема тут в том, что Extension Manager на русский язык переведен и ставит расширения в папку ru_RU, а Flash IDE русского интерфейса не имеет и берет расширения из папки en_US, где, естественно, нужного расширения не находит. Зачем было разделять расширения на локали - лично для меня загадка. Возможно, планировалась поддержка мультиязычных расширений, но если так, то надо же было дать возможность при отсутствии локализации откатываться к расширению из en_US. В общем, не совсем понятно почему так, но решить проблему можно.

воскресенье, 3 апреля 2011 г.

Асинхронное декодирование изображений в Flash Player'е

Thibault Imbert порадовал новостью о том, что в Adobe AIR 2.6 и в Flash Player начиная с версии 10.2 будет доступно асинхронное декодирование изображений. Зачем это нужно? Ну, при загрузке большого количества изображений или изображений очень высокого разрешения всегда начинались проблемы, т.к. их декодирование происходило синхронно, при обращении к ним. Добавляешь, к примеру, кучу спрайтов на экран в первый раз и получаешь тормоза. Или делаешь графический редактор и у тебя блокируется весь пользовательский интерфейс при первой отрисовке изображения.

Вот как выглядит все это на AS3:
// create a LoaderContext
var loaderContext:LoaderContext = new LoaderContext();
// specify async decoding
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;
// create a Loader
var loader:Loader = new Loader();
// inform the Loader
loader.load( new URLRequest("http://dl.dropbox.com/u/7009356/IMG_1398.jpg"), loaderContext )

Работает, кстати, и с Loader.loadBytes()

Вот еще видео с демонстрацией:

Async Bitmap Decoding in Adobe Flash Player from Thibault Imbert on Vimeo.