вторник, декабря 25, 2007

От AS3 к AS2. Впечатления.

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


  1. Сортировка массива методом sortOn(): не проходит сортировка по полям-возвращателям get.
  2. Работа с классом Tween не изменилась кроме обработки событий.
  3. При работе с классом EventDispatcher возникла любопытная путаница. В AS3 в addEventListener вторым параметром идет метод обработчика, а в AS2 - объект, который содержит метод с именем события. Так вот, если оставить имя метода во втором параметре, именно этот метод и вызовется. Но область видимости будет принадлежать объекту, пославшему событие.
  4. Готовность классов клипов: в AS3, из конструктора класса (к примеру MovieClip) сразу полностью доступны все содержащиеся в нем клипы. В AS2 же, из конструктора не доступны свойства классов (с которыми ассоциированы клипы) внутрилежащих клипов, и доступ к ним будет возможен только на этапе события onLoad.

В остальном - простая замена классов, переработка событийной модели и т.п. Производительность незначительно упала.

Кроме того. Возникли странные проблемы с закэшированными в таймлайне клипами. Если клип с cacheAsBitmap=true менялся внешне (rotation,tint и т.п.):

  • При AS3 с компиляцией под FP9 всё Ок.
  • При AS2 с компиляцией под FP8, всё Ок.
  • При AS2 с компиляцией под FP9 с ним просто ничего не происходит.

понедельник, декабря 24, 2007

Flash 9 & Zinc. Интенсивная векторная анимация. Обвально съедаются рессурсы производительности

Задача - screensaver. Небольшой флэш-ролик (Flash 9, AS3) с довольно интенсивной векторной анимацией внедряется в Zinc-проектор. По истечении некоторого времени процессор забивается полностью и клип воспроизводится как "слайд-шоу".
Подозрение на то, что внедряется какой-то левый Flash Player 9 ActiveX, т.к. при проигрывании в обычном флэш-плеере или флэш-проекторе такой проблемы н возникает.

* * *

Вышеописанная проблема повторилась и при сборке Zinc-проекта на других компьютерах.
Используемая версия - Zinc 2.5.23. Она же и объявлена виновником.

* * *

При сборке в более свежей версии Zinc проблема пропала, но появилась новая - собственно купить эту свежую версию. Однако, времени на выбивание денег и другие бюрократические процедуры уже не было, и решили, что быстрее всё перевести в AS2, под которым всё работает как часы и поныне.

среда, декабря 19, 2007

Игровой сервер SmartFoxServer. Обзор, установка под Windows и тестирование

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

Смотрим ссылки:
http://www.smartfoxserver.com/ - главный сайт продукта.
http://www.gotoandplay.it/ - сайт производителя, также посвященный разработке веб-игр, и, на сколько я понял, продвигающий вышеупомянутый продукт.

Говорят, что это мощная платформа для быстрой разработки ("быстрой" - это основная тема) многопользовательских приложений и игр на Macromedia Flash MX, MX 2004, 8, Flex 2 and Flash CS3.
5 доводов за использование SmartFoxServer:


  1. Много крупных проектов известных компаний используют на эту платформу: Showcase.
  2. Умеренные цены. Продукт разбит по функциональности на 3 категории, а ценовая политика каждой категории основана на количестве пользователей (подключений).
    BASIC Edition - от 200 до 800 евро.
    PRO Edition - от 500 до 2000 евро.
    Версию Lite можно даже не рассматривать.
  3. Высокие производительность и надежность: Benchmarks.
  4. Мощная поддержка продукта: хорошо подготовленная документация и форум (другой форум).
  5. Говорят что обожают свой продукт и игры, а также обещают светлое будущее для всех разработчиков веб-игр, которые сядут на их платформу.

Кроме того:

  • Есть библиотека компонентов для работы с сервером.
  • Содержит мощный веб-сервер, может работать без помощи других серверных приложений.
  • Может устанавливаться на все основные ОС: Windows (NT/2K/XP/2003), Linux, MacOS X (10.3 or higher), Solaris и т.д.
