AS3: переменная [x] не определена, ошибка при использовании getDefinitionByName()

Я пытаюсь использовать библиотеку .SWC (экспортированную из документа .FLA) для хранения графических данных для игры. В одном из своих классов я пытаюсь прикрепить экземпляр MovieClip запрошенного уровня, но я пытаюсь использовать getDefinitionByName(), чтобы я мог выбрать правильный класс на основе номера уровня. Я работаю в Flash Builder 4.7, и рассматриваемый SWC извлекается как библиотека пути сборки, для которой установлено значение «Объединено в код», теоретически и до сих пор на практике, что делает его классы доступными из любого места.

Однако getDefinitionByName() не работает, даже когда я могу подтвердить, что класс, который он оценивает, существует и находится в свободном доступе.

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

1:

public function MyClass() {
    var lev:MovieClip = new Level1();
}

2:

public function MyClass(id:uint) { // For this example, id == 1
    var lClass:Class = getDefinitionByName("Level"+id) as Class;
    var lev:MovieClip = new lClass();
}

Теоретически #1 и #2 должны давать одинаковый результат, а именно, "lev" - это новый экземпляр класса Level1(), верно? Но №1 работает, а №2 выдает ReferenceError: Error #1065: Variable Level1 is not defined.

Что еще более необъяснимо, я также получил почти то же самое для работы в методе того же самого класса, с той лишь разницей, что указанный метод вызывает статический метод другого класса, который, в свою очередь, вызывает getDefinitionByName(). Имеет ли значение статический метод, и если да, то почему?


person Eric N    schedule 30.01.2013    source источник
comment
Подождите, вы прочитали мои мысли? Я делаю то же самое и имею такое же имя класса.   -  person Cilan    schedule 01.08.2014


Ответы (1)


Я никогда не использовал getDefinitionByName(), но беглый взгляд на LiveDocs показывает, что вам нужно указать полный путь к пакету.

var lClass:Class = getDefinitionByName("Level"+id) as Class;

должно быть

var lClass:Class = getDefinitionByName("com.your.package.here.Level"+id) as Class;

См. getDefinitionByName().

person Josh    schedule 30.01.2013
comment
Оказалось проблема в нем. Недавно я определил пакеты для своих символов, поскольку Flash Pro не возится с пакетами, если вы просто экспортируете символ для ActionScript. Я попытался просто импортировать эти пакеты (например, import com.my.package.levels.*;), но оказалось, что этого недостаточно; путь к пакету должен быть встроен в аргумент getDefinitionByName(). - person Eric N; 30.01.2013
comment
Это относится почти ко всем случаям, когда вам нужно предоставить имя класса в виде строки, особенно на стороне Flex. Если вы не передаете сам класс, просто пройдите весь путь. Flash запутается, если вы этого не сделаете, потому что в разных пакетах может быть несколько классов с одинаковыми именами. - person Josh; 30.01.2013
comment
Что делать, если имя пакета «пакет по умолчанию»? - person ness-EE; 25.03.2014
comment
@FusePumpDev У вас никогда не должно быть классов в пакете по умолчанию. Единственный класс, который, по крайней мере, на мой взгляд, может находиться в этом пакете, — это класс приложения, который сам по себе никогда не должен быть чем-то большим, чем стартовой площадкой. Похоже, вам нужно реорганизовать свой проект для меня. - person Josh; 25.03.2014
comment
@JoshJanusch - при импорте SWC с активами из Flash Pro они находятся в пакете по умолчанию. Я не вижу, как это изменить. - person ness-EE; 25.03.2014
comment
... не стандартный пакет проекта; в каталоге библиотек, на которые ссылаются, например Referenced Libraries/assets.swc/default package/Button.abc - person ness-EE; 25.03.2014
comment
См. раздел stackoverflow.com/questions/22647257/ - person ness-EE; 26.03.2014