Принудительная компоновка всех классов в SWC - PullRequest
6 голосов
/ 08 июня 2010

Используя Flash CS4, я создаю игру с дюжиной или около того звуков и парой музыкальных треков. Чтобы сократить время публикации / компиляции, я переместил звуки и музыку в (внешний) SWC, который находится в «пути к библиотеке» для проекта. Это работает, но с оговоркой ...

До тех пор, пока я не экстернализовал ресурсы, я динамически создавал экземпляры Sound объектов встроенного звука, получая их классы с getDefinitionByName.

// something like...
var soundSubClass:Class = Class(getDefinitionByName(soundClassName));
var mySound:Sound = new soundSubClass();

Но теперь, когда они расположены во внешнем SWC, мне нужно иметь «конкретные» ссылки на классы, чтобы загрузить их таким образом, иначе они не будут включены в опубликованный SWF, и возникнет ошибка времени выполнения. когда getDefinitionByName пытается получить класс, который не существует.

Итак, мой вопрос : есть ли во Flash Professional CS4 какой-либо способ принудительно включить активы библиотеки независимо от того, статически ли они связаны?

FlashDevelop имеет опцию компилятора «SWC Include Libraries», которая является именно тем, что я хочу, и отличается от опции «SWC Libraries». Описание параметра «Включить библиотеки SWC» - «Связывает все классы в файле SWC с результирующим файлом SWF приложения, независимо от того, используются они или нет».

(Кроме того, для меня важно, чтобы все ресурсы содержались в одном скомпилированном SWF-файле. Связывание во время выполнения - это не то, что мне нужно.)

Ответы [ 5 ]

4 голосов
/ 09 июня 2010

К сожалению, я так не думаю. Я надеюсь, что это исправлено в CS5, но я бы не стал на это ставить ...

Текущий (отягчающий) стандарт должен иметь класс манифеста в вашем SWC, который ссылается на все корневые классы в остальной части библиотеки:

public class MyLibManifest {
    public static function manifest():void {
         var class1:Class = Class1;
         var class2:Class = Class2;
         // etc...
    }
}

Тогда, где-то в вашем главном .fla ...

import com.mylibrary.MyLibManifest;

...

var myLibrary:Class = MyLibManifest;
3 голосов
/ 15 февраля 2012

В Flash CS4 / CS5 по умолчанию нет возможности извлекать и встраивать каждый класс в SWC, но вы можете сделать это с помощью:

FlashDevelop

Как вы уже знаете, свойства проекта этой программы имеют опции компилятора, которые различаются между:

  • Библиотеки SWC:"Связывает файлы SWC с SWF-файлом результирующего приложения. В этих классах компилятор связывает только те файлы SWC, которые требуются."
  • Библиотеки включения SWC:"Связывает ВСЕ классы в файле SWC с результирующим файлом SWF приложения, независимо от того, используются они или нет."

Второй вариант «Включить библиотеки SWC» может быть полезен, потому что, если вы просто скомпилируете свой FLA как есть в SWC, а затем поместите этот SWC и другой SWC в FlashDevelop как SWC Include Libraries, он должен скомпилировать / объединить их в один SWF, который будет работать так, как вы хотите.

FlashDevelop также может просто помочь вам создать жестко запрограммированный список классов в SWC, потому что, если вы свяжетесь с SWC как библиотекой SWC, он появится в проводнике проекта, и вы увидите список всех занятия в SWC. Вы также можете щелкнуть правой кнопкой мыши по каждому классу и выбрать «Вставить в документ», и он вставит полное имя класса. Если вы это сделаете, а затем нажмите точку с запятой, у вас будет ссылка на первый класс. Наведите указатель мыши на список классов в настройках проекта и повторите это для каждого класса в списке. Это займет всего несколько минут, чтобы сделать это для сотен классов, что облегчает создание такого списка. Было бы еще быстрее, если бы эта штука позволила вам вставить более одного одновременно, но, похоже, это не так.

Единственный другой вариант, который, как вы сказали, вас не интересует безо всякой причины, - это Runtime Shared Libraries (RSL). На самом деле не так уж сложно загружать файл отдельно, но только если вы правильно обрабатываете процесс загрузки и любые ошибки, которые могут возникнуть. Это добавит сложности вашему проекту и может потребовать дополнительных размышлений, но я бы серьезно отнесся к этому как к варианту. Дополнительную информацию см. В разделе «Наследование домена приложения» по адресу www.senocular.com / flash / tutorials / contentdomains /? Page = 2 .

1 голос
/ 21 июня 2014

Я, вероятно, что-то упускаю, но разве это не случай использования -include-library, а не опции library-path компилятора, это то, что adoc говорит о опции

Связывает все классы в SWC-файле с результирующим SWF-файлом приложения, независимо от того, используются они или нет.

Сравните эту опцию с опцией library-path, которая включает только те классы, на которые есть ссылки во время компиляции.

Документация Adobe

Я новичок во всем этом, поэтому будьте нежны, когда вы застрелите меня в огне:)

0 голосов
/ 17 июля 2013

в flex, и всякий раз, когда у вас есть доступ к опциям компилятора, вы можете использовать: -include YourClass, чтобы принудительно связать класс из swc, даже если на него нет ссылки из основного swf.

но я не знаю, можно ли изменить параметры компилятора с flash cs4 ...

0 голосов
/ 08 июня 2010

Вы можете указать путь к файлу assets.swc в свойствах ActionScript, который должен работать и загружать ресурсы во время выполнения.

...