Строка AS3 для класса

#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 /…