如何在 AS3 中创建预加载器

Posted

技术标签:

【中文标题】如何在 AS3 中创建预加载器【英文标题】:How to create Preloader in AS3 【发布时间】:2012-01-14 16:42:35 【问题描述】:

我的 Flash 应用程序有点大,所以我想在我的应用程序中嵌入一个预加载器, 所以谁能告诉我如何在新的“场景”中创建一个预加载器和 预加载完成后再加载另一个场景?

提前致谢!

【问题讨论】:

【参考方案1】:

我建议走“轻量级 swf 加载大量 swf”路线,因为这是我见过的最有效的路线。那里有很多臃肿的教程,但对我来说,我喜欢这个http://doogog.com/actionscript-3-external-preloader.html 直截了当。

【讨论】:

【参考方案2】:

这里是如何创建嵌入式 as3 预加载器的文章 http://www.kirupa.com/forum/showthread.php?351689-actionscript-preloader-in-flash-develop

【讨论】:

【参考方案3】:

更新:

选项 1. Flash IDE,一个 swf 文件

要在使用 Flash IDE 编译时拥有嵌入式预加载器,您应该将 Document Class 代码移动到 FLA 文件的第二帧(当然,没有包和类构造函数),并从项目中删除 Document Class .as 文件特性。在第一帧你应该放置这样的代码:

stop(); // stops the timeline at preloader frame
this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
function onProgress(e:ProgressEvent):void 
    var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
    //additional code to update preloader graphics
    //..
    if (percent == 100) onLoaded();

function onLoaded() 
   this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
   nextFrame();

一旦加载了 swf,它就会前进到下一帧并且应该执行原始的应用程序初始化代码。 如果您以大多数资产(图像等)都在 Flash IDE 库中而不是在第一帧加载(您可以在每个库项目的属性中检查)的方式组织项目,这将非常有效。

选项 2. Flash IDE,两个 swf 文件

另一个选项,正如另一位评论者已经推荐的那样,是保持您的应用程序 swf 不变,并创建另一个轻量级 swf 来加载第一个。 第一帧preloader.swf的代码:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
loader.load(new URLRequest("path/to/application.swf"));

function onProgress(e:ProgressEvent):void

   var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
   //additional code to update preloader graphics
   //..
   if (percent == 100) onLoaded();

function onLoaded():void

   loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
   var application:DisplayObject = loader.content;
   addChild(application);

当您尝试从 Document Class constructor 等访问 stage 时,这种方法有时会出现其他问题,但在大多数情况下,这应该可以解决问题。

选项 3. 不同的 IDE,我的建议: FlashDevelop

如果您尝试使用 FlashDevelop、Flash Builder 或任何其他 IDE 编译我最初发布的代码,它应该可以工作。

原帖:

这是嵌入式预加载器的基本设置。你的Document Class 应该是这样的:

package 

  import flash.display.Sprite;

  [Frame(factoryClass='Preloader')] //class name of your preloader

  public class Main extends Sprite 

     public function Main() 
        //init
     
  

预加载器类:

package 

   import flash.display.DisplayObject;
   import flash.display.MovieClip;
   import flash.events.ProgressEvent;
   import flash.utils.getDefinitionByName;

  public class Preloader extends MovieClip 

     public function Preloader()
     
        //add preloader graphics 

        //check loading progress
        this.loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
     
     private function onProgress(e:ProgressEvent):void 
     
        var percent:Number = Math.round(e.bytesLoaded / e.bytesTotal * 100);
        if (percent == 100)
        
          this.loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
          onLoaded();
        
     
     private function onLoaded():void
     
       nextFrame(); //go to next frame
       var App:Class = getDefinitionByName("Main") as Class; //class of your app
       addChild(new App() as DisplayObject);
     
  

【讨论】:

您有任何错误吗?您能否展示有关预加载和初始化 Document Class 的代码? 不,我没有收到任何错误消息,我的文档类与您所说的完全相同。 Preloader构造函数中添加跟踪语句,检查预加载器是否正确初始化:trace("begin preloading");如果没有收到此消息,则说明Document类有问题。 不,预加载器类没有执行。 你的Document 班级有[Frame] 元标记吗?您使用什么 IDE 来编译您的项目?【参考方案4】:

您还可以使用 Greensock 等第三方库在应用程序启动之前和加载应用程序文件时进行预加载。

我个人使用 Greensock 并推荐它。它解决了 loaderInfo 类的一些错误。

http://www.greensock.com/loadermax/

【讨论】:

【参考方案5】:

[Frame(factoryClass='Preloader')] 不再适用于新的 ASC 2.0 编译器。相反,预加载器成为您的文档类,您需要添加一个附加编译器参数来告诉 Flash 在第二帧中包含您的主类(不要在预加载器中引用它):

-frame=NameDoesntMatter,Main

Does ASC 2.0 recognize [Frame] metadata tags (ex: for Preloader factoryClass)?

ASC2.0 and Frame metatag

【讨论】:

以上是关于如何在 AS3 中创建预加载器的主要内容,如果未能解决你的问题,请参考以下文章

在ActionScript3中创建预加载程序类

如何在 Forge 中创建多模型加载器和查看器

ActionScript 3 AS3 getURL / navigateToURL(如何在AS3中创建可点击链接)

AS3 getURL/navigateToURL(如何在AS3中创建可单击的链接)

AS3 将多个文本框数据保存并加载到本地文件

如何在 Flutter 中创建像 Ajio 移动应用一样的加载器动画。下面是装载机的视频