homeへのリンクです。

flashでAmazonECS 9

2006年07月25日

ActionScirpt3.0では、MovieClipは以下のようなクラス構造になっている。

MovieClip→Sprite→DisplayObjectContainer→InteractiveObject→
DisplayObject→EventDispatcher→Object

このEventDispatcherの部分がイベント配信を実装させている。

http://livedocs.macromedia.com/flex/2/langref/index.html参照

MovieClipなら何でも、addEventListener();dispatchEvent();が使える。

とりあえず定数を定義する。

package classes.events{
   public class LoadBarEvent{
      public static var LOADCOMPLETE:String="loadComplete";
   }
}

Mainを以下のように修正。

package classes.main{
   import flash.display.*;
   import flash.events.*;
   import classes.loadbar.*;
   import classes.events.*;
   public class Main extends MovieClip{
      private var loadbar:LoadBar;
         public function Main(){
            this.stop();
            loadbar=new LoadBar();
            this.addChild(loadbar);
            loadbar.init(200,298,this);
            loadbar.addEventListener(LoadBarEvent.LOADCOMPLETE,startMain);
          }
      private function startMain(eventObj:Event):void{
         this.removeChild(loadbar);
         this.gotoAndStop("main");//検索画面へ移動
      }
   }
}

LoadBarを以下のように修正。

package classes.loadbar{
   import flash.display.*;
   import flash.events.*;
   import classes.main.*;
   import classes.events.*;
   public class LoadBar extends MovieClip{
      public function LoadBar(){
         this.scaleX=0;
      }
      public function init(startx:Number,starty:Number,target:DisplayObject):void{
         this.x=startx;
         this.y=starty;
         target.loaderInfo.addEventListener(ProgressEvent.PROGRESS, myProgress);
         target.loaderInfo.addEventListener(Event.COMPLETE, callBack);
      }
      private function myProgress(eventObj:Event):void{
         var persentloaded:uint=0;
         if(eventObj.bytesTotal !=0){
            persentloaded=eventObj.bytesLoaded/eventObj.bytesTotal;
         }
         if(persentloaded<100){
            this.scaleX=Number(persentloaded);
         }
      }
      public function callBack(eventObj:Event):void{
         this.scaleX=1;
         this.dispatchEvent(new Event(LoadBarEvent.LOADCOMPLETE));
      }
   }
}

LoadBarがロードを監視して、Mainは完了通知だけを受け取ればよいことになる。
いい感じだと思う。