在加载的SWF文件中访问另一个剪辑内的剪辑

时间:2010-03-01 10:14:41

标签: actionscript-3 hierarchical-data movieclip

我在AS3写一个纸牌游戏。我正在使用的艺术家(在Flash CS4中)生成了一个包含所有卡片图形和动画的单个swf文件。 fla工作文件的结构如下所示:

- Scene
  - CardGraphics (Movie Clip)
    - CardFront
    - CardBack
    - CardValueImage (Movie Clip)
    ...

在程序中,我创建了52个我的Card类实例,每个实例都有一个从加载的swf创建的MovieClip实例。我们的想法是将CardValueImage MovieClip的框架设置为与Card实例的套装和排名成员变量相对应。但是,我无法弄清楚我如何访问CardValueImage并调用gotoAndStop(或者我需要调用的任何方法)。

这基本上就是我想做的事情:

// Card Class
[Embed(source = 'CardGraphics.swf')]
private static var CardsClip:Class;
private var clip:MovieClip = new CardsClip;

// Card Constructor
this.valueImageFrame = suit * 13 + rank; // Calculate which frame contains the
                                         // graphical representation of this card
this.clip.CardValueImage.gotoAndStop(valueImageFrame);

2 个答案:

答案 0 :(得分:1)

尝试:

this.clip.getChildByName('CardValueImage').gotoAndStop(valueImageFrame);

我不确定CardValueImage是否是您在CardGraphics中拥有的动画片段的实例名称,如果是,那么它应该起作用:)

编辑: 要访问嵌入式swf的时间轴,您需要一个不同的方法,留下一个代码示例,以及一个更详细解释它的博客文章。

package  
{
    import mx.core.ByteArrayAsset;

    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;

    public class App extends Sprite 
    {
        [Embed(source = '../assets/CardGraphics.swf', mimeType="application/octet-stream")]
        public static const CardsClip : Class;

        public var loader : Loader = new Loader;
        public var swfasset : ByteArrayAsset;
        public var clip : MovieClip;

        public function App()
        {
            swfasset = new CardsClip();
            loader.contentLoaderInfo.addEventListener(Event.INIT, loadCompleteListener, false, 0, true);
            loader.loadBytes(swfasset);
        }

        private function loadCompleteListener(e : Event) : void 
        {
            clip = MovieClip(loader.content);

            var cardsGraphics:MovieClip = MovieClip(clip.getChildByName('CardsGraphics'));
            var cardValueImage:MovieClip = MovieClip(cardsGraphics.getChildByName('CardValueImage'));

            cardValueImage.gotoAndStop(2);

            addChild(clip);
        }
    }
}

http://www.8bitrocket.com/newsdisplay.aspx?newspage=36607

*请注意,代码已更改为符合您的方案。

答案 1 :(得分:1)

Object(a.contentLoaderInfo.content)

例如,如果您有一个swf,并且想要访问实例名称为some_name的符号。

 package {
        import flash.display.Loader;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        public class Main extends Sprite
            {
              [Embed(source="assets/YourMovie.swf", mimeType="application/x-shockwave-flash")]
              private var ClassName:Class

              private var mov:MovieClip
              private var symbolFromSWF:MovieClip
              public function Main()
              {
                mov=new ClassName();
                mov.addEventListener(Event.COMPLETE,onComp);
                addChild(mov);
              }
              protected function onComp(event:Event):void
              {
                var a:Loader=Loader(mov.getChildAt(0));
                symbolFromSWF=Object(a.contentLoaderInfo.content).some_name;
              }
         }
    }