Ответ 1
Как и в Flash Player 11.3, вы можете использовать ApplicationDomain.getQualifiedDefinitionNames()
.
Смотрите официальную документацию для метода и этот пост в блоге о выпуске Flash Player.
Когда вы загружаете SWF в другой, SWF загрузчика может получить определенные определения из загруженного SWF с помощью ApplicationDomain.getDefinition(name:String)
. Например:
package
{
// ... imports
public class SWFLoader extends Sprite
{
private var loadedAppDomain:ApplicationDomain;
public function SWFLoader()
{
var request:URLRequest = new URLRequest("test.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
loader.load(request);
}
private function onTestLoadComplete(event:Event):void
{
var loaderInfo:LoaderInfo = LoaderInfo(event.target);
loadedAppDomain = loaderInfo.applicationDomain;
// Here we can get ANY defined symbol (class, namespace or function according to Adobe Flash help)
var someSymbolClass:Class = Class(loadedAppDomain.getDefinition("SomeSymbol"));
var someSymbolSprite:Sprite = Sprite(new someSymbolClass());
addChild(sprite);
}
}
}
Как я могу получить все определения в SWF, не указав их явно?
Как и в Flash Player 11.3, вы можете использовать ApplicationDomain.getQualifiedDefinitionNames()
.
Смотрите официальную документацию для метода и этот пост в блоге о выпуске Flash Player.
EDIT: Это самое быстрое решение вашей проблемы: http://www.bytearray.org/?p=175
Привет, вы можете использовать эту библиотеку: https://github.com/claus/as3swf/wiki/ У вас нет времени для более глубокого теста, но вот что я нашел:
1 - Я создал .swf, содержащий в библиотеке 2 экспортированных MC, $Test и $Test2 2 - После того, как .swf загружен загрузчиком, я запустил этот код:
var swf : SWF = new SWF(loader.contentLoaderInfo.bytes);
trace(swf);
3 - На выходе вы увидите строки тезисов:
[76:SymbolClass]
Symbols:
[0] TagID: 2, Name: $Test2
[1] TagID: 1, Name: $Test
Я думаю, что есть способ получить эту информацию непосредственно через API-интерфейс библиотеки
Вы должны поместить загруженный SWF в текущий ApplicationDomain.
Используйте ApplicationDomain.currentDomain для этого, в информации ContextLoader.
loader.load(request, new ContextLoader(false, ApplicationDomain.currentDomain));
Он должен работать.
Следуя ответу, полученному по предыдущему вопросу, который я задал здесь несколько дней назад (это о SWC, но в вашем случае это не имеет особого значения)
Работа с SWC - проблема getDefinitionByName
Если оба SWF имеют один и тот же ApplicationDomain, вы можете получить доступ к загруженным классам SWF, выполнив следующее:
//provided that SomeSymbol extends Sprite...
var someSymbolSprite:Sprite =new SomeSymbol();
С другой стороны, вы не сможете этого сделать
var SomeSymbol:Class = getDefinitionByName("SomeSymbol");
если вы не создадите библиотеку объектов из загруженного SWF
var ssym:SomeSymbol;
Проверьте приведенную выше ссылку для получения более подробной информации.