2012-06-04 5 views
1

Я внедряю SWF-файл, на котором есть некоторые дети на его временной шкале. Как это:Доступ к дочерним элементам aswf

[Embed(source="assets/skyscraper200x600.swf")] 
private var Skyscraper :Class; 

Все дети в швейцарских франках имеет имя экземпляра, я проверил, что при создании SWF в Flash CS5. Я пытаюсь получить доступ к этим детям по имени, как это:

_bg = MovieClip(new Skyscraper()); 
_pig = MovieClip(_bg.getChildByName("chara_pig")); 
_arrow = MovieClip(_bg.getChildByName("arrow_banner")); 

Однако, как _pig и _arrow в конечном итоге нуль.

Что еще более странно, когда я смотрю на объект Skyscraper в отладчике, он показывает довольно странное имя класса и загрузчик как его единственный ребенок (который, в свою очередь, не имеет детей). Что с этим?

.

I может обращаться к ним, как указано выше, если я не внедряю swf, но загружаю его с помощью Loader. Но я не могу этого сделать в этом случае. Мне нужно встроить swf.

Итак, как вы можете получить доступ к детям встроенных swfs?

Я не разговоры о доступе к классам в библиотеке встроенного swf, но экземпляры на временной шкале.

+0

- ваш .swf файл AS2? – OXMO456

+0

Это было, поначалу. Но мы переключили его на AS3. К сожалению, это ничего не изменило. – TheSHEEEP

ответ

4

Вот решение. Вы также можете увидеть шаги, которые помогли мне найти это решение (describeType - ваш друг):

public class Demo extends Sprite { 

    [Embed(source="test.swf")] 
    private var Test:Class 

    public function Demo() { 
     //first guess is that embed SWF is a MovieClip 
     var embedSWF:MovieClip = new Test() as MovieClip; 
     addChild(embedSWF); 

     //well, emebed SWF is more than just a MovieClip...  
     trace(describeType(embedSWF));//mx.core::MovieClipLoaderAsset 
     trace(embedSWF.numChildren);//1 
     trace(describeType(embedSWF.getChildAt(0)));//flash.display::Loader 

     var loader:Loader = embedSWF.getChildAt(0) as Loader; 

     //the content is not already loaded... 
     trace(loader.content);//null 


     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(){ 
      var swf:MovieClip = loader.content as MovieClip; 
      var child:MovieClip = swf.getChildByName("$blob") as MovieClip; 
      //do nasty stuff with your MovieClip ! 
     }); 
    } 
} 
+0

Работает как шарм. Спасибо! Кто придумал плохую идею встраивания swfs, совершенно отличную от загрузки? Странно. – TheSHEEEP

0

Одно из решений заключается в том, чтобы вставить swf как octet stream and reconstitute its bytes.. Однако я, кажется, что-то не забыл прочитать где-нибудь, что если вы просто установите mimeType на «application/x-shockwave-flash», вы получите MovieClip, который работает нормально.

+0

При попытке загрузить его как поток октета (через Loader.loadBytes (new class()) он сообщает мне, что файл имеет некоторые недопустимые данные. И установка mimeType на «application/x-shockwave-flash» просто ничего не меняет – TheSHEEEP

1

В конце этого урока http://jadendreamer.wordpress.com/2010/12/20/flash-as3-embedding-symbols-from-external-swf-game-tutorial есть пример того, как это может быть сделано

+0

Это полезно для символов, которые явно экспортируют в AS3 в классе. Но это именно то, чего я не хочу. Я хочу, чтобы имена назывались экземплярами на временной шкале, а не их классами. – TheSHEEEP

Смежные вопросы