As3项目与Preloader

时间:2012-01-06 12:39:41

标签: actionscript-3 preloader flashdevelop

我想使用FlashDevelop提供的Preloader,但它没有做出反应。

我的装载机在没有下载文件时告诉我100%。

代码应显示包含百分比中介但不

的trace()

你能帮帮我吗?

Mains.as

package
{
   import flash.display.Loader;
   import flash.display.Sprite;
   import flash.events.Event;
   import flash.net.URLRequest;

   [Frame(factoryClass="Preloader")]
   public class Main extends Sprite
   {
       public function Main():void
       {
           if (stage) init();
           else addEventListener(Event.ADDED_TO_STAGE, init);
       }

       private function init(e:Event = null):void
       {
           removeEventListener(Event.ADDED_TO_STAGE, init);
           // entry point
           var imgRequest:URLRequest         = new URLRequest("http://next-web.be/actionscript/0.jpg");
           var img:Loader = new Loader();
               img.load(imgRequest);
           addChild(img);
       }
   }
}

Preloader.as

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;

   import flash.display.Sprite;

   public class Preloader extends MovieClip
   {
       private var bar:Sprite;

       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
           bar = new Sprite();
           bar.graphics.lineStyle(1, 0x4444ff, 1, true);
           bar.graphics.drawRect(0, 0, 100, 6);
           bar.x = stage.stageWidth / 2 - bar.width / 2;
           bar.y = stage.stageHeight / 2 - bar.height / 2;
           addChild(bar);
       }

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

       private function progress(e:ProgressEvent):void
       {
           // TODO update loader
           bar.graphics.lineStyle(0, 0, 0);
           bar.graphics.beginFill(0x8888ff);
           bar.graphics.drawRect(1, 1, (e.bytesLoaded / e.bytesTotal) * 98 , 4);
           bar.graphics.endFill();
           trace( "loading:" + (e.bytesLoaded / e.bytesTotal) * 100 );
       }

       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
           removeChild(bar);
           bar = null;

           startup();
           //stop();
       }

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

2 个答案:

答案 0 :(得分:2)

您需要在用于下载数据的contentLoaderInfo Loader属性上注册您的监听器(在您的情况下为img.contentLoaderInfo)。

在您的代码中,您在progress上注册了loaderInfo,这是Preloader类的字段(继承自MovieCLip),并会在加载包含Preloader类的SWF。

public class Preloader extends MovieClip
{
    public function Preloader()
    {
        // This is wrong.
        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
        // Function `progress` will show the progress of loading your SWF file,
        // *not* the JPEG you're loading in class Main.
    }
}

您需要在用于下载数据的contentLoaderInfo Loader属性上注册您的监听器(在您的情况下为img.contentLoaderInfo)。

img.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);

当然,它将只显示 加载JPEG文件的进度。 您还需要以某种方式将Loader对象(或仅contentLoaderLinfo)传递给Preloader,或者在Main类中包含事件处理程序。

答案 1 :(得分:0)

继续搜索后,我意识到自己的错误。

到现在为止,我总是使用“loader”但这个功能不包括我的图片到swf文件。所以我使用了一个库swc,允许我生成一个完整的swf。