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