пятница, сентября 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.