Предмет: Flash-технологии, программы, редакторы, классы, библиотеки. Методика: Изучение шаг за шагом, поиск новых решений, сбор ссылок, новостей и мнений, разбор примеров. Цель: Сбор, обработка и накопление тематической информации.
суббота, января 22, 2011
Забавный глюк автокомплита
вторник, октября 13, 2009
Спасительный cacheAsBitmap и wmode=transparent
this._infoContainer.cacheAsBitmap=true; (_infoContainer - это окошко, контейнер для плашки и указателя, DisplayObjectContainer). Теперь всё выводится корректно.суббота, мая 16, 2009
Модули, синглтоны, Type Coercion Failed и спасение
Сегодня столкнулся с такой проблемой:
Приложение использует модули. Один из модулей содержит ComboBox.
Во время работы, подгружается то один модуль, то другой. Так вот.
При первой активации, модуль с ComboBox работает корректно. Однако, при повторной активации модуля, начинаются проблемы - при нажатии на ComboBox вылетает ошибка:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::PopUpManagerImpl@6c0ce41 в mx.managers.IPopUpManager.
Аналогичная ошибка с компонентом List, правда немного с другими классами:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать mx.managers::DragManagerImpl@6b7ec11 в mx.managers.IDragManager.
Ужасаясь перспективе просидеть в дебаге всю ночь, полез в Гугл. И тут же нашел спасение - не один я столкнулся с таким казусом:
Flex Error #1034: Type Coercion Failed: Cannot Convert Mx.managers
Вот решение (я его оформил немного поизящнее):
Нужно в коде основного приложения указать следующую строку:import mx.managers.*;DragManager;HistoryManager;PopUpManager;
Одним индусам известно, что случается с этими синглтонами после выгрузки модуля, могу предположить, что таким образом, мы принуждаем компилятор внедрять эти классы в основное приложение а не в модули. В ином случае, они внедряются в модуль, и, скорее всего, в какой-то момент теряются.
четверг, марта 05, 2009
Дружим Flex с Flash. Заметки: загрузка, внедрение, шрифт. Flex
Для начала, несколько заметок:
- Перенос строки в строках MXML: символ 
 - мелочь, а приятно.
