пятница, января 18, 2008

Делаем прелоадер для Flex-приложения. AS3.

Если при разработке проекта нам доступен для редактирования таймлайн основного SWF, например, мы делаем проект во Flash IDE, всё просто - всё делаем как и раньше - а точнее - как нам советует в своей статье "Экспорт классов во второй кадр и создание прелоадера во Flash CS3" __etc.
А что делать, если наш проект компилируется Flex SDK?
Можно сделать маленький модулек, который будет загружать и мониторить загрузку основного SWF. Ну а если требуется наличие только одного SWF?

Люди советуют почитать статью Preloaders in AS3. Читаем.

Основную мысль автору статьи, подсказал Ted Patrick, намекнув на мета-тег [Frame] и поглядеть исходник mx.core.Application.
Поглядим-ка
"...\Flex2SDK\frameworks\source\mx\core\Application.as ".
Как отметил 101 (тот что автор статьи) там и правда есть тег [Frame(factoryClass="mx.managers.SystemManager")]. А в комментарии, по-моему, ключевой является фраза "Все фреймворки инициализируются SystemManager-ом".

Идем смотреть
"...\Flex2SDK\frameworks\source\mx\managers\SystemManager.as".
И правда - видим интересные фразы типа "ВНИМАНИЕ: Минимизируйте не флэшовые классы, которые импортируете здесь, всё что связано с SystemManager будет загружено в 1й фрейм до того, как загрузится прелоадер, и вообще, что-либо отображающееся." Кроме того, несколько ниже, говорится, что "SystemManager - первый визуальный класс, который создается в приложении. Он так же отвечает за создание mx.preloaders.Preloader, который отображает mx.preloaders.DownloadProgressBar до конца загрузки приложения, после чего SystemManager создает mx.core.Application instance". Собственно, вызывается метод SystemManager.create, код которого приводит 101 (автор).
Он пришел к следующим мыслям:
  • Сначала создаем основной класс MainClass как обычно и указываем компилятору чтобы он его компилил.
  • Затем в этом классе вставляем тег [Frame(factoryClass="MyFactoryClass")], который указывает на некий другой класс MyFactoryClass.
Это должно привести к тому, что скомпилируется SWF с двумя фреймами! Всё барахло, которое мы имбедим, наш основной класс, другие классы которые он пользует - всё это будет импортироваться во второй фрейм. Единственное, что будет импортировано в первый фрейм - наш класс MyFactoryClass и всё что он пользует. Шикарно!

Итак, нам остается всего-навсего создать класс обычного прелоадера, который:
  • Делает stop();
  • Мониторит загрузку любым удобным для нас способом.
  • После полной загрузки делает nextFrame();
Теперь мы можем инстанцировать основной класс используя getDefinitionByName() {А откуда?}. Это дает нам возможность контролировать, какой класс мы хотим сделать основным. Кроме того, теперь мы можем выгрузить прелоадер.
Еще одна любопытная особенность этого решения - основной таймлайн представляет MainClass, но в качестве "Document Class" теперь выступает не MainClass, а MyFactoryClass. Из этого следует:
  • MyFactoryClass должен наследоваться от MovieClip. И не в коем случае не от Sprite.
  • При инстанцировании MainClass, необходимо добавить (addChild) его в дисплей-лист MyFactoryClass.
  • MainClass не будет являться корнем дисплей-листа. Он будет чайлдом MyFactoryClass.
  • В своем конструкторе, MainClass не должен ссылаться на "stage", так как он будет доступен только после добавления (addChild) MainClass в дисплей-лист.
Теперь, всё, что осталось для нас неясным, развеем примером: код примера.

В основном классе FrameTest - это то что выше называлось MainClass - всё просто. Имбедится и выводится картинка "big_asset.jpg", желательно очень большого размера. Единственное необычное - это фраза [Frame(factoryClass="MyFactory")].