Все гладко и красиво. А что же говорит наш брат флеш/веб-девелопер про этот продукт? Пороемся-ка на Flasherе - место, куда я всегда лезу если надо что-нибудь поискать - море информации, в остальном тут делать нечего. Отфильтровав ворчание __etc и дебаты не по теме, видим примерно следующее:


  • Забаненый Antares: "SmartFox Server используют профессиональные производители игр, авторы gotoandplay.it"
  • Miramax: С SmartFox без знания JAVA тебе и версия PRO не поможет.
  • Flskif: "В PRO версии есть такая вещь, как Server Side Extensions, которые, ВНИМАНИЕ, можно писать на AS !http://www.smartfoxserver.com/docs/ -> SmartFoxServerPRO -> Introduction to extentions"
Порыл другие источники. В итоге, резко отрицательных мнений не встретил. В общем, народ либо пользовал эту платформу, либо с ней знаком. Кому-то кажется дорогим удовольствием, кто-то пользует свои наработки.
С деньгами проблем у нас нет, поэтому продолжаем смотреть в сторону этого коммерческого проекта.
Кроме того, существует несколько альтернативных решений, включая опенсорсные, но игровая специфика присутствует не во многих. SmartFoxServer все-таки позиционируется именно как игровой сервер.

Теперь попробуем скачать и установить SmartFoxServer.
Выберем PRO-версию и скачаем версию для Windows. Устанавливаем. Ничего сверхсложного.
Запускаем "Start SmartFoxServer". Появляется консоль, что-то начинает устанавливаться, запускаться. В итоге имеем надпись "Server is up and running!"

Теперь попробуем это в действии. Лезем в "Examples".
Интересовать нас будет папочка AS3. SWF понятное дело заработали не все - вылезло окно исключения - локальная политика безопасности не дала пользовать сокеты, загружать локальные XML и т.п.
Попробуем открыть и откомпилировать исходник из Flash IDE.
Попробуем пример "advancedBuddList". Перед компиляцией надо установить пути к классам. Вносим в список Publish Settings > Flash > Settings > Classpath строку "C:\Program Files\SmartFoxServerPRO_1.6.0\Flash API\Actionscript 3.0".
Успешно компилируем, запускаем. Работает, коннектится, но как-то криво.
Зато пример "SmartFoxChat" работает превосходно. А в окне серверной консоли мониторится всё происходящее.

Кстати, под IE локальная документация работает криво. Прийдется пользоваться он-лайновой версией: User Documentation и SmartFoxServer API for Actionscript 3.
API для AS3 представляет собой два пакета по два класса:
  • it.gotoandplay.smartfoxserver.SmartFoxClient - основной класс, отвечает за соединение с сервером и обработку событий.
  • it.gotoandplay.smartfoxserver.SFSEvent - представляет все события, обрабатываемые классом SmartFoxClient.
  • it.gotoandplay.smartfoxserver.data.Room - хранит свойства каждой из Server Room (комната, что-то вроде отдельного сеанса работы нескольких подключенных пользователей).
  • it.gotoandplay.smartfoxserver.data.User - хранит свойства пользователя.

На первый взгляд всё понятно и не сложно. Разберемся.

Для поверхностного знакомства достаточно. Теперь дело за изучением API и можно внедрять в игровой проект.

воскресенье, декабря 16, 2007

Первое собрание Russian Adobe Flash Platform User Group. Взгляд зрителя

Сегодня удалось поприсутствовать на первом собрании Russian Adobe Flash Platform User Group.
Честно говоря, это первое мероприятие, посвященное флэш-технологиям, на котором я присутствовал когда-либо.
Впечатления противоречивы, но, думаю, отрицательные эмоции - лишь результат депрессивного состояния от накопившихся неблагоприятных обстоятельств, преследующих меня последнее время.

Я чуть опоздал на первый доклад ("Flex + Flash = ") и пропустил имя докладчика - представителя Adobe (* Артемий Малков *). Давались основы Flex-разработки на Flex Builder 2. Очень ценный доклад лично для меня - я еще не имею практики работы с визуальным редактором Flex и MXML. Легкая и наглядная подача: на примерах, которые кодились прямо на глазах у слушателей. Доклад рассчитан на широкую аудиторию, в основном, для начинающих.

