Миграция на Flex mxmlc из ActionScript 2 mtasc - PullRequest
1 голос
/ 18 января 2012

Несколько лет назад я создал крошечный, простой SWF-файл для воспроизведения MP3-файлов в различных браузерах.Я выставил интерфейсы и вызвал их из JavaScript.Все было маленьким и простым;Вы можете увидеть весь исходный код Guise.as.

Я скомпилировал основной класс, используя mtasc, что позволяет вам указать основную функцию для кода инициализации:

/**Main entry point.*/
static function main(mc)
{

Это работало очень хорошо, пока я не хотел добавить поддержку WAV.Flash изначально не поддерживает WAV, поэтому я попытался добавить библиотеку .Но библиотека требовала Flash 10 и не компилировалась на mtasc, поэтому я скачал Flex 4.6 и попытался использовать mxmlc.Мальчик, моя боль только началась.

Мой скомпилированный SWF больше не работает - даже для файлов MP3.Я не знаю, с чего начать, чтобы найти проблему, но я знаю, что у меня есть много вопросов без ответов - возможно, один из них - моя проблема:

  • Если я правильно понимаю, mxmlc неУ него нет понятия «основная точка входа», но Flash просто создаст экземпляр «основного класса», что бы это ни было.Но как мне указать основной класс?Если я ссылаюсь на мой класс с помощью mxmlc в командной строке, будет ли этот класс автоматически становиться основным, или это абсолютно необходимо, чтобы мой класс был в корневом (то есть, нет) пакете?Должно ли оно иметь специальное имя?
  • После того, как я успешно назначу основной класс, могу ли я просто переместить код моей точки входа в конструктор моего основного класса?
  • В моем исходном классе,Я добавил глобальную функцию для преобразования объекта в массив, используя Array.from=function(object:Object).Это дало мне ошибку, когда я был в строгом режиме - очевидно, потому что мне не нравится добавлять статические методы к объекту класса Array.Будет ли это работать в нестрогом режиме?В чем проблема?Если я преобразую его в обычный метод в своем классе, он будет работать?
  • Поскольку я привык делать в «реальном» JavaScript, я добавил функцию Function.prototype.bind=function(), чтобы при наличии обратных вызововthis будет установлено правильно.Это все еще будет работать?Могу ли я добавить методы к прототипу Function?
  • Нужно ли мне даже связывать контекст?Если я вызову что-то вроде positionTimeoutID=setTimeout(fireSoundPosition.bind(this), 1000), без bind(this), Flash передаст правильный this моему методу обратного вызова?
  • Компилятор Flex пожаловался, что изменилось несколько методов API, поэтому, возможно, изменились мои вызовычто-то и я не понимаю новый API.Есть ли способ отладки этого SWF?Написать в консоль браузера?Звуковой сигнал?Что-нибудь?Без покупки какой-нибудь большой IDE от Adobe или чего-то еще?

Любая обратная связь будет оценена.Я уверен, что есть только одна или две небольшие корректировки, которые отбрасывают все это, но, возможно, с небольшой помощью сообщества мне не придется тратить несколько дней, читая целые книги и покупая новые SDK, просто чтобы перекомпилировать мой SWF спару новых звонков ... Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Не думаю, что смогу ответить на все ваши вопросы, но постараюсь дать несколько ответов:

ActionScript 3 является существенным изменением по сравнению с ActionScript 2. Это полная перестройка архитектуры, а не просто незначительное обновление и несовместимость с предыдущими версиями, поэтому, если не считать переписывания, обычно довольно сложно настроить нетривиальную as2 для компиляции как as3. Это очень похоже на совершенно новый язык. Поэтому может быть лучше сделать шаг назад и посмотреть, что изменилось в языке, потому что это очень много.

Самая большая вещь - это формализованное наследование классов , а не прототипное наследование.

  • "Flash просто создаст экземпляр« основного класса »», что бы это ни было. "

Итак, когда вы компилируете из командной строки, вы даете ему путь к «основному классу»:

mxmlc.exe "c:\dev\project\SomeClass.as"

с SomeClass.as выглядит так:

package {
    import flash.display.Sprite;
    public class SomeClass extends Sprite {}
}

После инициализации flash создаст экземпляр этого класса и прикрепит его к сцене. Это будет похоже на концепцию AS2 _root. Переключатель -src, переданный в mxmlc.exe, устанавливает путь к остальным классам / пакетам, которые поддерживают этот основной класс.

Таким образом, ваш основной класс, как бы вы его ни называли, должен наследовать от Sprite.

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

Да. Конструктор для вашего «основного класса» будет точкой входа для вашего SWF.

  • "Поскольку я привык делать в« реальном »JavaScript, я добавил функцию Function.prototype.bind = function (), чтобы при наличии обратных вызовов это было установлено правильно. работать? Могу ли я добавить методы к прототипу функции? "

Методы класса ActionScript 3 автоматически связанные методы , что является небольшим изменением по сравнению с javascript. Фактически, невозможно вызвать метод класса в любом другом контексте, кроме того экземпляра, из которого он был создан (даже если вы используете .call() или .apply(), чтобы попытаться вызвать изменение контекста). Например, с этим простым классом

public class SomeClass {
    public function Worker() {
        alert(this);
    }
}

, а затем

var cls:SomeClass = new SomeClass();

cls.Worker();
var func:Function = cls.Worker;
func();
func.call(this);
func.apply(undefined);

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

Обратите внимание, это относится только к классам методов и не применяется к анонимным функциям / замыканиям. Итак ...

var func:Function = function():void { alert(this); }
func();
func.call(cls);
func.call(undefined);

... все разные

  • "Нужно ли мне даже связывать контекст? Если я вызову что-то вроде positionTimeoutID = setTimeout (fireSoundPosition.bind (this), 1000), без bind (this), Flash передаст правильное this моему метод обратного вызова? "

Зависит от того, если метод класса , тогда он всегда будет связан (см. Последний раздел). Если закрытие / анонимная функция, то да, ее все равно нужно будет связать, указав this.

  • Компилятор Flex пожаловался, что изменилось несколько методов API, поэтому, возможно, изменение моих вызовов изменило что-то, и я не понимаю новый API. Есть ли способ отладки этого SWF? Написать в консоль браузера? Звуковой сигнал? Что-нибудь? Без покупки какой-нибудь большой IDE от Adobe или чего-то еще?

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

  • В моем исходном классе я добавил глобальную функцию для преобразования объекта в массив, используя Array.from = function (object: Object).Это дало мне ошибку, когда я был в строгом режиме - очевидно, потому что мне не нравится добавлять статические методы в объект класса Array.Будет ли это работать в нестрогом режиме?В чем проблема?Если я преобразую его в обычный метод в моем классе, сработает ли он?Правильное решение AS3 будет состоять в том, чтобы создать статический метод из другого класса для выполнения этого действия, а не пытаться напрямую расширять Array.Что-то вроде: package { public class ArrayHelpers { public static From(object:Object):Array { /* do work */ } } } А затем назовите это как: ArrayHelpers.From(whatever);
1 голос
/ 19 января 2012

Спасибо 32bitkid за исчерпывающий ответ.Я наконец получил это работает.Просто чтобы заполнить ответы на оставшиеся вопросы, вот некоторые из моих опытов в этот долгий день экспериментов.

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

Ничего из связующего не требуется, как указано 32bitkit.Но будьте осторожны - большая часть API изменилась со времен Flash 9. Например, ExternalInterface.call() теперь принимает только два аргумента, потому что вам больше не нужно передавать контекст (например, this).И Sound API полностью изменился.

Попытка определить Array.from(), вероятно, не будет работать.(Мне не понадобилось это после того, как я выбросил Function.prototype.bind(), который мне больше не нужен.) Попытка дополнить существующие классы, такие как добавление String.prototype.endsWith(), похоже, тоже не работает.

Нопожалуй, самое важное, что я нашел в отладочной SWF, которая, наконец, позволила мне выяснить проблемы, очень важно: иди скачай отладочный Flash-проигрыватель ActiveX и установи его для IE.(Я только рекомендую версию IE, потому что весь смысл этого упражнения в том, что я пытаюсь заставить файлы WAV воспроизводиться на IE - главном браузере only , который не поддерживает файлы WAVВорчать ворчать. Серьезно, отладчик Flash Player бесценен.Автономный проигрыватель отладки не поддерживает ExternalInterface.

О, а простой способ помочь с отладкой?Просто перезвоните в логи браузера, как это:

ExternalInterface.call("console.info", "Hello, world!");

Это работает как шарм!Да, и еще одна вещь: включите это немедленно в начале вашего кода, и когда вы вызываете свой SWF из JavaScript, исключения возвращаются и отображаются в отладчике вашего браузера (и наоборот)!

ExternalInterface.marshallExceptions = true;

Я целый день был вынужден перейти на ActionScript3, Flash 10, Flex и т. Д., Когда думал, что мне нужно изменить всего пару строк кода.Теперь, когда у меня, по крайней мере, есть что-то связанное, во многом благодаря обратной связи здесь, завтра я вернусь и попытаюсь выяснить, почему я не могу заставить файлы WAV воспроизводить --- которыйвесь смысл этого упражнения в начале.

...