Класс MyFactory - это наш вышеописываемый MyFactoryClass.
  • В конструкторе производится остановка тайм-лайна stop(), выставляются параметры stage и добавляется обработчик "ENTER_FRAME".
  • Обработчик onEnterFrame() рисует полосу состояния загрузки вычисляя процент загрузки: var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
  • При выполнении условия framesLoaded == totalFrames, объект отписывается от события "ENTER_FRAME", осуществляет переход на следующий фрейм nextFrame() и производит инициализацию init().
  • Метод инициализации init() получает определение основного класса var mainClass:Class = Class(getDefinitionByName("FrameTest")); и, если такой класс существует if (mainClass), инстанцирует его и добавляет в дисплей-лист: var app:Object = new mainClass(); addChild(app as DisplayObject);.

Всё. Переходим к практике.

* * *

Не забудем положить картинку "big_asset.jpg" в папку с классами.

Первая коррекция - getDefinitionByName вызывает исключение, в случае если класс не найден. Поэтому проверки if(mainClass) недостаточно. Нужна обработка исключения try ... catch.

* * *

Пробуем trace(this.currentFrame);. Он выдает правильно - 1 из конструктора MyFactory, 2 - из init();.

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

Интересное наблюдение - если накопировать одну и ту же картинку и имбедить копии, размер SWF не изменится - как будто внедрена одна картинка! Вот это сжатие!

Итак, утяжелил до 20 мБ. Теперь всё встало на свои места. Прелоадер аккуратно отрабатывает объем и затем отображается картинка! Всё дело было в слишком быстром интернете.

Итак, подход прост и практичен. Спокойно делаем правильные и эффектные флэшки любого размера!

четверг, января 17, 2008

Теги ASDoc. AS3

Теги ASDoc

@copy reference - копирует ASDoc комментарий из reference. Копируется основное описание и теги @param и @return. Остальные теги не копируются.
Пример: @copy #stop, @copy MovieClip#stop

@default value - указывает значение по умолчанию value для свойства, стиля или эффекта.
Пример: @default 0xCCCCCC

@eventType package.class.CONSTANT - комментарий для тега метаданных [Event]. Описывает константу, которая определяет значение свойства Event.type объекта event, ассоциированного с событием.

@eventType String - комментарий для констатны события. Указывается перед определением константы события и определяет название события. Если тег не указывается, комментарий констатны не заносится в описываемый класс.

@example exampleText - вставляет пример в текущее описание, при этом применяет к тексту кода особый стиль и генерирует заголовок. Сам код заключается в теги <listing version="3.0"></listing>. Код будет расположен в серой прямоугольной прокручиваемой области с сохранением пробельных символов.
Пример: @example The following code sets the volume level for your sound: <listing version="3.0"> var mySound:Sound = new Sound(); mySound.setVolume(VOL_HIGH); </listing>

@exampleText string - используется во внешних файлах с примерами, на которые осуществляется ссылка из тега @example. Этот комментарий должен располагаться в начале, перед первой строкой или в конце - ниже последней строки примера. Во внешних файлах примеров допустимо указывать только один комментарий в начале и один в конце.
Пример: /** * This text does not appear * in the output. * @exampleText But this does. */

@inheritDoc - используется для комментирования перекрываемых свойств и методов класса-потомка. При этом, в описание класса-потомока копируется комментарий из класса-предка, или из интерфейса, который реализуется этим классом-потомком. Копируется только содержимое тегов @param и @return. Остальные теги игнорируются. При формировании комментария для этого тега, соблюдается следующий порядок:
1. Интерфейсы, используемые описываемым классом (в свободном порядке) и все их базовые интерфейсы.
2. Прямой предок класса.
3. Интерфейсы, используемые классом прямого предка и все их базовые интерфейсы.
4. Повторяются п. 2 и 3 до тех пор, пока не будет достигнут класс Object.
Пример: @inheritDoc

@internal text - внутренний комментарий, который не будет включен в документацию.
Пример: @internal Please do not publicize the undocumented use of the third parameter in this method.

@param paramName description - добавляет комментарий, описывающий метод с именем paramName.
Пример: @param fileName The name of the file to load.

@private - исключает внесение комментируемого элемента в документацию.
Пример: @private

@return description - добавляет в описание метода раздел Return - комментарий касательно возвращаемого значения. Возвращаемый тип определяется ASDoc автоматически.
Пример: @return The translated message.