- Загрузка сложных Flash-приложений в SWFLoader должна производиться в выделенный домен приложения, т.к. могут быть конфликты классов:
. . .
private function creationCompleteHandler(event:Event):void {
swfLoader.loaderContext=new LoaderContext(false,new ApplicationDomain());
swfLoader.load();
}
- Если внешнее приложение подгружается в SWFLoader, есть вероятность, что в какой-то момент SWFLoader потеряет stage, что может пагубно отразиться на функциональности этого приложения. Если приложение где-то внутри обращается к stage и не обрабатывает его недоступность, то будут генерироваться ошибки. Побороть этот недостаток я не смог - только устранив все "не защищенные" stage из внешнего приложения.
- Внедрение шрифтов. Гораздо надежнее внедрять шрифт непосредственно из TTF файла. Внедрение из файла SWF, в котором, в свою очередь, внедрен необходимый шрифт лучше оставить для тяжелых случаев несовместимостей с Flex. Дело в том, что почему-то, внедренные в SWF разные стили (normal, bold) шрифта не корректно "извлекаются" Flex-ом. Он не дает назвать разные стили разными именами (как это можно сделать в первом случае), теряет одно из начертаний (жирный шрифт просто не выводится). Возможно, это из-за особенностей конкретных шрифтов, но первый метод срабатывает гораздо стабильнее.
{
fontFamily: "Century Schoolbook";
fontWeight: normal;
fontStyle: normal;
src: url("file://./assets/fonts/CENSCBK.TTF");
unicodeRange:
U+0020-U+0040, /* Punctuation, Numbers */
U+0041-U+005A, /* Upper-Case A-Z */
U+005B-U+0060, /* Punctuation and Symbols */
U+0061-U+007A, /* Lower-Case a-z */
U+007B-U+007E, /* Punctuation and Symbols */
U+00FC-U+00FD,
U+0410-U+042F, /* Cyrillic Upper-Case A-Z */
U+0430-U+0451; /* Cyrillic Lower-Case a-z */
}
@font-face
{
fontFamily: "Century Schoolbook Bold";
fontWeight: bold;
fontStyle: normal;
src: url("file://./assets/fonts/SCHLBKB.TTF");
unicodeRange:
U+0020-U+0040, /* Punctuation, Numbers */
U+0041-U+005A, /* Upper-Case A-Z */
U+005B-U+0060, /* Punctuation and Symbols */
U+0061-U+007A, /* Lower-Case a-z */
U+007B-U+007E, /* Punctuation and Symbols */
U+00FC-U+00FD,
U+0410-U+042F, /* Cyrillic Upper-Case A-Z */
U+0430-U+0451; /* Cyrillic Lower-Case a-z */
}
- Внедрять клип из внешней SWF так, чтобы работали его фреймовые скрипты можно следующим образом:
source="@Embed(source='assets/Index.swf')"
При внедрении отдельного символа, его фреймовые скрипты и скрипты всех вложенных объектов теряются:source="@Embed(source='assets/Index.swf'#Index)"
Игра с параметром mimeType не помогает.
На управлении внедренным контентом я бы хотел остановиться подробнее. Если у нас много однотипного материала для внедрения вышеописанным способом, то плодить SWF-файлы не удобно, плюс, внедряя каждый файл, мы не можем обобщать графику - она будет внедряться для каждого файла заново (не проверял, но догадываюсь).
Куда удобнее создать одну большую библиотеку и из нее внедрять символы. Но, к сожалению, их скрипты уже будут не доступны.
Но у нас есть в распоряжении метки фреймов и имена клипов. Совмещая возможности
MovieClip.currentLabels и MovieClip.addFrameScript можно получить контроль над внедренным клипом и заставлять его в нужный момент выполнять необходимые нам действия: останавливать клип на нужном фрейме, генерировать события и даже передавать данные в текстовые поля клипа.
Создаем компонент - наследник SWFLoader. После инстанцирования класса внедренного клипа (конец метода load(), можно так же добавить и в обработчик события загрузки), считываются все его метки и в их фреймы добавляются необходимые скрипты. Имя каждой метки имеет ключевую составляющую, которая и определяет тип действия добавляемого скрипта.
В нужный момент можно заставить клип остановиться, перейти на другую метку, генерировать событие (с идентификатором, так же зашитым в имя метки), просканировать клип и получить срез всех визуальных объектов, чтобы делать с ними всё что угодно. Главное - этот момент устанавливается прямо в таймлайне клипа, а не путем каких-либо расчетов количества фреймов или подобных методов.
Прекрасный момент - праздник еще не настал, а дидлайны уже позади! Отдыхать и набираться сил.
И конечно, наших прекрасных женщин поздравляю с праздником 8 марта!
среда, февраля 25, 2009
В цинковом гробу. Перетаскиваемые окошки
Во-первых, сразу зарекаюсь - Мак только для мак-девелоперов. Без меня. Такого количества проблем я уже давно не встречал. Возможно, основным виновником их является Zinc, который я смело могу назвать УСЛОВНО кросс-платформенным.
Что сказать про Zinc 3.0? Под красивым брендовым дизайном, симпатичной оболочкой, красивыми заголовками скрывается довольно ограниченный функционал, убогая документация и море непонятностей, глюков и граблей.
В данном посте, приведу один пример, как простая задача решается через "заднее место".
Нужно, чтобы окошко нашего виджета перетаскивалось мышкой за специальную панельку. В документации, нам рассказывают про это так: Creating a Draggable Form. И что мы получаем? Да полный отстой. Мышь теряет окошко, потом, при наведении вдруг опять подхватывается, уже без нашего на то соизволения, в общем, ужас. Как это победить? Нужно повесить 3 обработчика мыши на панельку и сделать это вот как:
dragNDropRenderer.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);
dragNDropRenderer.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);
dragNDropRenderer.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
. . .
private function rollOverHandler(event:MouseEvent):void {
mdm.Forms.getFormByName("MainForm").startDrag();
}
private function rollOutHandler(event:MouseEvent):void {
if (!event.buttonDown) {
mdm.Forms.getFormByName("MainForm").stopDrag();
}
}
private function mouseUpHandler(event:MouseEvent):void {
mdm.Forms.getFormByName("MainForm").stopDrag();
}
Конфликт событий мыши распространяется только на нажатие. Отпускание, вполне корректно работает. Кстати, при перетаскивании, обрабатывать нажатие вообще не советую - реакция совершенно непредсказуема. Таким образом, мы отрубаем перетаскивание пир отпускании кнопки, а при отведении мыши от панели проверяем, отпущена ли в данный момент кнопка. Если отпущена - останавливаем перетаскивание. Если нет - ни в коем случае этого не делаем - мышь потеряет окошко в момент таскания.
Другие баги - почему под MacOX криво работает LocalConnection, или не открываются Zinc-ом новые окошки, и не распарсивается полученный с сервера XML, мне еще предстоит выяснить. Чувствую, это будут "приятные" сюрпризы.
* * *
В обработчик отпускания мыши добавлена проверка на отсутствие мыши в области панели.
* * *
Продолаются жалобы. Под MACOX не удалось (под Windows всё Ок) передать на сервер запрос с GET-параметрами (URLRequest). Запрос проходит, параметры не передаются. Не имел возможности выяснить, виновен ли в этом Zinc или админы сервера. В итоге, стали передавать параметры через POST, что сразу дало положительный результат.
* * *
Прозрачность. Плашка прозрачностью 1% ложится поверх поверхности со сложным изображением сложной прозрачности. Окно приложения устанавливается прозрачным. И что вы думаете? Эта плашка видна. Она как бы добавляет прозрачности подлежащему изображению. То же самое можно сказать, если поверх ложится растр с прозрачностью. Прозрачная область растра становится видна.
Выход - не допускать "недопрозрачностей", обтравливать растр во флэше.
* * *
Всё. Финиш. Zinc и MacOX - больше несовместимые понятия. Делаю полноэкранное приложение. В окне приложения, справа, где-то на 1/4 ширины, существует "мертвая" зона, в которой мышь перестает оказывать воздействие на интерактивные flash-элементы. Нет, нельзя сказать что совсем не оказывает. После 5-10 нажатий, кнопка срабатывает. Но это же бред. Элементраный пример - делаем во flash плашку размером с экран (1280x800), вставляем SWF в гроб, билдим и наблюдаем эту границу. Кошмар. Под Windows и под MacOX в Safari работает превосходно.
Сделать многооконное приложение с Zinc также не получилось - опять же проблемы с мышью. Интерактив не откликается.
пятница, февраля 06, 2009
Неэффектные эффекты. Flex
По началу, сделал просто появляющуюся/исчезающую панель, используя ее свойства showEffect/hideEffect. По событию наведения мыши делал visible=true, при отведении - наоборот. Эффекты:
<mx:Fade id="PanelFadeIn" alphaFrom="0" alphaTo="1" duration="400"/>
<mx:Fade id="PanelFadeOut" alphaFrom="1" alphaTo="0" duration="400" startDelay="1000"/>Полная фигня получилась. Эффекты конфликтовали и панель появлялась и исчезала непредсказуемым образом.
Чтобы образумить эффекты, пришлось их останавливать (stop()) перед тем как переключать visible. Так более-менее заработало.
Попробовал другой способ - есть два стэйта, в которых панель находится в разных положениях. При наведении на контейнер мыши, стейт сменяется и панель перемещается в другое место, при отведении - возвращается на прежнее.
Сначала применил свойство moveEffect, в которое указывается имя эффекта <mx:Move id="PanelMotion" /> Получаю опять ерунду. В начале вроде бы всё корректно - уезжает, приезжает, но после нескольких таких движений, что-то там начинает заедать. Метод не годится.
Применяем другую тактику - используем transitions. Сразу всё встает на свои места:
<mx:transitions>
<mx:Transition fromState="Normal" toState="PanelIsShown">
<mx:Move duration="200" target="{сontrolPanel}"/>
</mx:Transition>
<mx:Transition fromState="PanelIsShown" toState="Normal">
<mx:Move duration="200" target="{сontrolPanel}"/>
</mx:Transition>
</mx:transitions>
Можно конечно обойтись одним блоком fromState="*" toState="*", но в некоторых ситуациях, панель "промигивает" в неположенных местах. Но это, конечно, зависит от специфики конкретного приложения.В итоге, появление/убирание панели сделать средствами Flex удалось, но не так, как хотелось бы. Дело в том, что я хотел сделать небольшую паузу перед тем, как панель уберется. Сделал я следующее: второй блок transitions заменил на:
<mx:Sequence target="{сontrolPanel}">
<mx:Pause duration="1000"/>
<mx:Move duration="200"/>
</mx:Sequence>
Это вызвало две идиотские проблемы:
1. Такой способ наотрез отказывается работать, если в state меняется не непосредственно координата, а, к примеру, свойства right/left: <mx:SetStyle target="{сontrolPanel}" name="right" value="50"/> - анимация просто отсутствует.
2. Панель полностью исчезает и снова появляется, если быстро убрать мышь и опять навести ее на контейнер. А по-хорошему, панель должна оставаться на месте.
* * *
В общем, решая совсем простую задачу, я столкнулся с кучей дурацких проблем, которые, возможно, решаемы, но скорее всего через шаманские средства - наследование классов эффектов и модификация методов этих классов под свои нужды.
Или я что-то не допонял, или работа с эффектами оставляет желать лучшего...
Разочарован :(
* * *
Вот пример с аналогичной панелькой:
Sliding Canvas with Flex. Исходный код тут. Работает вполне стабильно. Замечательно. И главное, у меня такие штуки проходили почему то криво... Сам виноват. Поленился сделать такую же проверку transitionHappening. А проверял свойство isPlaying, а оно как-то не правильно показывает если стоит startDelay. Другой подход с принудительной остановкой stop() тоже не проходит - надо было изначально блокировать переключение visible, как в примере. А всё лень виновата - добавлять лишние скрипты не хочется :).
Хотя, с другой стороны, управлять положением компонентов через механизм стэйтов правильнее (универсальнее).
* * *
В итоге, всё получилось с применением showEffect/hideEffect. Получилось вполне стабильно и без неприятных побочных эффектов:
public function hideControlPanel():void {
panelShowEffect.stop();
panelHideEffect.stop();
if (controlPanel.visible)
controlPanel.visible=false;
}
public function showControlPanel():void {
if (!this.enabled) return;
panelShowEffect.stop();
panelHideEffect.stop();
if (!controlPanel.visible)
controlPanel.visible=true;
}
. . .
<mx:canvas width="{controlPanel.width}" height="100%" clipcontent="true" rollover="showControlPanel()" rollout="hideControlPanel()" creationcomplete="hideControlPanel()" backgroundcolor="#FFFFFF" backgroundalpha="0">
. . .
<mx:Move id="panelShowEffect" xTo="0" duration="200"/>
<mx:Move id="panelHideEffect" startDelay="1000" duration="200" xTo="{-controlPanel.width}"/>
. . .
<mx:VBox
id="controlPanel"
height="100%"
showEffect="{panelShowEffect}"
hideEffect="{panelHideEffect}"
x="{-controlPanel.width}"
visible="false"
>
. . . Содержимое панели . . .
</mx:VBox>
. . .
</mx:Canvas>
Единственная проблема -пришлось отказаться от эффекта WipeUp/Down, примененного к компоненту, вложенному в выезжающую панель, из-за его нестабильной работы.
вторник, января 27, 2009
Неубиваемый звук в режиме Start. AS3
Приложение загружает один и тот же SWF в разные контейнеры, каждый из которых проигрывает загруженный клип и имеет автономное управление звуком. В таймлайне SWF стартуется звук в режиме Start.
Контейнеры добавляются (mx:AddChild) в разных стэйтах (mx:State). Соответственно, при переключении стэйтов, я отслеживаю события addedToStage/removedFromStage для остановки/запуска клипа и включения/выключения звука (компоненты при смене стэйтов удаляются из списка отображаемых объектов, а не из памяти). Если не останавливать клипы, они всё равно воспроизводятся, даже если их нет в списке отображаемых объектов, а так же и их звук, что, понятное дело, совсем не хорошо.
Так вот. При старте звука в режиме Start в одном контейнере, в другом этот звук уже не начнет воспроизводиться заново, а будет продолжать играться. Регулировка громкости так же будет влиять только на него. В остальных режимах, дело ясное, всё работает независимо.
Остановка таймлайн-звука для конкретного клипа в AS3 не предусмотрена.
Есть возможность отключить все звуки приложения при помощи SoundMixer.stopAll();. Как вариант, такой подход в принципе, приемлем, но остановить все звуки приложения - это значит исключить ситуацию, когда, к примеру, требуется остановить звук лишь одного компонента.
вторник, декабря 23, 2008
Сокеты, политика безопасности и SmartFox
А собственно, когда настало время выложить многопользовательскую игру под SmartFox, я столкнулся со следующей проблемой: игра лежит на некотором доменном имени (somegame.ru). Сокетное соединение к SmartFoxServer (XX.XX.XX.XX:9339) просто не проходит:
"Ошибка: Запрос ресурса на xmlsocket://XX.XX.XX.XX:9339 источника запроса из h_ttp://somegame.ru.../Name.swf отклонен из-за отсутствия разрешений в файле политики."
"*** Нарушение безопасности изолированной среды *** Подключение к XX.XX.XX.XX:9339 прервано – нет разрешения от h_ttp://somegame.ru.../Name.swf".
Причем, при локальном запуске всё работает превосходно.
Долго я рыл статьи, форумы по кроссдоменным проблемам, особенности политики безопасности сокетных соединений, нашел много полезного:
External data not accessible outside a Flash movie's domain - общепознавательная статейка.
Про crossdomain.xml и как продолжение -
Security policy. Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation. Поисследовал данные вопросы, ознакомился со статьей -
Setting up a socket policy file server.
Затем не обнаружив ничего подходящего, поискал аналогичные вопросы на ресурсе SmartFox:
bluebox problem, donot connect - имеют косвенное отношение к проблеме, но могут пригодиться.
Troubleshooting common runtime problems дает общее представление о проблемах связи и наводит на главную статью по теме:
Flash Security Policy guidelines.
После поверхностного ознакомления со статьей, у меня сразу закралось подозрение - я проверил файл конфигурации config.xml и в секции
PolicyAllowedDomains конечно же не обнаружил записи AllowedDomain, соответствующей нужного мне домена. Админы, включили какие угодно домены, но только не тот который мне был нужен.
Прописываем нужный домен, рестартуем сервер и мгновенно получаем соединение.
Проблема, к счастью, является простейшей. Получаем урок: прежде чем отчаиваться и глубоко вкапываться в интернет и документацию, хорошо для начала просто еще раз проверить конфигурацию сервера.
вторник, декабря 16, 2008
Проблема отображения кириллицы в поле ввода при wmode="transparent"
Пошуршав в Гугле, я выяснил:
Баг очень старый, решения его нет.
Или решения его достаточно сомнительны:
Ре-маппинг и хаки
Коррекция полученного от клавиатуры символа
вторник, ноября 04, 2008
Embed MovieClip не всегда дает MovieClip. AS3
Создаю клип в один фрейм. Объявляю его в Linkage как Base class = "flash.display.MovieClip".
Внедряю в код:
[Embed(source="Assets/screens.swf", symbol="SIntroScreen")]
public static var INTRO_CLASS:Class;Пытаюсь работать с ним как с MovieClip:
var test:MovieClip = new Embeds.INTRO_CLASS();Получаю исключение: "Type Coercion failed ..." Позвольте, позвольте!
Смотрим, что говорит нам describeType:
var test:DisplayObject = new Embeds.INTRO_CLASS();
trace(describeType(test));А говорит он вот что (опускаю излишние подробности и заменяю треугольные скобки на квадратные):
[type name="classes::Embeds_INTRO_CLASS" base="mx.core::SpriteAsset" isDynamic="false" isFinal="false" isStatic="false"]
[extendsClass type="mx.core::SpriteAsset"/]
[extendsClass type="mx.core::FlexSprite"/]
[extendsClass type="flash.display::Sprite"/]
[extendsClass type="flash.display::DisplayObjectContainer"/]
[extendsClass type="flash.display::InteractiveObject"/]
[extendsClass type="flash.display::DisplayObject"/]
[extendsClass type="flash.events::EventDispatcher"/]
[extendsClass type="Object"/]
... Так значит, при компиляции, однофреймовые MovieClip-ы без моего согласия (а может быть, согласно какому-то параметру по умолчанию), урезаются до Sprite-ов.
И верно, добавив еще один фрейм и скомпилировав, получаем:
[type name="classes::Embeds_INTRO_CLASS" base="mx.core::MovieClipAsset" isDynamic="false" isFinal="false" isStatic="false"]
[extendsClass type="mx.core::MovieClipAsset"/]
[extendsClass type="mx.core::FlexMovieClip"/]
[extendsClass type="flash.display::MovieClip"/]
[extendsClass type="flash.display::Sprite"/]
[extendsClass type="flash.display::DisplayObjectContainer"/]
[extendsClass type="flash.display::InteractiveObject"/]
[extendsClass type="flash.display::DisplayObject"/]
[extendsClass type="flash.events::EventDispatcher"/]
[extendsClass type="Object"/]
... Вот такие чудеса творит оптимизация. В принципе, разумно конечно. Но только если знать про наличие такой фичи. В ином случае (как раз моем), добавочное время на разбор подводных камней обеспечено.
среда, августа 13, 2008
Ограничение в Input-TextField. AS3
Однако, это не всегда работает верно. Точнее, работает хорошо, но не предназначено для ограничения ввода символов. Вот пример, с которым я столкнулся. Я делаю Flex-компонент во Flash IDE и вставляю его в Flex-проект. Компонент содержит строку ввода с описанным выше ограничением шрифта (без некоторого диапазона символов). В свою очередь, Flex-проект уже содержит внедрение того же шрифта для своих нужд. Но только уже без ограничений (с наличием этого диапазона символов). В итоге, при конечной сборке проекта, строка ввода компонента беспрепятственно позволяет вводить все символы, не смотря на описанные выше ограничения. По всей видимости, шрифт, внедренный в компонент объединяется при компиляции с тем, что внедрен в Flex-проекте.
Для того, чтобы правильно ограничить ввод, в TextField предусмотрено свойство restrict.
Это строка, в которой можно указать как простую последовательность символов ("!#$%()*"), так и диапазоны символов ("0-9 A-Z a-z"). Символы, которые указаны в строке restrict можно будет вводить в поле ввода TextField. Ввод других символов будет запрещен. Для исключения символов из диапазона имеется спец-символ "^", после которого указывается исключаемый символ или диапазон символов. В хелпе про это всё хорошо написано.
Здесь есть один подводный камень. Если вы указываете в restrict диапазон в кириллице - обязательно обратите внимание на кодировку AS-файла, который содержит этот код. Если он не в кодировке UTF-8, то русские буквы в TextField вводиться не будут. Из-за такой мелочи можно убить много времени впустую.
вторник, июля 01, 2008
Апостроф и FlashDevelop|Flex SDK. AS3
Проект FlashDevelop находится в папке, содержащей апостроф - символ " ' ": Children'sPortal.
В код включаю внешний SWF - пишется строчка:
[Embed(source="Assets/preloader.swf")].Компилирую. Вылезает список ошибок:
Classes\myApplication___preloader_class.as(25): col: 43 Error: Syntax error: expecting rightparen before sPortal.
[Embed(_resolvedSource='.../Children'sPortal/.../Assets/preloader.swf', mimeType='application/octet-stream')]
. . .
Убираю апостроф - всё компилится.
Итог - апострофы в именах файлов и папок - враги девелопера.
Не проверял этот баг на других программах, но могу предположить, что всплыть он запросто может где угодно.
среда, июня 18, 2008
Zinc 2.5 и Flex 3.0: Проблема со звуком
Было необходимо вставить звуковое сопровождение. Нет проблем - создаем объект Sound, загружаем MP3-файл. Отлаживаем кнопку вкл/выкл звука. Всё работает как часы.
Загоняем всё это инковый гроб. Звука нет. Проверяем событие загрузки, трейсим загруженный объем звукового файла - всё отлично грузится и под zinc-ом. Но звука нет.
Тут уже начинает трясти, т.к. конец дня и домой хочется, а проект с утра сдавать.
И вот, пробую другой MP3-файл. Работает! А разница - первый был 5 Мб, второй - 680 Кб.
Итак, делаем вывод (предположительный) - Zinc (или система) ограничивает размер памяти выделяемой для нужд приложения. Причем как-то брутально - без предупреждений и исключений.
четверг, мая 15, 2008
Откуда начинается XML. AS3
Есть XML:
<?xml version="1.0" encoding="utf-8" ?>
<data>
<item>Раз</item>
<item>Два</item>
</data>
После его загрузки, он отправляется в переменную:
. . .
private function onComplete(event:Event):void {
this.__xml=new XML(event.target.data).normalize();
}
Далее, мы хотим получить первый элемент списка и по логике (старой доброй логике AS2) пишем:
trace(this.__xml.data.item[0]);Но получаем эксцепшном по лбу: "Error #1010: A term is undefined and has no properties.".
Потому что надо так:
this.__xml.item[0]Контейнерный тег data (вместо data может быть любое другое слово) и будет являться нашим
this.__xml.
понедельник, мая 12, 2008
Баг при выходе пользователя из комнаты. AS3. SmartFoxServer
it.gotoandplay.smartfoxserver.handlers.SysHandler, версия модуля 1.2.0, в строке 348:Генерируется клиентом при выходе из комнаты какого-либо другого пользователя, при условии, что до этого был вызван метод
this.__sfs.getRoomList(); и обработано событие onRoomListUpdate.Коррекция ошибки заключается в проверке на null метода theRoom.getUser(...):
if (theRoom.getUser(userId)!=null)
uName = theRoom.getUser(userId).getName()
Ненавижу корректировать чужой код, но тут другого выхода не вижу.
среда, мая 07, 2008
Принцип перебора for .. in . AS3
Есть ассоциативный массив:
static private const distribution:Object = {item1:2,item2:2,item3:2};Осуществляю перебор элементов:
. . .
this.__distribution=distribution;
. . .
for (var name:String in this.__distribution) {
count=int(this.__distribution[name]);
. . .
}
Ожидаем, что элементы массива будут перебираться по каком-нибудь вменяемому принципу - например, в AS2 перебор осуществлялся от последнего к первому.
Однако, порядок перебора свойств оказывается совершенно не очевидным.
Иногда перебор начинается с item2, иногда с item3. Особенно это очевидно при запуске приложения на разных компьютерах.
Ничего удивительного, в хелпе об этом так и сказано:
Iterates over the dynamic properties of an object or elements in an array and executes statement for each property or element. Object properties are not kept in any particular order, so properties may appear in a seemingly random order.
Именование безымянных клипов. AS3
Он подгружается во Flex-приложение.
Flex-приложение перебирает содержимое SWF:
. . .
}
Клипам, которым небыли назначены имена, Flash присвоил имена по умолчанию типа instanceXXX. И что самое интересное, этот XXX не поддается никакому очевидному принципу. Либо на разных компьютерах, либо в разных версиях запуска приложения, одним и тем же клипам назначаются разные числа.
Поэтому, нельзя надеяться на имена "по умолчанию". Если раньше, в AS2 можно было быть уверенным, что где-то на сцене присутствует instance0, то теперь об этом лучше даже не думать. Конечно, потребность в таких именах невелика, но порой может сбить с толку, например при отладке.
четверг, мая 01, 2008
FLVPlayback и ошибка 1000. AS2
Есть FLVPlayback с именем video (со свойствами по умолчанию).
По клику на кнопку b1 указывается:
video.contentPath="URL существующего файла";По клику на кнопку b2 указывается:
video.contentPath="URL несуществующего файла";По клику на b1 видео воспроизводится. По клику на b2, видео, если оно воспроизводилось, останавливается, если нет - ничего не происходит. Теперь, при повторном нажатии на b1, мы ожидаем снова увидеть наше видео, но.... получаем ошибку:
1000: Unable to make connection to server or to find FLV on server
Что бы я не делал - вызывал разные методы типа stop/play, менял свойства компонента - всё безрезультатно.
После того, как state уходит в состояние CONNECTION_ERROR компонент работать отказывается.
Пока вижу одно решение - перед запуском видео, проверять наличие файла.
четверг, апреля 17, 2008
Изображения в текстовом поле. AS2
Поддерживаются следующие параметры тега:
src - URL изображения (JPEG, GIF, PNG, или SWF). Изображения не отображаются до тех пор, пока полностью не загрузятся.
id - имя клипа, который будет создан FP и в который загрузится изображение. Подробнее здесь.
width - ширина изображения в пикселах.
height - высота изображения в пикселах.
align - горизонтальное выравнивание изображения. возможны значения "left" и "right". По умолчанию - "left".
hspace - отступы от краев изображения по горизонтали. По умолчанию "8".
vspace - отступы от краев изображения по вертикали. По умолчанию "8".
Заметки:
- Текст обтекает изображение по принципу, общепринятому в HTML-разметке.
- Пока вертикальные размер и отступы изображения умещаются в расстояние от верха строчки до ее низа, нижняя строчка не смещается. (Например, при размере шрифта 11px и Line spacing 2pt, максимальный размер изображения по вертикали - 15)
- Если перед тегом IMG есть текст (даже просто пробел), изображение вставляется в строку, расположенную ниже той, куда был вставлен тег.
- Мы никогда не сможем поместить изображение в центр текстового блока.
- Если указать только width или только height, с изображением ничего не произойдет.
- Если встатвить подряд несколько абсолютно схожих тегов IMG, изображения выведутся в одну точку. Однако, стоит изменить один из параметров, как все последующие изображения выводятся ниже строкой.
- Если задать подряд два тега IMG у которых параметры align установлены соответственно в "left" и "right", второе изображение всё равно будет строчкой ниже. А если второй тег поставить в конец строки - его изображение спустится уже на две строчки.
- Еще одна ужасная особенность. Если свойство wordWrap = false, и тег IMG стоит первым, изображение просто не выводится.
Можно и дальше продолжить пытки TextField, и выявить новые фичи (читай баги). Но уже и так понятно, что нормальная вставка изображений в текст TextField (без хорошего бубна) невозможна.
понедельник, марта 31, 2008
Наследование от Button. AS2
На сцене несколько кнопок, которые трансформируются простым таймлайновым моушн-твином. Задача - быстренько навесить на них функционал, и желательно не трогать тайм-лайн (просто много ключевых фреймов, которые не хочется тупо лопатить).
Первая мысль - сделать наследников класса Button, назначить их в Linkage для этих символов и радоваться жизни.
Не получилось. Даже трейс из конструктора не отрабатывает.
Возможно, есть способы это сделать оперируя прототипом или используя хаки. На поиски и шаманство, увы, времени небыло. Пришлось лопатить.
Итак, в AS2 строить логику с учетом модификации Button посредством наследования, лучше даже не пытаться - неблагодарное занятие.