Не думаю, что смогу ответить на все ваши вопросы, но постараюсь дать несколько ответов:
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);