@see reference [displayText] - добавляет в описание метода раздел See Also - ссылка на описание элемента класса.
Пимер: @see flash.display.MovieClip

@throws package.class.className description - документирует ошибку (исключение), которую может генерировать метод.
Пример: @throws SecurityError Local untrusted SWFs may not communicate with the Internet.


Не ASDoc теги

Я не нашел эти теги в Adobe LiveDocs, но люди их пользуют.

@author - автор кода. Пример @author Name
@version - версия кода. Пример @version 3.15
@langversion - языковая версия. Пример @langversion ActionScript 3.0
@playerversion - версия Flash Player. Пример @playerversion Flash 8


Примеры использования тега @see:

@see "Just a label" - текстовая строка
@see http://www.cnn.com - ссылка на внешний веб-сайт
@see package-detail.html - ссылка на локальный HTML-документ
@see Array - класс верхнего уровня
@see AccessibilityProperties - пакет
@see flash.display.TextField - класс TextField в пакете flash.display
@see Array#length - свойство класса верхнего уровня Array
@see flash.ui.ContextMenu#customItems - свойство класса ContextMenu из пакета flash.ui
@see #updateProperties() - метод в описываемом классе
@see Array#pop() - метод класса верхнего уровня Array
@see flash.ui.ContextMenu#clone() - метод класса ContextMenu из пакета flash.ui
@see global#Boolean() - метод пакета верхнего уровня global
@see flash.util.#clearInterval() - метод из пакета flash.util

Относительно правил ASDoc-комментирования смотреть списанное из чужой тетради.

PS: Наконец решил расставить все точки над Ы и правильно комментировать свой код.

* * *

Другие замеченные теги

@mxml
@includeExample
@event

вторник, января 15, 2008

Вторая встреча RAFPUG. Дети - наше будущее.

Владелец "Быстроупака" был чрезвычайно доволен. "Красиво составлено, - решил он, - под таким соусом и деньги дать можно. В случае удачи - почет! Не вышло - мое дело шестнадцатое. Помогал детям, и дело с концом".
Двенадцать стульев. Илья Ильф, Евгений Петров

Вторая встреча состоялась 14 января 2008. Несколько ключевых моментов: комьюнити, доклады, место проведения, дети.

Место проведения

Место нашли быстро, благодаря фотографиям, размещенным в анонсе. Иначе, можно было бы долго плутать между длинных заборов. Итак, к 17 часам мы оказались в заведении, именуемом "Московская физико-математическая школа №2". Кстати, впечатление вполне положительное - всё чисто, ухожено и культурно. Рядом со входом уже курили участники встречи в том числе Рост, Иван, Константинер, Таня и другие сотоварищи. Поздоровались - уухх руку не буду неделю мыть!

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

Доклады

После вступительного слова о пользе и благодарности компании Adobe, микрофон взял Andrew Shorten. Несколько раз оглушенный высокочастотными писками и скрипами из динамиков, он произнес хвалебную речь новым достижениям Adobe в области RIA. Доклад сопровождался переводом, что было хорошо для понимания, но убийственно для времени проведения мероприятия. Зато дети не скучали и внимательно слушали. После доклада много времени убилось на вопросы слушателей, в принципе не сильно важные и интересные.
Лично для меня, доклад внес ясность в некоторые вопросы касательно AIR. В остальном - просто обновил и подкорректировал общую картину продукции Adobe.

После буфета, последовал доклад про Flex 3. На этот раз обошлись без перевода и мне пришлось включить свой английский. Дети начали потихоньку линять.
Andrew на примерах рассказал о том, как сделать компонент, создать скин для компонента, показал новые фичи. Сильно подпортил картину тормозной компьютер, за который Andrew постоянно извинялся и краснел. Кроме того, примеры были уже "заготовлены", что смотрелось менее познавательно и убедительно чем в докладе Артемия Малкова на первой встрече. Но в итоге лично я остался доволен. Нас собрали, бесплатно рассказали о важных и познавательных вещах, да еще и покормили.