Второй доклад ("Работа с событиями в ActionScript 3 и Flex") для тех, кто уже попробовал себя в разработке Flex-приложений на AS3. Костя Constantiner снизошел к нам из Питера и довольно доходчиво, но всё же несколько сжато рассказал про события в AS3 и Flex и их особенности.

Обещали обнародовать все материалы докладов, и я с нетерпением жду, чтобы их покопать поподробнее.

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

Как-то получилось, что участники разделились на две категории:
  • те кто сидел ближе к центру и активно выражал свои мысли в микрофон - бесспорно компетентные и уважаемые товарищи,
  • и просто зрители, которые слушали, смеялись, но мнения свои выразили лишь в анкетах.
И это нормально. Предполагаю, что народ расшевелился на неофициальной части за кружкой пива. Я, увы, не смог в этом поучаствовать, но надеюсь эта встреча не последняя - уже запланирована следующая на 14 января.

Приятно было увидеть в живую тех, кто до сего момента существовал лишь как абстрактный образ в моем воображении. Забавно также, что на фото в блогах и форумах все выглядят симпатичнее чем в жизни...

* * *

Фото и видео со встречи:
Блог flashimp,
Результаты первой встречи User Group

пятница, декабря 07, 2007

Классификация переменных среды

%SYSTEMDRIVE% - Возвращает имя диска, содержащего корневой каталог операционной системы Windows XP/2003 (т. е. системный корневой каталог).

%SYSTEMROOT%, %WINDIR% - Возвращает размещение корневого каталога операционной системы Windows XP/2003

%PATH% - Указывает путь поиска для исполняемых файлов.

%PROGRAMFILES% - Указывает путь к каталогу установки программ (Program Files)

%COMMONPROGRAMFILES% - Указывает путь к общему каталогу программ (Program Files\Common Files).

%TEMP% и %TMP% - Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP.

%USERPROFILE% - Возвращает размещение профиля для текущего пользователя.

%ALLUSERSPROFILE% - Возвращает размещение профиля "All Users".

%CD% - Возвращает путь к текущей папке.

%APPDATA% - Возвращает используемое по умолчанию размещение данных приложений.

Использование необъявленных классов. Zinc. AS2

Работая с Zinc столкнулся с проблемой:
Создал класс, в котором используются классы Zinc типа mdm.PDF7, mdm.Application, и т.п.
Компилятор ни в какую не пропускал необъявленные классы.
Как только я добавил к объявлению класса dynamic class, все вопросы у компилятора отпали.
Значит mdm расценивается как переменная, и для стандартного класса появление нового свойства вызывает ошибку компиляции.
Однако, когда я определил переменную mdm для стандартного класса, ошибка пропала, но вот код Zincа уже перестал работать.

Грабли с инициализацией вложенных клипов. AS2

Столкнулся со следующей фичей:
Есть главный класс, ассоциированный с Movieclip.
В нем есть другой MovieClip, с которым тоже ассоциированн некий класс.
В главном классе он объявлен как свойство.
Так вот, в конструкторе главного класса никакие свойства вложенного класса недоступны. Доступны свойства MovieClip. Но новые свойства/методы все undefined.
Следовательно вывод - ассоциация классов и MovieClip-ов происходит в нисходящем направлении от верхних классов к классам более глубоко вложенным.

Выход - для инициализации использовать событие главного класса onLoad.

среда, декабря 05, 2007

Не работает скрипт в TimeLine. AS3

Странно, но у меня не получилось использовать скрипты (а именно вызов stop();) в таймлайне клипа.
Клип управляется также из внешнего скрипта. Внешний скрипт осуществляет gotoAndPlay на метку, и по прошествии нескольких фреймов, срабатывает фрейм со скриптом stop();
Скрипт не отрабатывает.
Надо искать решение...

пятница, ноября 30, 2007

gotoAndPlay каждый ENTER_FRAME - некорректная работа анимации. AS3

