0

我在 FlashDevelop 中制作了一个 Flash 项目来制作广告。

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

-frame=NameOfLabel,NameOfMainClass

我的主类在顶部/默认包级别被简单地称为“Main”。

因此,作为 SWF 的预加载器部分的帧 #1具有:

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

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

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

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

我将项目或多或少分成不同的状态(介绍、就绪、SlideMenu 等),但我不确定如何轻松地将 Flash 电影重置到最开始(预加载和显示的位置) YouTube 视频)。

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

有没有一种简单的方法可以从 AS3 调用重播功能?

4

2 回答 2

0

不是简单地回到第 1 帧就可以解决问题吗?

于 2013-06-12T19:12:22.960 回答
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 );
}

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

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

将加载程序添加到舞台,您就可以再次启动并运行!

于 2013-06-12T21:28:41.490 回答