Flash Player如何加载主SWF文件?

时间:2011-11-29 03:46:41

标签: actionscript load flash lazy-loading

更新

似乎每个人都没有彻底阅读我的问题,所有答案都建议我预加载或使用外部资产。所以任何愿意回答的人都请注意这篇文章中的大胆的问题。谢谢!


我正在开发一个只有一个SWF文件的简单Flash应用程序。我希望SWF电影尽快开始播放,所以我不为它构建一个预加载器。如果我的动作代码引用了尚未加载的资源,会发生什么?

例如,当电影刚加载到第1帧时,代码会使播放头从第20帧跳到第10帧。 在这种情况下,Flash播放器会吗?

  • 阻止脚本执行,停止播放,继续从第11帧加载到20(不执行脚本),跳转到第20帧并在第39帧时调用该帧的脚本; s装?
  • 阻止脚本执行,停止播放,忽略将框架11加载到19,加载框架20,跳转到框架20并在该框架调用脚本?< / LI>
  • 忽略跳转到第20帧,在转到第20帧语句后继续执行下一个语句?
  • 还是其他什么?

如果Flash播放器没有忽略跳转到第20帧,那么在完全加载第event帧时会触发任何20吗?

注意:第一个问题的答案应该集中在我的示例上,涵盖所有情况(例如从库中附加电影......)更好,但不是必需的。

谢谢!

5 个答案:

答案 0 :(得分:3)

Flash将始终在运行应用程序之前加载所有帧。但是,帧内容可能未完全加载。因此,如果您在第20帧上有一些图像,它们可能不会出现。

但基本上你不应该依赖Flash为你加载东西 - 它可能按照你想要的顺序进行,但也许不会。如果你有很多资产并且你是逐帧跳跃的,你应该使用Loader类自己处理加载。

答案 1 :(得分:1)

Flash播放器会尝试跳转到第20帧。但它只会到加载的帧。因此,如果你告诉它去20,只加载10,你将进入10。

在未加载的代码中调用资源将抛出错误,或将该对象定义为null。不用说,这需要避免。首先加载这些资源。

一个好的解决方案是使用-frame编译器参数来创建一个2帧的flash影片。第一个包含您的预加载器,第二个帧包含完整的应用程序。这样,您可以在调用完整功能之前预先加载所需内容。

这是一个如何做到这一点的例子。

package 
{
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.ProgressEvent;
    import flash.utils.getDefinitionByName;

    /**
     * ...
     * @author Zachary Foley
     */
    public class Preloader extends MovieClip 
    {

        public function Preloader() 
        {
            if (stage) {
                stage.scaleMode = StageScaleMode.NO_SCALE;
                stage.align = StageAlign.TOP_LEFT;
            }
            addEventListener(Event.ENTER_FRAME, checkFrame);
            loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
            loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

            // TODO show loader
        }

        private function ioError(e:IOErrorEvent):void 
        {
            trace(e.text);
        }

        private function progress(e:ProgressEvent):void 
        {
            // TODO update loader
        }

        private function checkFrame(e:Event):void 
        {
            if (currentFrame == totalFrames) 
            {
                stop();
                loadingFinished();
            }
        }

        private function loadingFinished():void 
        {
            removeEventListener(Event.ENTER_FRAME, checkFrame);
            loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
            loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);

            // TODO hide loader

            startup();
        }

        private function startup():void 
        {
            var mainClass:Class = getDefinitionByName("Main") as Class;
            addChild(new mainClass() as DisplayObject);
        }

    }

}

要使用此功能,您需要将frame参数添加到构建中。对于此示例,frame参数将为:

-frame start Main

答案 2 :(得分:0)

在您的情况下,您必须为项目定义渐进式加载方法。

首先开发外部资产,最初只加载一个并显示它。只需启动第二个加载并仅使用加载的UI管理显示。所以你可以避免预加载器。当你将获得加载项目列表时,只需逐步显示逐个显示。

首先只显示一个。 第二次加载后第一次&amp;第二个.. 那么你必须管理

另外,你必须等到第一次显示到下一个显示资产加载将结束。并且这次不显示预装载器。

答案 3 :(得分:0)

我已经使用Adobe Flash Professional进行了一些测试,以便找到我的问题的答案。每个感兴趣的人都可以通过在Adobe Flash中执行以下步骤来重现测试:

  1. 使用某个帧创建一个电影,每个帧包含一个图像和一些动作脚本代码,例如。
  2. 选择菜单控制 - &gt;测试电影 - &gt;在Flash Professional中:将显示调试播放器
  3. 在调试播放器中,选择菜单查看 - &gt;下载设置然后选择所需的下载速度
  4. 同样在调试播放器中,确保选中视图菜单下的带宽分析器模拟下载
  5. 如果脚本没有更改播放头,Flash播放器将:

    1. 加载第1帧并等待它完全加载
    2. 转到第1帧
    3. 在第1帧执行脚本
    4. 展示框架1
    5. 执行第2帧的上述步骤,等等......(保持第1帧直到第2帧完全加载,然后转到第2帧,执行脚本,显示......)
    6. 如果脚本改变播放头,例如从第1帧跳到第20帧,Flash播放器将:

      1. 继续执行第1帧中的所有脚本语句(即使这些语句遵循跳转语句)并显示第1帧。
      2. 如果加载了第20帧,跳转到第20帧,在其上执行脚本&amp;显示它。如果没有加载,跳转到最近的加载帧(在我的例子中,问题是第10帧),但不要在该帧上执行脚本。

答案 4 :(得分:0)

在AS2中

,试试这段代码。加载进度显示在第一帧,主要内容显示在第3帧。 此代码在ActionScript 2.0参考(getBytesLoaded)中。 http://help.adobe.com/ko_KR/AS2LCR/Flash_10.0/00001304.html#1333866

if (this._framesloaded<this._totalframes) {
    this.gotoAndPlay(1);
} else {
    this.gotoAndStop(3);
}
在AS3中

,使用此。

this.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);