Столкнулся с проблемой:
Если каждый фрейм для MovieClip вызывать gotoAndPlay(label), перестает работать внутренняя анимация клипов типа MovieClip, расположенных в этом фрейме.
Переход осуществляется, но вложенные клипы не воспроизводятся.

четверг, ноября 29, 2007

Объект с глобальным доступом. Полезные свойства.

Работая с паттерном Singleton в применении к реализации объекта с глобальным доступом, неожиданно наткнулся на полезное его свойство - возможность легко передавать данные между совершенно несвязанными и далеко друг от друга располагающимися объектами.

* * *

И синхронизировать!

* * * UPDATE * * *
Изменение заголовка:
Старый - "Singleton как средство передачи данных между объектами"
Новый - "Объект с глобальным доступом. Полезные свойства."
Причина - неверное использование термина "Singleton"

воскресенье, ноября 25, 2007

Загружаемый растр. Как включить сглаживание при трансформациях. AS2

Я не нашел штатных средств Flash, которые бы позволили сделать сглаживание для загруженного (через MovieClipLoader) растрового изображения.
Решил обойти эту проблему, используя класс BitmapData. Код здесь.

После загрузки, на момент события onLoadComplete, клип не является полноценным. AS2

Загружаем клип при помощи MovieClipLoader.
По событию onLoadComplete мы получаем новый загруженный клип.
Но он еще неполноценный.
В момент действия onLoadComplete мы не можем получить его _width, _height. Не видим клипов или динамических текстовых полей, которые размещены в нем.
Всё это можно получить позже - на следующем фрейме.

Значит, просто ждем следующего фрейма. Пока других выходов не нашел: Здесь код.

* * *

Всё выше написанное не имеет смысла, так как у MovieClipLoader существует событие onLoadInit, решающее эту проблему.

Прозрачность BitmapData. AS2

Маленькие детские грабельки из песочницы. Чтобы BitampData была прозрачной, недостаточно просто установить в конструкторе параметр transparent в true. Надо обязательно следующий параметр fillColor установить в 0.
Только после этого BitmapData будет в себя рисовать прозрачные клипы и аттачиться в другие клипы прозрачно.
В хелпе про это сказано.

суббота, ноября 24, 2007

О динамическом добавлении методов. AS2

Некоторые объекты, типа AsBroadcaster и EventDispatcher, добавляют новые методы инициализируемым классам. Обычно я просто описывал класс как dynamic.
Но есть более правильный способ - определить присваиваемые методы.
Можно как свойства типа Function, можно как пустые методы.

пятница, ноября 23, 2007

Паттерн Singleton в языке ActionScript

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

* * *

Запрет на инстанцирование на AS2 делается еще проще чем на AS3, так как есть возможность объявить конструктор класса как private.

понедельник, ноября 19, 2007

Видео с камеры

var webcam:Camera = Camera.get();
cam_video.attachVideo(webcam);

где cam_video: компонент Video.

воскресенье, ноября 18, 2007

Нетипизированные переменные. AS2

В объекте this.__face назначаются некоторые свойства:
this.__face.url=parameters_array[0];
this.__face.x=parameters_array[1];
this.__face.y=parameters_array[2];

Далее, производя арифметические операции с этими свойствами, возникают ошибки.
Однако, стоит назначить свойствам тип:
this.__face.url=parameters_array[0];
this.__face.x=Number(parameters_array[1]);
this.__face.y=Number(parameters_array[2]);
И всё встает на свои места.

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

суббота, ноября 17, 2007

Об особенностях мониторинга загрузки, об экспорте для AS и об импорте классов. AS2

