AS3 экземпляр класса от внешнего SWF - PullRequest
4 голосов
/ 28 октября 2009

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

Мне интересно, возможно ли это вообще вообще. Я попытался набрать var как Class, который находится внутри загруженного SWF, а затем создать экземпляр, но ничего не могу сделать.

некоторый код

private static function onCompleteHandler(e:Event) {<br> dashboardObject = e.target.content;<br> // registerClassAlias("Dashboard", ); doesnt work<br> var dash:Class = getDefinitionByName("Dashboard") as Class;<br> var myDash = new dash();<br> trace(myDash.show);<br> }

Error

ReferenceError: Error #1065: Variable Dashboard is not defined.<br> at global/flash.utils::getDefinitionByName()<br> at System$/onCompleteHandler()

Так что, похоже, вы не можете создать экземпляр класса, если он не выполняется в рамках SWF проекта. Что, если это правда, это то, что я хочу, чтобы это было сделано. Я не хочу, чтобы люди пытались создавать экземпляры моих классов, просто скачав SWF-файл для того, что я здесь строю.

спасибо

Ответы [ 5 ]

7 голосов
/ 28 октября 2009

Вам нужно сделать две вещи:

  1. Дайте Dashboard пакет (package.to.Dashboard). Классы без пакетов получают другие атрибуты (защищенное пространство имен) в скомпилированной форме, чем классы с пакетами, что делает их недоступными для внешних SWF-файлов.
  2. Убедитесь, что загруженный SWF-файл загружен в тот же домен приложения, что и родительский

После этого вы сможете использовать getDefinitionByName из загруженного SWF и new возврат Class.

3 голосов
/ 17 августа 2010
var loader:Loader = new Loader();
var req:URLRequest = new URLRequest("foo.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete);
loader.load(req);


function fooLoadComplete(e:Event):void
{
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class;
    var sym1:MovieClip = new ClassDefinition();

    this.addChild(sym1);
}
0 голосов
/ 31 октября 2009

Возможно, вы захотите сделать это:

var dash:Class = Loader(e.target).contentLoaderInfo
    .applicationDomain.getDefinition("Dashboard")  as  Class;

getDefinitionByName() работает для классов, загруженных текущим SWF, а не внешними SWF. Для внешнего SWF-файла вам нужно указать ссылку на объект загрузчика, который фактически загрузил конкретный SWF-файл.

Кроме того, если вы делаете это в FlashBuilder, убедитесь, что «основным приложением» в загружаемом SWF-файле является Sprite (или, возможно, MovieClip, хотя я не проверял это), а не приложение (как вы получаете в файле MXML по умолчанию, созданном для нового проекта SWF). В противном случае приведенный выше код не сможет найти искомое определение класса.

0 голосов
/ 30 октября 2009

Я рекомендую использовать CASALib для этого. Я создал целое приложение, в котором я не знал имен классов до времени выполнения. Я просто сделал несколько интерфейсов, чтобы гарантировать, что самые важные функции всегда были доступны. Утилита CASALib с именем LibraryManager имеет функцию создания экземпляра класса из внешнего SWF.

0 голосов
/ 28 октября 2009

Так что, кажется, вы не можете создать экземпляр класса, если он не выполняется в рамках SWF проекта.

Попробуйте ModuleLoader класс. См. эту статью о том, как создавать модули.

...