Actionscript Flash Player如何加载主SWF文件?

Actionscript Flash Player如何加载主SWF文件?,actionscript,load,flash,lazy-loading,Actionscript,Load,Flash,Lazy Loading,更新: 似乎每个人都没有彻底阅读我的问题,所有答案都建议我预加载或使用外部资产。因此,任何愿意回答的人,请注意本帖中的大胆问题。谢谢 我正在开发一个简单的Flash应用程序,它只有一个SWF文件。我希望SWF电影尽快开始播放,这样我就不会为它构建预加载程序。如果我的actionscript代码引用了尚未加载的资源,会发生什么情况 例如,当电影刚刚加载到第10帧时,该代码会导致播放头从第1帧跳到第20帧在这种情况下,flash player将? 阻止脚本执行,停止播放,继续从帧11加载到20(

更新:

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


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

例如,当电影刚刚加载到第
10帧时,该代码会导致播放头从第
1帧跳到第
20帧在这种情况下,flash player将?

  • 阻止脚本执行,停止播放,继续从帧
    11
    加载到
    20
    (不执行脚本),跳转到帧
    20
    ,并在加载脚本时在该帧调用脚本
  • 阻止脚本执行,停止播放,忽略加载帧
    11
    19
    ,加载帧
    20
    ,跳转到帧
    20
    并在该帧调用脚本
  • 忽略跳转到帧
    20
    ,是否在转到帧
    20
    语句后继续执行下一个语句
  • 还是别的什么
如果flash player不忽略跳转到帧
20
,则当帧
20
完全加载时,会触发任何
事件

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


谢谢

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


但基本上你不应该依赖Flash来为你加载东西——它可能会按照你想要的顺序来做,但可能不会。如果您有许多资源,并且正在从一帧跳到另一帧,您应该使用
加载程序
类自己处理加载。

Flash player将尝试跳到第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 start Main

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

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

首先只显示一个。 第二次加载后,第一次加载和第二次加载。。 那么,你必须管理好


另一方面,您必须在第一个显示器上等待,直到下一个显示器资产加载结束。这次不要显示预加载程序

为了找到我的问题的答案,我用Adobe Flash Professional做了一些测试。感兴趣的每个人都可以通过在Adobe Flash中执行以下步骤来复制测试:

  • 例如,创建一部带有某些帧的电影,每个帧包含一个图像和一些actionscript代码
  • 在Flash Professional中选择菜单控制->测试电影->将显示调试播放器
  • 在调试播放器中,选择菜单“查看->下载设置”,然后选择所需的下载速度
  • 此外,在调试播放器中,确保已选中“视图”菜单下的“带宽探查器”和“模拟下载”
  • 如果脚本未更改播放头,Flash player将:

  • 加载第1帧并等待它完全加载
  • 转到第1帧
  • 在第1帧上执行脚本
  • 显示框1
  • 对第2帧执行上述步骤,依此类推。。。(停留在第1帧直到第2帧完全加载,然后转到第2帧,执行脚本,显示…)
  • 如果脚本更改播放头,例如从第1帧跳到第20帧,Flash player将:

  • 继续执行第1帧中的所有脚本语句(即使这些语句跟随跳转语句)并显示第1帧
  • 如果加载了第20帧,则跳转到第20帧,在其上执行脚本并显示它。如果未加载,请跳转到最近加载的帧(在我的问题示例中是第10帧),但不要在该帧上执行脚本

  • 在AS2中,尝试以下代码。第一帧显示加载进度,第三帧显示主要内容。 此代码位于ActionScript 2.0参考(getBytesLoaded)中


    出于某种原因,我不想在播放之前完全加载电影,也不想在需要时加载外部资源。@ExpExc,这有点矛盾。您不希望加载所有内容,也不希望根据需要加载内容。那么,您希望如何处理加载资产呢?我希望在需要时加载已经嵌入到主swf中的东西,而不希望从外部加载。你知道吗?我不记得在医生那里见过这方面的事。我的猜测是,当您到达帧时,是否要加载资源是未定义的。这可能取决于SWF的编译方式、资产的添加顺序、互联网连接速度等。要想让东西按您的意愿加载,唯一的方法就是
    if (this._framesloaded<this._totalframes) {
        this.gotoAndPlay(1);
    } else {
        this.gotoAndStop(3);
    }
    
    this.loaderInfo.addEventListener(Event.COMPLETE, completeHandler);