如何在自预装的Flash电影中正确添加“重放”功能?

时间:2013-06-12 15:54:12

标签: actionscript-3 flash advertising preloader replay

我在FlashDevelop中创建了一个Flash项目来创建广告。

通过使用Additional Compiler参数设置Preloader:

-frame=NameOfLabel,NameOfMainClass

我的主要课程简称为“主要”,位于顶级/默认包级别。

所以第1帧,作为SWF的Preloader部分,有:

  • 极少数位图,矢量图形和文字(保持在50kb以下);
  • 中心的 YouTube 视频播放器(不计入文件大小限制);

第2帧包含其他所有内容(Main类基本上嵌入了它的所有依赖项)。这包括:

  • 来自预编译SWF的资产(位图,符号,字体,XML数据);
  • 导入的所有类(这对于导入其他类的每个类都是递归的);

现在我的一个大问题是,我的客户在完成99.9%的项目后很久才请求“重播”功能。

我让这个项目或多或少地分成了不同的状态(Intro,Ready,SlideMenu等),但我不知道如何轻松地将Flash电影重新设置回到最开始(它的位置)预加载并显示YouTube视频。

简单的解决方案是简单地调用一个可以刷新Flash容器的ExternalInterface JavaScript方法,但我认为我无法控制HTML / JavaScript端的内容。

是否有一种从AS3调用重播功能的简单方法?

2 个答案:

答案 0 :(得分:0)

不会简单地回到第1帧吗?

答案 1 :(得分:0)

以下似乎可以解决问题!

private function onReplayClick(e:MouseEvent):void {
    var theStage:Stage = this.stage; //Temporarly store the stage.

    //Kill any animations happening:
    TweenMax.killAll(); //3rd party, may not be applicable for you :P

    //Remove ALL containers / child DisplayObjects
    SpriteUtils.recursiveRemove(theStage); //custom-made
    // (this object is no longer attached to the stage at this point)

    //Nullify any Singleton / Static variables:
    Main.INST = null;

    // Load the 'bytes' of the current SWF in a new Loader, then...
    // add it to the stage
    var swf:Loader = new Loader();
    swf.loadBytes( theStage.loaderInfo.bytes );
    theStage.addChild( swf );
}

通过对DisplayObjects和任何静态变量(如Singleton实例)进行深度递归清理,它会为您留下一个空白阶段。

之后,您可以实例化一个新的Loader,它将通过当前LoaderInfo的bytes属性加载SWF本身。

将Loader添加到舞台上,然后再次启动并运行!