После нескольких вопросов-ответов, слово взял Enrique Duvos. Доклад читался на английском с испанским акцентом. Этот чертов испанец, в свойственной им манере, так зашустрил, что пришлось включить свой быстрый английский. А он у меня еще не доделан. Поэтому, информация усваивалась частично и большей частью читалась с экрана. Но на экране тоже было всё мелко и с нашего ряда неразборчиво.
И всё же, урывками, я получил общее представление о том, какие продукты являются open-source, какие нет, чем это всем грозит и как всё это замечательно. Дата-сервисы дались труднее. Впечатлила демонстрация синхронной работы двух флекс-приложений, причем, синхронизация осуществлялась мгновенно посредством сокетов через веб-сервис.
Почти все дети ушли. Остались самые стойкие. Точнее стойким был один. Он сидел в ряду перед нами и внимательно слушал. Его вид настолько меня впечатлил, что мне даже за себя стало стыдно что я половину читаемого не понимаю... Рядом дальше сидели два его товарища. Нет - они полулежали, полукрутились, полуспали и упирались лбами в спинки впереди стоящих стульев. Короче, создавали контраст, что вселяло еще больше уважения к первому стойкому. Не... если б мне обломился приз на розыгрыше, я б наверное отдал приз ему.

Перекусив парой-тройкой булок в буфете, мы перешли к заключительной части. Заключительная часть была сильно скомкана. И не удивительно. Уже был 10й час. Constantiner, уложившись в 10 минут поведал о RIA. Что можно рассказать о RIA за 10 минут? Только общие фразы, которые в основном нам всем уже известны. Жаль, что мероприятие началось так поздно - я убежден, что Костя хотел нам рассказать гораздо больше и интереснее.
Иван Дембицкий еще раз доказал свою компетентность и заслуженное уважение во flash-сообществе. Как я краем уха слышал без подготовки, Ваня выразил наше общее настроение, по сути, подведя резюме первой встречи.
Артемий Малков завершил выступления. Мысль его была направлена на внедрение flash в систему образования. Презентация его была украшена забавной анимацией, наглядно показывающей, как здорово на флэш смотрятся физические опыты. Однако, большое черное пятно в левом нижнем углу выглядело на экране проектора как тень от чьей-то прострелянной головы, что было еще забавнее.

В конце мероприятия провели розыгрыш призов. Все участники заполнили анкеты, из которых и выбирались счастливчики. Призы были действительно ценные - коробки с Flash CS3 (или Master Collection?), Flex Professional, iPhone nano, ну и по мелочи - рюкзаки. Правда призы застряли где-то по дороге, но обещали что их доставят почтой.
Мы-то знаем для чего нужен розыгрыш в конце мероприятия - чтоб народ до конца досидел и анкеты заполнил. Лишняя мотивация - перестраховались что ли? Сомневаюсь, что кто-то сидел ради призов.

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

Впечатления

  • Жаль что поздно начали. Во второй половине дня уже мозг плохо воспринимает информацию и зовут домашние дела. И времени явно не хватило.
  • Доклады, несмотря на многие недостатки, оказались очень ценными и я нисколько не жалею о потраченном времени.
  • Идею преподавать программирование на Flash в школах лично я поддерживаю, т.к. у флэша есть одно главное преимущество - с ним интересно работать. Детям это будет увлекательнее чем бэйсик. Кроме того, в комплексе могут быть даны основы графики и анимации.
    Но есть одно НО. Преподавать надо соблюдая правила программирования, чтобы не запудрить детям мозг нетипизированными переменными, глобальными _root-ами и другими вредными особенностями ActionScript. А еще точнее - преподавать надо не ActionScript, а программирование согласно стандарта ECMAScript. Иначе можно "попортить" наших программистов.
  • Насчет вопроса о преподавании Flex в ВУЗах сомневаюсь. Точнее, преподавать нужно, но факультативно. Пусть учащиеся сами выбирают кем они хотят быть и на чем хотят программировать. Создавать факультет Flex-разработчиков или кафедру Flash, на мой взгляд, мало кто согласится. Это узкая специализация. Хотя, кто знает... RIA-специалист, возможно вполне реальная специальность. Но она много чего в себя должна включать. А Flash/Flex-разработка лишь как составляющая.
    Вызвало недоумение утверждение Артемия Малкова по поводу преподавания Flash/Flex - (по памяти) - "Если кто-то рисует хорошо - будет рисовать, кто-то похуже - будет программировать". Как-то однобоко. А если и программировать не умеет? В расход пускать?
  • Ждем следующей встречи!

