AS3播放/与外部swf通信

时间:2011-09-02 13:37:31

标签: flash actionscript-3

好吧所以我带来了一个测试外部swf,如下所示:

var loader:Loader = new Loader();                     
var url:URLRequest = new URLRequest("load2.swf"); 
loader.load(url);                                    
addChild(loader);

现在我试图像这样使用goto和play:

var loaded:Object;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoaded);

function handleLoaded(e:Event):void {
  loaded = e.target.content;
}

load1.addEventListener(MouseEvent.CLICK, handleClick);

function handleClick(e:MouseEvent):void {
  if (loaded) {
    loaded.gotoAndPlay("outro");
  }

  //other content here.
}

这个简单的外部测试swf有10帧。 @ frame 1是一个“intro”标签,@ frame 5是一个“停止”动作,而在第6帧,则是一个“outro”标签。

问题是,当我点击按钮时,它会重新加载外部swf并从第1帧播放。

任何想法/提示/提示等id很高兴欣赏。 提前谢谢。

4 个答案:

答案 0 :(得分:1)

尝试将loaded转换为MovieClip:

MovieClip(loaded).gotoAndPlay("outro");

好的,所以没有解决它......

如果没有看到更多的应用程序,很难说更多,因为提供的代码可以自行运行。如果此代码位于时间轴上,则可能值得在加载操作旁边添加跟踪以查看父播放头是否正在重播。

哈哈

我相信我已经解决了。问题来自load2.swf中TLF文本的存在。我通过创建自己的load2版本来证明这一点,没有任何TLF文本,这对你的eerase.fla工作得很好。当我向我的load2添加TLF文本字段时,它开始显示您正在经历的行为。因此修复只是在任何加载的SWF中不使用TLF文本字段。我使用经典文本字段测试没有问题。

发生这种情况的原因是因为TLF文本字段需要加载数据,因此它会创建一个加载到您的内容中的人工预加载器。当您发出gotoAndPlay操作时,实际上您正在与此预加载器通信,而不是您创建的时间线,结果是预加载器“加载”您内容的另一个副本。这不是一个实际的HTTP请求,因为内容全部在load2.swf中,因此Firebug的Net面板中没有任何内容。您可以通过反编译其中一个SWF来更清楚地看到正在创建的内容。

答案 1 :(得分:1)

尝试侦听Event.INIT而不是Event.COMPLETE。

引用LoaderInfo的文档:

  

complete:成功加载数据后调度。

     

init:在加载的SWF文件的属性和方法时调度   随时可以使用。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/LoaderInfo.html

编辑:我现在看到你不是在加载时直接调用gotoAndPlay,而是稍后。无论如何,我会在这里留下答案。

答案 2 :(得分:0)

我相信你只是在handleClick函数中检查if语句中的错误函数。您应该测试if(handleLoaded)而不是if(loaded)...

//these 4 lines load ext swf
var loader:Loader = new Loader();// create a new instance of the Loader class
var url:URLRequest = new URLRequest("load2.swf");// in this case both SWFs are in the same folder 
loader.load(url);
// load the SWF file;
addChild(loader);
//////////
//test below
var loaded:MovieClip;

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoaded);

function handleLoaded(e:Event):void
    {
    loaded = e.target.content;
    }

load1.addEventListener(MouseEvent.CLICK, handleClick);

function handleClick(e:MouseEvent):void
    {
    if (handleLoaded)
        {
            loaded.gotoAndPlay("outro");
        }

    //load new swf
    }

答案 3 :(得分:0)

我改进了

function handleClick(e:MouseEvent):void
    {
    if (handleLoaded)
        {
            loaded.gotoAndPlay("outro");
        }

    //load new swf
    }

替换为:

function handleClick(e:MouseEvent):void
{
    if (handleLoaded(e))
    {
        loaded.gotoAndPlay("outro");
    }

    //load new swf
}

确实可行..我正在测试Flex SDK 3.6a ..但我尚未测试Flash CS3 / CS4 / CS5。感谢