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は完了通知だけを受け取ればよいことになる。
いい感じだと思う。