* * *

Поправки.

По-видимому до нашего ряда иноязычная речь дошла с искажениями и вот, появились уточнения и коррекции. Призы - Flex Builder 3 Professional, Creative Suite 3 Web Premium, iPod Nano.

пятница, января 11, 2008

uint лучше не использовать для счета. AS3

В обсуждении "AS3: uint на много медленнее, чем Number" выясняется, что тип uint лучше не использовать для счетных целей, если конечно нет особой необходимости. Сам с собой он складывается ужасно, с Number еще ужаснее.

Adobe отдыхает




четверг, января 10, 2008

Осваиваем Papervision3D. Часть III. Примеры

Продолжаем вгрызаться в Papervision 3D.
Для тестирования я выбрал пример "Panorama" из папки "examples". Кстати, попутно еще раз убедился в пользе SVN: скопировав папку с примером в рабочий каталог, я скопировал находящуюся в ней папку ".svn" - теперь в любое время, я могу выбором из контекстного меню проводника легко обновить файлы прямо с сервера SVN-репозитория. Чертовски удобно - пора ставить SVN-сервер!

Создаю во FlashDevelop проект типа "Flash IDE Project". В свойствах проекта, в "Classpaths" указываю путь к классам Papervision3D "...\as3\trunk\src". Это нам нужно для того, чтобы работала проверка ошибок, подстановка и другие удобства. Как только классы подцепились, в панели "Task Panel" FlashDevelop появился список задач TODO, что говорит о незавершенности и бурном развитии проекта.
Теперь надо указать путь к классам во Flash IDE. В Getting Started FAQ нам советуют установить путь в свойствах среды: "Edit -> Preferences -> Actionscript -> Actionscript 3.0 settings -> Classpath". Пожалуй не буду обобщать и укажу путь для моего конкретного FLA файла в "Publish settings -> Actionscript Settings -> Classpath". Кстати, там уже есть путь к классам, но только относительный, а раз мы скопировали в другую папку, то, конечно, неправильный.
Запускаем проект - всё компилируется без ошибок, запускается панорама - мы внутри куба, на стенах которого надписи. Попробуем что-нибудь изменить. Например, мне не нравится качество отображения надписей. Всё из-за того, что текстуры маленькие и качество сцены установлено в LOW. Увеличиваем размер одной из текстурок - например, та что "BOTTOM". Хе, на размер 3000 выскочило исключение. Ладно, поставим 2000. Забавно натягивает.
Заметил хитрый ход: изменение качества сцены сильно не меняет картины, однако, ресурсов процессора потребляется заметно меньше.
Продолжаем смотреть примеры. В общих чертах - создается сцена, создается камера, создаются материалы для объектов, создаются объекты и добавляются в сцену, выставляются параметры и по ENTER_FRAME осуществляется управление сценой и ее перерисовка.

Примеров вполне достаточно, чтобы разобраться и начать применять Papervision3D в своих проектах. Чем мы активно и займемся в ближайшее время.

среда, января 09, 2008

Осваиваем Papervision3D. Часть II. Установка

Следуем Getting Started FAQ -> Getting started walkthrough.
Качаем и устанавливаем SVN-клиент. Об этом подробно изложено здесь: "Установка SVN-клиента TortoiseSVN". Тут же описан процесс скачивания SVN-репозитория.
В итоге, мы имеем каталог с классами Papervision3D.

