вторник, декабря 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 такой ерундой заниматься уже нет необходимости.

Использовать String не по назначению плохо. AS2/3

Еще раз убедился что String для идентификаторов состояний и тому подобного очень плохо, хотя и, казалось бы, удобно. Например, очень просто определить переменную state как String и устанавливать/проверять состояния типа "playing", "stopped" и т.п.
Теперь определяем state как Number и определяем константы ClassName.PLAYING и ClassName.STOPPED.
В случае, если состояние проверяется часто, например несколько раз в течение фрейма, выигрыш производительности составляет почти в 2 раза.

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

Как лучше определять свойства класса, предназначенные для потомков и внешнего пользования?

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

  1. Определить как protected и в потомках использовать их напрямую, а для внешнего использования сделать public установщик.
  2. Определить как private, и для потомков и для внешнего использования сделать public установщик.
  3. Определить как public.

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

Второй способ лучше, т.к. сокращает количество путей доступа к свойству, что лучше сказывается на инкапсуляции объекта.

Последний способ применим только для простых конструкций.

* * *

Важно четко понимать, какой способ лучше применить:

  • Очевидное применение первого способа - для абстрактных классов,
  • Второй соответственно в реализациях
  • Третий - для простых конструкций, предназначенных для хранения данных.

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

Как загрузить библиотеку и затем аттачить из нее клипы

Встал вопрос, как это сделать. Нашел такой код. Надо пробовать.

* * *

Попробовал, работает превосходно. Обожаю AS3.

* * *

Трансформируя вышеприведенный код получаем очень простое решение:

Перед загрузкой указываем лоадеру контекст:
var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
this.loader.load(this.source_url, context);

Затем, уже после того как загрузится swf-ка, мы в любой момент можем сделать следующее:

var movie_class:Class = ApplicationDomain.currentDomain.getDefinition("MovieClass") as Class;
var movie_sprite:Sprite = new movie_class();
this.addChild(movie_sprite);

Как загрузить библиотеку и затем аттачить из нее клипы

Встал вопрос, как это сделать. Нашел такой код. Надо пробовать.

Версия подгружаемой SWF

Смотреть 4й байт. Код.

среда, октября 31, 2007

Странно: значения параметров функции по умолчанию не могут быть public static const. AS3

Есть такой метод:

public function TKeyboardSettings(left:int=Keyboard.LEFT,right:int=Keyboard.RIGHT,up:int=Keyboard.UP,down:int=Keyboard.DOWN) {
this.left=left;
this.right=right;
this.up=up;
this.down=down;
super();
}


На Flex Builder 3 beta1 всё было ок, но после установки второй беты и (как я потом проверил, во FlashDevelop) flex стал ругаться на то, что я параметрам по умолчанию присваиваю константы класса Keyboard.

Текст ошибки:
Parameter initializer unknown or is not a compile-time constant.

Судя по сообщению, константы класса Keyboard не являются константами времени компиляции.
Непонятно, почему до последнего времени это не являлось ошибкой.

* * *

Долго ковырялся - в FD заработало ни с того ни с сего. В FB вдруг в процессе редактирования выдало Source could not be found for flash.ui.Keyboard.RIGHT in ...\playerglobal.swc
Выходит криво встал билдер то...

* * *

