#actionscript-3 #class
#actionscript-3 #класс
Вопрос:
Как я могу преобразовать строку в класс без getDefinitionByName, потому что этот класс не связан с элементом библиотеки, а getDefinitionByName работает только с классами, которые связаны с библиотекой или уже инициализированы! Есть ли способ? Или я должен инициализировать каждый класс, который я хочу использовать?! Это было бы ооочень глупо со стороны Adobe!
Комментарии:
1. 1, это интересно, я тоже не знаю о другом названии!
2. я не уверен, что вы имеете в виду классы, которые «уже инициализированы» и не хотят инициализировать каждый класс, который вы хотите использовать. как бы вы их использовали, если не путем их инициализации?
Ответ №1:
getDefinitionByName()
будет работать с любым именем класса, связанным с библиотекой или нет. Ваша проблема, вероятно, в том, что, поскольку вы не упоминаете имя класса в коде, его вообще нет в вашем swf. Вам нужно будет убедиться, что класс используется хотя бы в одном месте вашего кода, в противном случае он не будет скомпилирован.
Это может быть так же просто, как просто поместить их в строку вашего основного класса:
public class Main {
public function Main(){
ClassYouWant;
AnotherClass;
codeThatDoesStuff();
}
}
Комментарии:
1. Неважно, то, что я хочу, не может быть сделано! На любом языке, кроме does, у которого есть eval. Идея заключалась в том, что я мог бы создать множество классов и мне не нужно было бы их где-либо инициировать!
2. Я не понимаю, о чем вы спрашиваете, когда говорите «не нужно нигде их инициировать». Можете ли вы привести какой-нибудь пример?
3. У меня есть игра. Я хочу, чтобы каждый уровень был классом, который расширяет класс LevelTpl, например «класс Level1 расширяет LevelTpl». Затем я хочу вызвать любой уровень, например «Level» curLevel. Проблема в том, что в AS3 нет eval, поэтому мне пришлось бы использовать getDefinitionByName, но getDefinitionByName работает только со всеми уже инициализированными классами! Итак, если я создам 100 уровней => 100 классов, я должен инициировать их все, прежде чем использовать! Я надеялся, что мне не придется этого делать!
4. Вам потребуется около двух минут, чтобы написать короткий цикл, который отслеживает имена ваших уровней, если вы назовете их подобным образом. Скопируйте вывод трассировки в класс, который используется в вашей игре, и все готово. Eval вам здесь не поможет, поскольку проблема не в том, что я не нахожу класс, а в том, что на них нет ссылок и, следовательно, они вообще не включены.
Ответ №2:
Краткий ответ:
Если вы хотите избежать включения ссылок на классы (как предложено @grapefrukt), вам придется скомпилировать эти классы в библиотеке и ссылаться на них из вашего основного приложения как на RSL (Runtime Shared Library)
Длинный ответ:
Нет другого способа создать класс по его имени, кроме как использовать getDefinitionByName().
Однако есть несколько способов скомпилировать ваш код. По умолчанию, если у вас есть единственное приложение, которое не включает библиотеки, оно не будет компилировать классы, на которые нет ссылок в вашем коде. Вы называете это глупым, но для этого есть довольно веская причина: это уменьшает размер вашего swf-файла и, следовательно, время загрузки вашего приложения.
Если вы используете библиотеки, есть три способа, которыми на них можно ссылаться из вашего основного приложения:
- объединено в код
- разделяемая библиотека среды выполнения (RSL)
- внешний
Первый вариант будет использовать все (и только) классы из библиотеки, на которые были ссылки в основном приложении. Это приводит к уменьшению размера swf.
Второй вариант скомпилирует всю библиотеку в отдельный swf-файл, который загружается основным приложением. Это приводит к большему размеру файла, но один и тот же swf-файл может использоваться несколькими приложениями. И что для вас наиболее важно: все классы находятся в этом swf-файле, поэтому на них можно ссылаться с помощью getDefinitionByName() без необходимости включать класс в ваше основное приложение.
Комментарии:
1. @Alex Вы также можете ссылаться на RSL во flash CS5 (через «расширенные свойства ActionScript»), но я полагаю, что для компиляции вашей библиотеки вам понадобится FlashBuilder или сделайте это в командной строке с помощью компилятора mxmlc. mxmlc также может компилировать библиотеки только для ActionScript; это не ограничивается Flex. Итак, то, что вы хотите сделать, может быть сделано, но это может быть нелегко для вас.
2. @Alex Посмотри, что я только что нашел: active.tutsplus.com/tutorials/workflow /…