Важно знать:
  1. Если клип экспортируется для ActionScript посредством Linkage > Export for ActionScript, при отмеченном параметре Export in first frame, этот клип будет доступен для "attachMovie" с первого же фрейма, но будет помехой для правильного мониторинга загрузки SWF-файла, т.к. первый фрейм не будет выведен до тех пор, пока все его клипы не загрузятся. При этом, загрузка некоторого (довольно приличного) объема данных не будет отображена, что не есть хорошо.
    Для того, чтобы отложить загрузку такого клипа, необходимо снять параметр Export in first frame. Однако если явным образом такой клип не присутствует во временной шкале, он не будет экспортирован в SWF вообще. Поэтому, для экспорта таких клипов нужно отвести какой-нибудь фрейм, который никогда не будет показан при воспроизведении SWF.
  2. Классы из Publish settings > Flash > Settings > Classpath и классы из текущего каталога импортируются во фрейм, указанный там же, в Export frame for classes. Для идеального мониторинга загрузки, лучше указать не 1-й фрейм, а какой-либо другой, располагающийся после модуля мониторинга загрузки .
    Странно, но классы, импортируемые "вручную" также не могут быть использованы до этого фрейма.
  3. Если с клипом ассоциирован класс по средством параметра Linkage > Export for ActionScript, и для клипа и для класса всё происходит как в 1-м и 2-м пунктах.

Особенности мониторинга загрузки (preloader):

  1. Модуль мониторинга загрузки должен располагаться до фрейма, в который импортируются классы и экспортируются клипы.
  2. Мониторинг не может быть описан классом.
  3. Модуль мониторинга загрузки должен иметь минимальный объем.
  4. При подсчете процента загрузки SWF, необходимо учитывать объем уже загруженных на момент активации мониторинга данных:

    На момент инициализации мониторинга:
    this.skipped=_root.getBytesLoaded();
    this.total=_root.getBytesTotal()-this.skipped;

    В процессе подсчета загруженного объема:
    var progress:Number=(_root.getBytesLoaded()-skipped)*100)/this.total;

Код подключаемого кода здесь.

среда, ноября 14, 2007

Как сохранить из Flash изображение в формате JPG

Есть необходимость сохранять изображение из Flash в формат JPG.
А точнее - сделать скриншот.

Поиски привели к статье: Export JPEG with Flash/PHP - bitmap сканируется в строку base64 и передается на сервер, где ее ловит PHP-скритп и транслирует в формат JPG.
Способ применим начиная с 8й версии FlashPlayer.

Другая статья: PNG Encoder in AS3 - здесь bitmap конвертируется в байтовый массив содержащий изображение в формате PNG.
Рядом - класс-конвертер Bitmap в JPG: More fun with image formats in AS3. Код прилагается.

Как сохранить ByteArray на сервер в файл: Save ByteArray to file with PHP

Еще статейка с сохранением PNG и JPG для Flash 8: Saving JPEGs or PNGs with Flash 8 Revisited. С исходниками.

* * *

Использовал последнюю статью (Saving JPEGs or PNGs with Flash 8 Revisited) - работает ОТЛИЧНО! Превосходный интерфейс, документировано, отличная демка.

воскресенье, ноября 11, 2007

Delegate. Проблема доступа к вызывающему объекту

this.item.area.onRelease=Delegate.create(this,this.onItemRelease);

Объектов item может быть много. Необходимо в onItemRelease как-то добраться до area, которое вызвало событие.

Неполучилось.

Есть конечно способы модифицирующие класс Delegate, но хотелось бы без этого.

* * *

Обсудили этот вопрос. Наиболее изящным мне показался следующий метод:

Для Area определяем:

var onReleaseWithThis:Function;
function onRelease() {
onReleaseWithThis(this);
}

Теперь для главного класса:

this.item.area.onReleaseWithThis=Delegate.create(this,this.onItemRelease);
function onItemRelease(who) {
trace(who);
}

* * *

В итоге, склонился к методу перекрытия класса Delegate своим, с передачей параметров. Использовать удобно, подключать удобно. Разве что неудобно таскать из проекта в проект.

Заметил правда один хак, который сам непонимаю почему работает. При передаче дополнительных параметров при create, они находятся в области видимости create, но затем, почему-то легко доступны в самой вызываемой функции уже позже, при работе программы. А нет ли такой вероятности, что эти параметры удалятся тем же Garbage Collector ом? Тем не менее метод работает, и я его буду использовать. Благо в AS3 такой ерундой заниматься уже нет необходимости.