Переустановил. То же самое и в FD опять началось... :(

вторник, октября 30, 2007

Adobe Flex Builder 3. Ставим вторую бету под Eclipse

Заходим на Adobe Flex Builder 3 Public Beta 2 и качаем.
Любопытно - триальный срок обнулится или нет?...
Запускаем flexbuilder3_b2_win_plugin_101107.exe.

Оставляем директорию по умолчанию.
Говорит что нерекомендует поверх старой ставить. Забиваем.

Получаем в конце такое окно с сообщением, которое нам поможет действовать дальше.
Действуем по инструкции.

Eclipse перезагрузился, Flexbuilder опять работает! Триальный период обновился до 60 дней.

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

Странное с отладкой в FD3

Перестал работать trace(). Не штатный дебагер, не FDTracer ничего не выдавали.
Долго пытался понять в чем дело - в итоге чисто интуитивно зашел в папку и запустил файл: "C:\Program Files\Adobe\Adobe Flash CS3\Players\Debug\FlashPlayer.exe"

После этого, сразу trace() снова стал работать.

На другом компьютере такой фокус не прошел. Да и не удивительно. Возможно причина в том, что на первом была установлена Debug-версия плеера вместе с Flex Builder. На втором же Flex не ставился. На первом что-то перенастроилось и Debug-плеер стал недоступен, но после его принудительного запуска все восстановилось. Но это всё догадки.

В итоге, есть простое универсальное решение. Зайти в настройки Installed Plugins > FlashViewer > ExternalPlayerPath и прописать "C:\Program Files\Adobe\Adobe Flash CS3\Players\Debug\FlashPlayer.exe".
Для того, чтобы открывалась именно Debug-версия в настройках проекта необходимо указать в Test movie > Open SWF in: External.
При таком выборе открывается нормальное окно флэш-плеера и создается сессия отладчика. При этом трейс выводится и в Output и в окно FDTracer.

FlashDevelop3. Ошибка плагина ASClassWizard

При установке плагина ASClassWizard перестает работать преобразование служебных переменных типа $(ItmTypPkg), $(ItmTypName), $(ItmName).

Прийдется обойтись без него... На официальном сайте про это были сообщения. Ждем новой версии.
Кстати, вернуть обратно шаблоны можно из "C:\Program Files\FlashDevelop\FirstRun\Templates\ProjectFiles\". Слава Богу, при инсталляции сюда тоже кладутся все необходимые программе файлы, что позволяет легко откатываться после неудачных модификаций конфигурации.

Быстрые кнопки для вставки скриптов

Поступило вот отсюда.
В папке: "C:\Documents and Settings\ЮЗЕР\Local Settings\Application Data\Adobe\Flash CS3\en\Configuration\ActionsPanel\ActionScript_1_2\ActionsPanel.xml" для каждого элемента есть параметр "quickey", который определяет последовательность символов после нажатия ESC и дает быструю вставку команды.

Flashdevelop. Tasklist Plugin

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

Насчет иконок - в папке "C:\Documents and Settings\ЮЗЕР\Local Settings\Application Data\FlashDevelop\Settings" лежит файл Images.png, который показывает соответствие иконок номерам.

Flashdevelop. Layout-manager. Layouts

Сохраняет расположение окон на экране.

пятница, сентября 28, 2007

Переустановка FlashDevelop 3 beta 3

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

LocalConnection не коннектится. AS2

Столкнулся с ситуацией - определил и создал LocalConnection в одной из функций. Метод отработал, объект создался.
Потом пытаюсь послать ему запрос из другой флэшки. Связи нет.
Причина - объект LocalConnection уничтожается по завершении функции.
Как только я вынес его определение в _root (не обязательно в _root, главное чтобы где-то на него была живая ссылка), всё заработало.

Методы класса String без явного приведения типа работают некорректно. AS2

Без явного приведения типа переменной к строке, ее методы не работают.

Пример:
arg - тип не определен (поступил из XML).
var str:String=arg.split("replaced").join("replace");
Дает пустую строку или undefined.

Код должен выглядеть так:
var str:String=String(arg).split("replaced").join("replace");

четверг, сентября 27, 2007

Паттерн "Загрузка по требованию" (Lazy Load)

Первоначально в системе создается пустой объект (Сотрудник), который не содержит в себе информации (Проекты), и, как только система пытается получить информацию, объект пытается ее загрузить.

О паттерне:
Применение паттерна.
Обзор паттернов проектирования.

среда, сентября 26, 2007

Установка плагинов для FD продолжается

Плагин BookmarkPanel: Копируем в папку с плагинами. Запускаем FD. Новая панель в котторой отображаются текущие закладки. Всего-то.

Плагин AsClassWizard: Копируем, запускаем FD. Никаких видимых изменений. В настройках плагина тоже ничего нет. Создаем новый класс из окна проекта Add->New class. Получаем окно с настройками создаваемого класса. Да, перед этим нужно заменить шаблоны из папки "C:\Documents and Settings\racer\Local Settings\Application Data\FlashDevelop\Templates\ProjectFiles" на новые, которые прилагаются к плагину.

Плагин SourceOptions: Копируем, запускаем FD. В контекстном меню появилось подменю, позволяющее:
  • Копировать имя текущего файла в буфер.
  • Организовывать импорты (не понял пока).
  • Создавать установщики для переменной, на которой стоит курсор.
  • Создавать методы доступа к переменной, на которой стоит курсор.

Плагин StickiesNotes: Копируем, запускаем FD. При запуске - ошибка. В меню "View" появился новое подменю Stikies. Здесь можно добавить стикеры с заметками. Не очень удобная штука и с ошибкой - удаляю.

Плагин RegularExpressionPanel: Многообещающее название. Копируем, запускаем FD. Отличная вещь!
В меню View появился пункт Regular Expression Toolkit. Пока не совсем понял как работает, но вижу что генерит AS-код, основанный на заданном паттерне.

Плагин SharedObjectReader: Копируем, запускаем FD. В меню Tools -> Flash Tools появился пункт Shared Object Reader, который показывает текущие Shared Object-ы. С этим предстоит еще разобраться.

Настройка нормального хелпа под FlashDevelop IV

Код прилагается: здесь.

В процессе изучения выяснилось, что приложение с параметрами из FlashDevelop запускается следующим образом: "app.exe;param1 param2 param3".

В настройках тулбара я прописал строку:
<button label="Help" tag="C:\Program Files\FlashDevelop\AsLocalDocs\ASLocalDocs.exe;pckg=$(ItmTypPkg) clss=$(ItmTypName) item=$(ItmName) kind=$(ItmKind)" image="229" click="RunProcess"/>

и на F1 в настройках плагина прописал строку:
C:\Program Files\FlashDevelop\AsLocalDocs\ASLocalDocs.exe;pckg=$(ItmTypPkg) clss=$(ItmTypName) item=$(ItmName) kind=$(ItmKind)

Осталось добиться, чтобы приложение ASLocalDocs.exe запускалось в одном экземпляре.
Еще - надо избежать ошибок, если не найден html-файл.
Кроме того, сам плагин дает сбой, либо не реагирует при вызове не классов.

Вызов super() из конструктора

Не забыть - в AS2 super можно вызывать в конструкторе только в первую очередь.
В AS3 - в любом месте.

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

Настройка нормального хелпа под FlashDevelop III

Добрейшие люди подсказали хорошую ссылку на плагины к FD3, в том числе на FlashAPI.
Теперь настраиваем хелп!
Облом... Скопировал dll в папку плагинов. Никаких изменений... Боже Мой! Опять те же грабли... в Documents And Settings же... Зачем надо было делать такой изврат??? Путаница страшная! Убиваю всё старое из папки в Program Files.
Копирую в "C:\Documents and Settings\ЮЗЕР\Local Settings\Application Data\FlashDevelop\Plugins"
Появилась панелька!
В настройках плагинов находим FlashAPI и прописываем "C:\Program Files\Adobe\Adobe Flash CS3\en\First Run\ActionsPanel\ActionScript_3\ActionsPanel_3.xml".

В панели Flash API появился список всех классов как в AS-панели.

Пропишем в свойствах еще один путь:
"C:\Program Files\Adobe\Adobe Flash CS3\en\First Run\ActionsPanel\ActionScript_1_2\ActionsPanel.xml".
Теперь в меню справа вверху можно будет выбрать панель для AS1 и 2.

Однако, проблема кнопочки F1 не решена. Продолжаем делать Zinc-оболочку, тем более что она почти готова.

Еще раз о Delegate. AS2

Никак не запомню...

import mx.utils.Delegate;
obj1={name:"name1"};
obj2={name:"name2"};
obj1.test="Test";
obj2.function_name2=function() { trace("Result: "+this.test+" "+this.name);}
obj1.function_name1=Delegate.create(obj1,obj2.function_name2);
obj1.function_name1();

Результат: Result: Test name1

obj1 - Контекст или объект для которого делегируется функция.
obj2 - Объект, который поручает свой метод.
obj1.function_name1 - функция, которой поручается выполнение.
obj2.function_name2 - поручаемая функция.

Пример применения.
Кнопка button вызывает по нажатию метод, делегированный объекту-родителю:

import mx.utils.Delegate;
this.button.onRelease=Delegate.create(this,
function() {
this.doSomething();
}
);

Область видимости переменных. Грабли на заметку. AS2

Код:
this.test="TEST";
this.go.onRelease = function() { trace(_parent.test);}
Выдает undefined.

Нормально работают:
this.go.onRelease = function() { trace(this._parent.test);}
this.go.onRelease = function() { trace(test);} - Лучше не использовать

Изучаем примеры Zinc

Самые актуальные примеры:

Начнеем с Броузера - возможно наша идея с хелпом для FD наконец реализуется?

  1. Откроем ZINCv2.5_Browser.fla
  2. Теперь в Zincе в закладке Input Source указываем ZINCv2.5_Browser.swf
  3. Нажимаем едва приметнрую кнопочку Build справа внизу.
  4. Получаем аналогичное примеру приложение.

Добавим функционал, подстроим под наши цели - для этого скачаем документацию Flex.

Рабочий код будет позже.


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

Установка FDTracer

Заходим на сайт.
Качаем и распаковываем FDTracer.dll.
Копируем библиотеку в "C:\Documents and Settings\ЮЗЕР\Local Settings\Application Data\FlashDevelop\Plugins\".

Создаем в папке "C:\Documents and Settings\ЮЗЕР\" (для Windows XP, остальное - подробнее здесь) файл "mm.cfg". В нем достаточно прописать
ErrorReportingEnable=1
TraceOutputFileEnable=1
Теперь в папке "C:\Documents and Settings\ЮЗЕР\Application Data\Macromedia\Flash Player\Logs\" будет создан log-файл "flashlog.txt". Этот файл будет постоянно сканировать наш плагин.

Кроме того, для работы плагина требуется, чтобы отлаживаемые SWF проигрывались Debug-версией Flash Player.

Пускаем FD. Видим новую панельку FDTracer.
Идем в Tools > Installed plugins > FDTracer settings.
Указываем C:\Documents and Settings\ЮЗЕР\Application Data\Macromedia\Flash Player\Logs\flashlog.txt.
Установка завершена.

Пробуем. Запустив тестовый проект, получаем трейс. И в панели Output и в панели FDTracer. Что ж, будем иметь под рукой расширенный просмотровщик трейсов.

Установка Zinc

Заходим на официальный сайт и качаем.

Продолжение следует.

пятница, сентября 21, 2007

Настройка нормального хелпа под FlashDevelop II

Порывшись в папках Eclipse под который был установлен Flex Builder 3, обнаружил в папке C:\Eclipse\plugins\com.adobe.flexbuilder.help_3.0.172437\ файл doc.zip, в котором сидит всё API.

Попробуем его активировать по F1.
Для этого нужен исполняемый файл, который будет получать в параметрах пакет и класс и открывать нужную html-страницу, желательно в себе.

Дальнейшее изыскание продолжу в рамках освоения Zinc.

четверг, сентября 20, 2007

Настройка нормального хелпа под FlashDevelop

Заодно нашел место где можно прописать, что запускается по клавише F1!
Это в настройках плагина AS3 Context -> Documentation Command Line. Надо попробовать настроить нормальный запуск хелпа. К примеру, через Adobe Help Viewer.

Итак, открываем Installed Plugins ->AS3 Context -> Settings -> Documentation Command Line. Видим здесь строку:
http://www.google.com/search?q=%22actionscript 3.0%22+$(ItmTypPkg)+$(ItmTypName)+$(ItmName)+site:livedocs.adobe.com

Всё как на ладони. Попробуем открывать livedocs.adobe.co. Для начал исследуем как он открывается из флэшового хелпа. Для MovieClip открывается такая ссылка:
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/index.html?flash/display/MovieClip.html&flash/display/class-list.html

Напрямую вызвать онлайновый хелп не получится -
$(ItmTypPkg) возвращает flash.display, а нам надо flash/display

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

<?
$index=$_GET["index"];
$item=$_GET["item"];
$class=$_GET["class"];
$package=str_replace(".","/",$_GET["package"]);

Header("Location: http://livedocs.adobe.com/".$index.$package."/".$class.".html#".$item);
?>


Теперь пропишем в настройках F1:
http://www.my_url.ru/fd2livedocs.php?index=flash/9.0/ActionScriptLangRefV3/&package=$(ItmTypPkg)&class=$(ItmTypName)&item=$(ItmName)

где www.my_url.ru - сайт-прокси, на который кладется PHP-редиректор.

Можно указать и ссылку на Flex:
http://www.my_url.ru/__as3doc/fd2livedocs.php?index=flex/2/langref/&package=$(ItmTypPkg)&class=$(ItmTypName)&item=$(ItmName)

К сожалению, не работают якоря для методов, т.к. якоря указываются с "()".

Избавимся от того недостатка:
Добавим параметр $(ItmKind).

http://www.my_url.ru/__as3doc/fd2livedocs.php?index=flex/2/langref/&package=$(ItmTypPkg)&class=$(ItmTypName)&item=$(ItmName)&kind=$(ItmKind)

Меняем код PHP:

<?

$index=$_GET["index"];
$item=$_GET["item"];
$class=$_GET["class"];
$package=str_replace(".","/",$_GET["package"]);

$kind=$_GET["kind"];
if ($kind=="function") $kind="()"; else $kind="";

Header("Location: http://livedocs.adobe.com/".$index.$package."/".$class.".html#".$item.$kind);

?>


Теперь всё Ок.

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

Попробовал также такую систему для AS2 - не работает, т.к. в livedocs AS2 пути к нужным документам содержат пакеты, а FD пакеты не передет :(.

Настройка ASDoc для FlashDevelop

Для начала посмотрим что-нибудь интересное на официальном сайте.
Здесь есть что-то про ASDoc. Пробуем следовать инструкциям. Никакого эффекта. Новой кнопки в тулбаре не появляется... Странно похоже, что FD глубоко наплевать на файлы ToolBar.xml и т.п. Всё. Понял. Теперь все файлы программы располагаются в C:\Documents and Settings\ЮЗЕР\Local Settings\Application Data\FlashDevelop\Settings.
А менял я файлы оставшиеся от старой версии! По команде Application Files, открывается проводник в нужной папке. Там и надо действовать.
Теперь следуем инструкции дальше.
Вставляем
<button label="Generate ASDOC" click="RunProcessCaptured" image="95" tag="$(ASDoc);-doc-sources "$(ProjectDir)/src" -main-title "$(ProjectName)" -output "$(ProjectDir)/doc"" />
Теперь, если в проекте есть папка "src", всё отлично работает, генертися документация по всем классам, даже с алфавитным указателем. Впечатлило!

Устанавливаем FlashDevelop 3.0.0 Beta3

Заходим на FlashDevelop 3.0.0 Beta3 released и качаем. Ставим. Запускаем.
Открываем старый проект. Пробуем запустить. Просит установить настройки компилятора. Они сбросились. Устанавливаем путь к Flex SDK. Всё равно ошибка. Странно.
Попробуем создать новый проект. В окне создания проекта добавилось много новых пунктов. Запускаем. Нет. Всё равно не находит путь к компилятору.
Все ясно. Я указывал полный путь к компилятору "C:\Program Files\FlashDevelop\Flex2SDK\bin", а нужно путь ко всему Flex SDK "C:\Program Files\FlashDevelop\Flex2SDK".
Всё заработало. Старые проекты открываются и компилятся.

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

Переустанавливаем Flash ActiveX для IE

Переустанавливаем флэш-activeX для IE как написано здесь или здесь. Сначала скачали uninstaller. Запустили "uninstall_flash_player.exe /clean". Все прошло нормально. Говорит, последняя версия удалена. Здесь это проверяется - действительно, не установлен. Теперь скачали и запустили Download ActiveX Control for Windows Internet Explorer. Установилось. Проверяем. "You have version 9,0,60,184 installed". Отлично, IE не предлагает выполнить или сохранить, а сам воспроизводит.

Компоненты из ActionScript

Хотел проверить почему происходит ошибка.

import fl.controls.Slider;
var mySlider:Slider = new Slider();
mySlider.move(10, 10);
addChild(mySlider);

Библиотека fl.controls.Slider создала несколько проблем:
  • Под FlashDevelop (Flex SDK) - выдала несколько предупреждений, что некоторые из методов не возвращают никаких значений (не было проставленно :void).
  • Под Flex и Flash CS3 просто не небыло найдено такой библиотеки. То же самое и с другими компонентами.

Поиск показал, что эти библиотеки находятся здесь: "C:\Program Files\Adobe\Adobe Flash CS3\en\Configuration\Component Source\ActionScript 3.0\User Interface".

Честно говоря, непонял, почему компилятор не ищет сам этих библиотек...
Добавил путь в Classpath и всё откомпилировалось.

Да, в хелпе так и написано: добавить "$(AppConfig)/Component Source/ActionScript 3.0/User Interface"

В итоге - мало того, что источник ошибки я не нашел, ошибки выдают и другие компоненты, когда я пытаюсь их создавать:
TypeError: Error #2007: Parameter child must be non-null.
at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/fl.controls:BaseButton::drawBackground() at fl.controls::BaseButton/fl.controls:BaseButton::draw() at fl.core::UIComponent/drawNow() at fl.controls::ComboBox/fl.controls:ComboBox::drawLayout() at fl.controls::ComboBox/fl.controls:ComboBox::draw() at fl.core::UIComponent/::callLaterDispatcher()

Разберемся позже.

APE

В процессе изучения движка, выявились существенные недостатки.

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

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

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

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

Преимущество APE - простота и понятность.

Оптимизация AS3

Статья по оптимизации AS3.
Основные идеи:
  • не перегружать условия и операторы (не понял)
  • не использовать объекты, если заранее известно, с какие свойства будут задействованы в итоге.
  • При чтении массива, сразу приводить тип экземпляров его элементов.
  • По возможности использовать Integer.
  • Использовать битовые операторы.
  • Использовать типизированные массивы с фиксированной длинной.
Кроме того:
  • "a += b" быстрее чем "a = a + b"
  • "a++" быстрее чем "a = a + 1"
  • вышесказанное не действительно для оператора вычитания
  • "value*.5" быстрее чем "value/2"
  • деление на 2: "10 >> 1"
  • умножение на 2: "10 <<>
  • однако, битовые операции не оптимальны для Number
  • Округление:
    var n:Number = 1.5;
    test:Number = Math.floor(n); - очень медленно (1733)
    var test:uint = uint(n); - быстро (176)
    var test:int = int(n); - быстро (157)
    var test:Number = n >> 0; - быстро (178)
    var test:Number = Math.ceil(n); - медленно
    var test:uint = n == uint(n) ? n : uint(n)+1; - медленно (650)
    var test:int = n == int(n) ? n : int(n)+1; - быстро (384)
  • Абсолютное значение, Math.abs:
    var n:Number = -1.5;
    n = Math.abs (n); - очень медленно (1539.92)
    n = n < n =" n" class="blsp-spelling-error" id="SPELLING_ERROR_21">if (n < n =" -n;">

Итак (с учетом Number):

  • Деление на 2: "n * 0.5"
  • Умножение на 2: "n + n"
  • Math.floor: "n >> 0"
  • Абсолютное значение: "if (n < n =" -n">



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

Искажение цветов во flash

На странице сайта, при совмещении внешней растровой графики и растровой графики во flash столкнулся с проблемой - градиентные фоны незначительно различались. Во flash растровый фрагмент был темнее.

Выход из положения - наложил Tint 1% белого. Всё стало вполне прилично.

пятница, сентября 14, 2007

Фокус на flash клипе

Проблема:
Flash клип встроен в HTML страницу, кроме него на странице также есть
текст, формы и другая ерунда.
Можно ли в Flash клипе узнать что фокус установлен на него и что он
будет реагировать на ввод с клавиатуры? Если же фокуса нет то показать
сообщение вроде "Click Me" чтобы кликнув мышкой по клипу установить на
него фокус.

Nox Noctis:
"Проблема решается только обязательным запросом "Click Me".
я не видел, чтобы кто-то делал по-другому....
не так давно сам задавался этим вопросом, и в результате всё равно
сделал предварительный запос "клик ми".
а по поводу узнавания, над флэшкой ли курсор (что не связано с
клавиатурой вобщем-то :) ) таким способом придется по таймеру дергать
ExternalInterface, а это уже не фонтан. даже если предположить, что
можно достоверно узнать, над флэшкой ли курсор."

Вопрос пока открыт

четверг, сентября 13, 2007

Оптимизация по объему

Еще раз убедился, что MovieClip тяжелее Graphic. Достаточно в таймлайне установить свойство слипа Instance behavior на Graphic, и его объем уменьшится. Когда идет борьба за байты, это здорово помогает.

ДОПОЛНЕНИЕ! Заметил, что иногда чрезмерное использование Graphic сильно вредит. Объем необъяснимо возрастает, особенно если в этом символе содержится много других символов.

Итак, процесс оптимизации банера свелся к следующим этапам:
1. Оптимизация растра на этапе подготовки растровой графики, объем/качество с упором на качество. Для фигурных изображений - использование форматов большого сжатия с последующей обтравкой во Flash (при этом учитывать фон, чтобы небыло каймы у обравленных изображений).
2. Выявление клипов, таймлайн-анимацию которых можно заменить на скриптовую. Их замена.
3. Выявление клипов типа MovieClip, которые можно заменить на Graphic. Их замена. Проверять при каждом изменении!
4. Оптимизация растровой графики с упором на объем. Замена растровой графики векторной там, где это возможно. Удаление из растровой графики частей, которые не отображаются.

среда, сентября 12, 2007

Оптимизация производительности при анимации над крупными изображениями

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

Надо проверить.

AutoSize для TextField

Тут был поднят вопрос об этом свойстве.

В кратце по этой теме (возможно будут коррекции):

Например, при установке autoSize="right", при увеличении текста поле будет увеличивать размер влево, а правая сторона оставаться на месте.
Если в тексте присутствует перенос на другую строку "\n" или для htmlText "
" или " [p][/p]", размер поля будет увеличиваться вниз.
Всё это никак не сказывается на выравнивание самого текста в поле.

Но стоит только установить txt.wordWrap=true; как AutoSize потеряет свою силу по горизонтали. Поле будет оставаться в своих горизонтальных размерах, и расти вниз. Может тебя ввел в заблуждение этот параметр?

Предполагаю, что текстформат никак не должен пересекаться с autoSize, т.к. отвечает за формат разметки текста в самом поле.

Ширину можно спокойно менять параметром _width. Но тут есть тонкость. autoSize будет всё равно сохранять ширину текста неизменной. При установке _width, блок текста буде смещаться по горизонтали соответственно заданной ширине, а ширина будет сохранять свое значение неизменным.

Кроме того, если добавляешь/изменяешь текст в поле, его размер, _width/_height, обновится только в следующем фрейме. Поэтому если нужен размер текста сразу после изменений текста, используй textWidth/textHeight - они обновятся сразу.

Итак, если тебе нужно поле с wordwrap-ом, меняй его размер _width, а текст выравнивай форматированием (TextFormat). autoSize будет тебе обеспечивать увеличение по вертикали.
В ином случае, autoSize сам будет менять размеры поля в нужном тебе направлении, но без авто-переноса текста.

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

Как сделать, чтобы в текстовом поле по клавише TAB вводился TAB а не сменялся фокус

Пример, как сделать, чтобы в текстовом поле по клавише TAB вводился TAB а не сменялся фокус.

<?xml version="1.0" encoding="utf-8"?>
<!-- TextAreaTabAllowed -->
<mx:TextArea xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Script>
<![CDATA[
private var _allowTabKey:Boolean = false;
[Bindable]

public function set allowTabKey ( value:Boolean ) : void
{
if( value )
{
addEventListener( FocusEvent.KEY_FOCUS_CHANGE,
catchTabKey);
}
else
{
removeEventListener( FocusEvent.KEY_FOCUS_CHANGE, catchTabKey);
}
_allowTabKey = value;
}

public function get allowTabKey ( ) : Boolean
{
return _allowTabKey;
}

private function catchTabKey ( e:FocusEvent = null ) :
void
{
if( e )
{
var before:String = this.text.substring ( 0,
this.selectionBeginIndex );
var after:String =
this.text.substring( this.selectionEndIndex,
this.text.length );
var newCaretPos:int = this.selectionBeginIndex +
1;
this.text = before + "\t" + after;
this.setSelection( newCaretPos, newCaretPos );
e.preventDefault( );
this.setFocus ( );
}
}

]]>

</mx:Script>
</mx:TextArea>

Старые грабли с маской

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

понедельник, сентября 10, 2007

hitTest()

В AS2, правильно использовать глобальные координаты:
area.hitTest(_root._xmouse,_root._ymouse,true);

В AS3:
public function hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean
- где x и y - для Stage.

четверг, сентября 06, 2007

Tween в AS2

Параметры анимации:
Back, Bounce, Elastic, None, Regular, Strong

среда, сентября 05, 2007

Запрет кэширования аудио-файла, воспроизводимого из Flash-

Говорят - надо использовать Adobe Flash Media Server.
Здесь говорится про то, что он позволяет запретить кэширование аудио-видео файлов

Аналогичный Opensource медиа-сервер Red 5.
Здесь пишут что он поддерживает Streaming Audio/Video

Здесь пример который может пригодиться - видео грузится только с нужной позиции.

Вращение клипа относительно заданной точки

Задача: перенести клип на некоторое расстояние, чтобы некая его точка оказалась в (0,0)
И повернуть его на угол rotation.

this._x=-anchor._x;
this._y=-anchor._y;

var _matrix:Matrix = new Matrix();
_matrix.translate(0,0);
_matrix.rotate(Math.PI*(rotation)/180);
_matrix.translate(0,0);
var tmpMatrix:Matrix = this.transform.matrix;
tmpMatrix.concat(_matrix);
this.transform.matrix = tmpMatrix;

При таком раскладе всё получается.

Однако, хотя клип повернулся, на угол наклона _rotation это никакого влияния не оказало он остался =0... А у меня цель - рассчитать новые значения _x, _y при заданным _rotation, чтобы потом организовать плавное стремление к ним.

Ищем другой способ.

Используя обычную арифметику окружности, получаем:

var r:Number=Math.sqrt(this._x*this._x+this._y*this._y);
var a_x:Number=Math.acos(this._x/r);
var a_y:Number=Math.asin(this._y/r);
this._rotation=rotation;
this._x=r*Math.cos(a_x-(Math.PI*(rotation)/180));
this._y=r*Math.sin(a_y-(Math.PI*(rotation)/180));

Тяжеловато (много вычислений и такое чувство что надо это делать как-то проще), но работает!

понедельник, сентября 03, 2007

Округление через int

Округление из number в int происходит путем простого отрезания дробной части, однако это не floor!!! При отрицательных значениях аргумента floor(-0.5) дает минимальное значение "-1" , а int(-0.5) выдаст "0".

Эта строка
var cell_position:TPoint=new TPoint(int(position.x/this._matrix.cell_size.x),int(position.y/this._matrix.cell_size.y));

не эквивалентна

var cell_position:TPoint=new TPoint(Math.floor(position.x/this._matrix.cell_size.x),Math.floor(position.y/this._matrix.cell_size.y));

Flex Builder. Окно Navigator

Добавил в окне Navigator в проект файл Fla. Чтобы он открывался, надо выбрать во всплывающем меню Open width > Other >External Programs > Flash Document.

В проекте, новые папки с рессурсами (swf) синхронизируются с одноименными папками в каталоге bin, которые создаются автоматически. Синхронизируются они как-то непонятно. Причем, если это сделать принудительно - перетащить мышкой - выдается ошибка. Однако, если в папке всё удалить и обновить (Refresh), произойдет синхронизация, и содержимое папки в проекте скопируется в папку в bin.

пятница, августа 31, 2007

Проблема с установщиками

Столкнулся с интересными граблями:

Есть установщик (есть также и возвращатель):
public function set display_position(value:TPoint):void {
this._display.x=value.x;
this._display.y=value.y;
}


при вызове
this.display_position=new TPoint(x,y);
он отрабатывает,

но при вызове
this.display_position.x=x;
this.display_position.y=y;
он не сработает никогда! Просто здесь работает возращатель...

Заметки по стилю программирования

Методы для внешнего интерфейса - public
Методы для интерфеса с потомками - protected
Методы внутреннего пользования, обработчики событий - private

четверг, августа 30, 2007

Класс с кодами клавиш

Это класс flash.ui.Keyboard.

FlexBuilder. Как быстро добавить Import для класса в тексте кода

Поставить курсор на конец имени класса, нажать Ctrl+Space и затем ввод. Если в списке только один возможный класс, ввод нажимать даже не потребуется.

Замечание по конструкторам

При инстанцировании классов нужно следовать одному из правил:
  • Свойства класса задаются через параметры конструктора.
  • Свойства класса задаются через установщики уже после вызова конструктора.
Иначе начинается путаница. Если в конструкторе что-то инициализируется, и использует при этом другие свойства класса, которые задаются установщиком, то есть риск, что эти свойства еще не установлены.

Первый способ удобнее, т.к. позволяет создать объект одной строкой.
Второй способ нагляднее и позволит определить последовательность инициализации свойств так, как удобно клиенту (объект, инстанцирующий наш класс).

Есть ли смысл делать установщики для свойств, которые инициализируются один раз в конструкторе? Наверное нет.

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

Изменения и дополнения к стилю программирования

Было:
  • public свойства класса и переменные не имеют заглавных букв и слова разделяются "_".
  • private свойства имеют префикс "__".
Добавилось:
  • protected свойства имеют префикс "_".

Все обработчики событий имеют префикс "on".

среда, августа 29, 2007

Flex Builder. Заметки на разные темы

С увеличением числа классов, становится неудобно переключаться по табам окон. Удобнее выбирать в окне Navigation.

Иногда удивляет забота система проверки ошибок: соображает что надо ругаться когда в конструкторе есть параметр, а super с этим параметром я не вызвал. Обязательный параметр - еще б не ругался.

Хорошо проектировать структуру классов на MS Visio, используя Software > UML Model Diagram (US Units). С (Metric) не получилось повернуть документ в альбомное положение.

Создал объектную структуру используя в основном UML Static Structure. С именами классов, методами и свойствами не стал заморачиваться. Хотя, по идее, можно вообще всё сразу спроектировать, но я еще до такой крутизны не дорос.

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

Можно загрузить SWF и иметь доступ к клипам, размещенным в нем. Для этого привести Loader.content к DisplayObjectContainer и пройти в цикле используя getChildAt.

Ключевое слово super - в теле конструктора вызывает конструктор предка. Если в конструкторе явно не вызывать super(); то конструктор предка будет выполнен до первого оператора в теле конструктора. Это может быть полезно для выполнения каких-либо действий до вызова конструктора предка.
В остальных методах класса, super позволяет вызывать версии методов предка - super.parentMethod();

Contrl+Shift+D - вставляет блок комментариев. Если курсор над функцией, добавляет спец-параметры @return, @param.

Shift+F2 - Eclipse SDK Help - удобно быстро вызывать подсказку для любого слова на котором стоит курсор.

вторник, августа 28, 2007

Пробуем Adobe AIR update Beta 1 для Flash CS3

Вдохновившись статьей на флэш-риппере, ломимся на labs.adobe.
Качаем: Adobe AIR update for Flash CS3 Professional for Windows (13 MB) .
Заодно качаем Download the Adobe AIR Installer.

Устанавливаем. Предлагает закрыть IE и Flash CS3. Сволочь. Закрыли, установили.
Запускаем flash. В Welcome Screen появился новый пункт насчет AIR, и при его выборе создался новый проект. В его Publish Settings > Flash > Version теперь есть пункт Adobe Air 1.0 и он сейчас выбран.

К сожалению, такого выбора AIR-проекта не предоставили в New Project. Но, думаю, это не важно, т.к. в настройках проекта мы всегда можем установить нужную версию. Появились две новые команды в меню Commands.

При компиляции файла, в том же каталоге появился одноименный SWF-файлу XML.
Команда AIR Application & Installer Settings открывает окно с настройками AIR-пакета. Здесь мы нажмем кнопочку Package. Теперь у нас есть AIR-пакет. Запустим его. Предлагается установить наше приложение. Всё красиво и культурно. Установили и запустили - всё работает!

Команда Package AIR File также создает AIR-пакет.

пятница, августа 24, 2007

Продолжаем изучать FlexBuilder 3

Знакомиться с Flex, будем по документации, публикуемой здесь нашими уважаемыми передовиками Flash-производства.
Статья о введении во Flex Builder 2 дает общее понятие о Flex.

четверг, августа 23, 2007

Создание компонента во Flash CS3 IDE

Создаем новый Fla для AS3.
Добавляем компонент Flex Component Kit - про него вкратце я писал здесь. Создаем символ "_name_". Вызываем команду Make Flex Component. Получаем в Output: "Component "_name_" is ready to be used in Flex." В свойствах Linkage символа произошли изменения - символ предназначен для экспорта в ActionScript. В свойствах публикации отмечаем Export SWС. Публикуем.
Добавляем в свойствах проекта ActionScript Build Path > Library path > Add SWC наш компонент. Теперь в коде можно использовать класс нашего символа "_name_".

Возникла проблема с обновлением компонента. Если просто его скопировать поверх старого, при компиляции Flex - проекта ничего не изменится. Если файл компонента "перетащить" в папку проекта в окне Flex, компонент успешно обновляется.

Заметки по работе с проектом во Flex

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

Создавая папку в проекте, она создается на диске в папке проекта. После перетаскивания файлов в папки проекта, файлы копируются.

Организация проектов порой не радует. При удалении проекта с удалением файлов, Flex удаляет вообще все файлы в одноименной папке. Ужас. Для того, чтобы открыть существующий AS проект, надо создать новый проект с тем же именем, однако все настройки удалятся.

Не получается все файлы проекта хранить в одной папке: файлы, не относящиеся к Flex-разработке, нежелательно хранить в папке Flex-проекта - появляется предупреждение о том, что папки с источниками являются вложенными в папку Flex-проекта. А WorkSpace подразумевает, что в нем находятся только Flex-проекты. Можно, конечно использовать разные WorkSpace. По-видимому, придется разделять место размещение Flex-проектов и исходных материалов для Flex-разработки. Вопрос где лучше - в пределах WorkSpace или где-то в другой директории.

Каждый Workspace имеет свою конфигурацию. Например, набор проектов, перспектива, настройки интерфейса, snippet-ы и др.

В Eclipse есть понятие Perspective - конфигурация интерфейса, соответствующая определенному виду разработки. В частности - перспектива Flex Development.

Eclipse добавляет инструменты, которых нет в Flex Builder. Например, это быстрая вставка шаблонов кода Snippets.

Полезно использовать Tasks (напоминания) и Bookmarks (закладки).
Интересная команда - Source > Organize imports - убирает лишние импорты. Но не добавляет требуемых. Требуемые добавляются при выборе соответствующего класса из списка подсказки.
Тут же - команда Refactor - Позволяет заменить имя переменной или функции по всему коду. Еще - вставка разнокалиберных комментариев.

среда, августа 22, 2007

Установка Flex Builder 3 и его плагин под Eclipse

Ставлю Flex Builder Plugin под Eclipse.
Запускаем инсталлятор. Единственное что смутило - спросил установить дебаг-версии плагинов FlashPlayer 9, а я только сегодня поставил свежие версии. Интересно, они поверх встали?.. (Да, поверх.)
Всё установилось. Спрашивает, хочу ли я прочитать инструкции по установке расширений Coldfusion для Flex Builder 2 (почему то 2). Смотрим. ColdFusion MX 7.0.2 у меня не установленно, так что не вижу смысла читать дальше. Запомним на будущее они лежат здесь: C:\Program Files\Adobe\Flex Builder 3 Plug-in\ColdFusion Extensions for Flex Builder\Installing the ColdFusion Extensions for Flex Builder Moxie.htm
Запускаю из меню Пуск. Спрашивает где будет папка для workspace. Создаю, указываю.

Окошко Welcome весьма привлекательно.
Создаем новый проект - выбрал Flex project. Даю название, тип сервера - никакой. Версия Flex SDK - по умолчанию Flex Moxie M2. Можно задать еще ряд параметров. Оставим пока всё как есть. Таак. началось. Спрашивает серийный номер... Интересненько. Нажал Purchase, на что после нескольких ошибок в дисководе F, выкинуло на сайт. Странно, что никаких намеков на Flex там нет. По-видимому заглушка на будущее. Ладно. Тогда "Try". Ну вот, собственно мы видим наш Flex Development.

Ладно, закрываем пока. На месте нашего проекта создалось множество файлов и папок, причем, проект уже скомпилировался и появились несколько версий SWF.

Попробуем-ка теперь установить Flex Builder таким как он есть.

Запускаем. Инсталлятор задает все аналогичные вопросы. В итоге получаем всё то же самое, внешнее различие незначительно – заключается в дизайне виджетов и расположении иконок. Позже обнаруживаются и другие различия.
Сравниваю. Пока склоняюсь к дальнейшей работе на Eclipse.

Беру пример из движка Fisix, выбираю New ActionScript Project. Добавляю размещение SWC в разделе Project > Properties > ActionScript Build Path > Library path > Add SWC,
копирую в корень проекта файл AS-кода, ставлю Set As Default Application.
Наше приложение отлично работает. Даже работает trace в окне Console.

Подсказки работают (принудительно - Ctrl+Space). Работают адекватно только если файл открыт в рамках проекта. Help работает превосходно.
С нормальной подсветкой пока глухо. Попробуем поискать плагины.

вторник, августа 21, 2007

Flex Builder 3.0, Eclipse

Сегодня скачал Flex Builder 3.0 и Flex Builder Plugin для Eclipse с labs.adobe.com. Пусть будут. Разберемся что лучше. Тем и будем пользоваться.

Кстати, качаем последний релиз Eclipse. На сайте, в разделе Downloads предлагается несколько вариантов этой платформы, заточенных под разные направления программирования.
Интересно - с OSFlash идет ссылка на другой раздел. Ага. OSFlash нас призывает пользоваться Web Tools Platform. Точно - в разделе Downloads справа в меню есть такая ссылка. Слева тоже есть просмотр всех проектов By project, в котором находим WST - Web Standards Tools. А вот здесь новости проекта.

Ну всё. Качаем отсюда. Качаем wtp-all-in-one-sdk-win32 - всё в одном. Итальянский линк качается лучше. Запускаем. Впечатлило! Но ничего не понятно. Пока. Для начала поставим под это дело Flex. Но это в следующей серии.

пятница, августа 17, 2007

FlashDevelop. Plugins

Как только начинаем работать в редакторе, сразу испытывается дискомфорт из-за отсутствия под рукой Help-а и быстрого перехода на интересующую нас статью прямо из редактора. Кстати, при нажатии F1, открывается Google со строкой поиска, содержащей выделенное слово. Причем, если IE уже открыт, то откроется прямо в нем. Нас это, конечно же не устраивает.
Попробуем решить эту проблему использованием плагинов (если таковые имеются). Смотрим официальный сайт. В разделе Plugins находим HelpPanel Plugin Releases [1.4 Beta]. Качаем Download Beta Release последнюю версию. Разархивируем, читаем readme.txt. Надо скопировать две DLL-ки в каталог с плагинами. Копирую "FlashDevelop\FirstRun\Plugins". Запускаю FlashDevelop. Сразу ошибка "Unable to load one or more of the requested types..." Так. Пробуем предыдущую версию, которая не beta. Тот же результат. Пока ясно одно - плагин для 2-й не работает под 3-й версией.

Ну точно. Последняя (на сегодня) фраза в этой теме: "I suppose I need to work on my rusty c# skills again so that I can update the help plugin for FD3 soon". Это всё объясняет.

Судя по всему, других новых плагинов пока еще тоже нет.
Увы, ждем появления и закрываем тему с плагинами.

Есть еще вариант более удобного просмотра Help:

Вызываем On-line Documentation

Открывается окно броузера новой закладкой прямо в редакторе.

В адресную строку вводим адрес документации: http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/js/html/wwhelp.htm.
Затем можно было бы переместить окошко на нужное место и сохранить в Layouts полученную конфигурацию окон. Но при старте программы или активации Layout, окно не выводится.

Итак. Сделать более удобный доступ к Help мы не смогли. Это большой минус, который, возможно, будет скоро исправлен.

среда, августа 15, 2007

FlashDevelop. Первые впечатления

Теперь попробуем редактор в действии.
Для начала, я взял пример с роботом из архива APE alpha 0.45.
Создаем новый проект: Project > New Project > ActionScript 3 - Default Project. Здесь мы даем название проекту и указываем где будет располагаться рабочий каталог.
После создания проекта, в указанном каталоге появились подкаталоги bin, classes, library. В каталоге classes появился файл Main.as, в котором описывается пустой класс "Main".
Внимание! Программа выдает сообщение, что в каталоге есть файлы. Если там уже есть файл Main.as, что бы в нем не было, он будет заменен на файл пустого класса (и я на это попался).

Итак, справа в закладке "Project" отображаются все рабочие файлы проекта. Удаляем Main.as и отмечаем для RobotDemo.as во всплывающем меню "Always Compile". Таким образом, этот файл при компиляции будет основным. Имя результирующего SWF, по команде "Test movie" и "Build Project" будет соответствовать названию проекта.

В свойствах проекта множество настроек. Понравилась возможность указывать командные строки до и после компиляции. Рекомендую сразу установить "Open SWF in" = "External", чтобы "Test movie" открывалось в проигрывателе а не новой закладкой в основном окне редактора.

Немного поигрался настройками робота и довел его до полной самодеструкции на первых же секундах движения.

Впечатления по редактору. Чувствую себя комфортно. Решил бросить свой старый устоявшийся еще с турбо-паскаля стиль программирования (точнее форматирования) и перейти на стандартный. Здесь в этом есть смысл - табуляции отображаются пунктирной линией, что четко отражает структуру кода.
Автоподстановка работает прекрасно, ловко предугадывая, где надо предложить варианты. И делает это без "фанатизма", если в ее услугах не нуждаются. Сама подстанавливает при необходимости директивы "Import Имя класса" над описанием класса. Кроме того, автоподстановка хватает на лету только что созданные классы, их методы и свойства.
Важно - комментируя методы использовать ключевые слова"@param", "@private". Тогда автоподстановка станет еще умнее.


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

Очень понравилась система "Snippet" - вставки шаблонов кода.
Если зайти в "C:\Program Files\FlashDevelop\FirstRun\Snippets\as3\", там лежит набор стандартных шаблонов. Я тут же забил туда кучу новых шаблонов и вскоре успешно ими воспользовался. В шаблонах предусмотренны ключевые слова типа $(EntryPoint). Список всех ключевых слов здесь. Нажимаем Ctrl+B и пишем что-либо. В появившемся списке отбираются названия (или имена файлов) шаблонов, содержащих это что-либо. Выбираем нужный шаблон и ... получаем нужный фрагмент кода.
Таким образом, мы здорово облегчаем себе жизнь и ускоряем рабочий процесс.

Пока не совсем всё понятно с отладкой. Я нашел только trace и это возможно так:
  • Используем fscommand("trace", message);
  • Используем методы классов из "C:\Program Files\FlashDevelop\FirstRun\Library\AS3\classes\org\flashdevelop\utils\" - FlashConnect, FlashViewer, TraceLevel.

Завтра будем пробовать плагины для FlashDevelop.