Порыв интернет, нашел следующую информацию по серверу Subversion:
Здесь пишут, что:
"Большинство людей создают папку trunk для поддержки "основной линии" разработки, папку branches для копий ветвей, и папку tags для копий меток. Если хранилище содержит только один проект, тогда часто создают их как папки верхнего уровня."
Здесь пишут, что:
"Структура проекта может быть произвольной, но общепринято создавать три основных каталога: branches – для веток, tags – для тегов проекта и trunk – непосредственную рабочую область для коммитов".
На Wikipedia можно почитать про Subversion в общих чертах.

Кстати, попался на глаза блог Установка и настройка Subversion. Нам это еще пригодится.

Итак, базовая структура репозитория создается из директорий trunk, tags, и branches.

На сколько я понял, структура SVN Papervision3D следующая:

  • as2 - С ней всё ясно: "\as2\trunk\" содержит классы финальной версии для AS2, ее документацию и примеры.
  • as3 - Здесь в "\as3\trunk\" лежит финальная версия для AS3. В "\as3\tags\", очевидно, предыдущая версия.
  • branches - Здесь разрабатываемые/тестируемые/альфа/бета версии. По всей видимости, нас интересует "\branches\GreatWhite\" - та что Papervision3D 2.0 GreatWhite.

Не исключено, что структура репозитория может измениться.

Продолжаем изучать полученные материалы. Пока не будем лезть в последнюю версию и поработаем с той, что лежит в "trunk" - "Beta 1.7" (я узнал это, открыв и просмотрев файл "Papervision3D.as").

Смотрим примеры.

Магическое число 6710886.35. AS2

Интересно, что для пустого клипа getBounds() выдает:
для _root:
yMax=6710886.35
yMin=6710886.35
xMax=6710886.35
xMin=6710886.35
для обычного клипа, почему-то округляет до 6710886.4.

Любопытно, что если это число перевести в HEX, получается 666666... Мистика.

Осваиваем Papervision3D. Часть I. Обзор ресурсов

Итак, свершилось. Добрались, наконец, до Papervision3D.

Для начала порыскаем по сайту. Посмотрим, для начала, последние проекты с использованием этой технологии и вдохновимся.
Первый, интересный для нас раздел - Downloads. Судя по датам, всё, что здесь размещено уже старовато - последняя версия 1.5, дата последнего апдейта - Jul 25. Хотя, в новостях уже можно видеть декабрьский анонс Papervision3D 2.0 Alpha - Great White. Судя по отзывам, пока ни у кого не возникло существенных проблем использования последних версий. Только восторги и благодарности. Что ж, значит нам туда дорога.
Дальше, поглядим-ка, что тут на форуме. Активность здесь неслабая.
Раздел "Getting Started" - это что нам и надо. Смотрим Documentation. Как и следовало ожидать, скупо документированный ASDoc. Что радует, на первый взгляд - структура прозрачна, а количество пакетов и классов вполне обозримо.
Ссылка Cheatsheet открываться не захотела.
Tutorials и Getting Started FAQ, собственно,ведут на Wiki, где нам и предстоит остановиться в дальнейшем.
Еще один интересный раздел - "Recommended tools". Здесь нам рекомендуют пользоваться FlashDevelop (что мы, собственно и делаем), Fuse Kit - пока непонятно зачем (движок анимационных эффектов на AS2, а 3-я версия этого продукта, по всей видимости, пока готовится), Xray - утилита для просмотра снэпшота текущего состояния flash-приложения. Мда, по-видимому это просто партнерские ссылки.

Ладно, идем смотреть Wiki.
В разделе Getting Started FAQ для нас наиболее интересна информация "Getting started walkthrough" - подробное описание скачивания и установки Papervision3D. Этот процесс мы рассмотрим во второй части изысканий.
Разделы FAQ, Tutorials и Examples оставим для 3-й части.
Ссылки из "Content creation" посвящены созданию 3D-контента. Здесь без 3D-специалиста мне не обойтись, т.к. сам я имею отдаленное представление о 3D-моделировании - пусть этим занимаются другие. Подсуну ему вот эту ссылочку: COLLADA, чтоб у него было чем экспортить для меня модели.
Ссылки "Showcase" дают мало полезного - старые демки, сайты c SWF по 20Mb и т.п.

Итак, пора приступать к установке и тестированию Papervision3D.

вторник, декабря 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.