package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.events.Event; import flash.events.ProgressEvent; import flash.events.IOErrorEvent; import flash.display.MovieClip; import flash.filters.BlurFilter; import flash.filters.DisplacementMapFilter; import flash.filters.DisplacementMapFilterMode; import flash.geom.Point; import flash.text.TextField; import jp.nium.display.ExLoader; import jp.nium.display.ExPreloader; import jp.progression.Progression; import jp.progression.commands.DoTweener; import jp.progression.commands.Func; import jp.progression.commands.ParallelList; import jp.progression.commands.SerialList; import fl.motion.easing.Sine; import fl.motion.easing.Circular; import fl.motion.easing.Cubic; /** * BitmapUtil クラスは BitmapData とか Bitmap を生成するための簡易クラスです。 * このクラスはこちらに置いてます。 * http://seyself.googlecode.com/svn/trunk/as3/classes/com/seyself/utils/BitmapUtil.as */ import com.seyself.utils.BitmapUtil; /** * このクラスの動作終了時に通知されます。 * @langversion 3.0 * @playerversion Flash 9.0.45.0 * @eventType flash.events.Event.CLOSE */ [Event( name = "close", type = "flash.events.Event" )] /** * preloader.flaのドキュメントクラス */ public class DemoPreloader extends ExPreloader { /** * ステージ上に配置された _logo ムービークリップを参照します。 */ public function get logo():MovieClip { return MovieClip(this.getChildByName("_logo")) || new MovieClip(); } /** * ステージ上に配置された _loadStatus ムービークリップを参照します。 */ public function get loadStatus():MovieClip { return MovieClip(this.getChildByName("_loadStatus")) || new MovieClip(); } /** * このクラスのインスタンスを参照します。 */ private static var _instance:DemoPreloader; public static function get instance():DemoPreloader { return _instance; } /** * 現在の状態を示します。 * 外部から"skip"が設定されると、その時点で動作が終了します。 */ private static var _status:String = "load"; public static function get status():String { return _status; } public static function set status(value:String):void { _status = value; if ( value=="skip" && instance ) { instance.close(); } } /** * コンストラクタ */ public function DemoPreloader() { super(); _instance = this; this.url = "index.swf"; logo.visible = false; loadStatus.bar.scaleX = 0; loadStatus.output.text = getParams(0, 0); addEventListener( ProgressEvent.PROGRESS, progressHandler ); } /** * 読み込み中のswfファイルの読み込み済みバイト情報を取得するために * onProgress とは別にイベントハンドラを設定します。 * @param event */ private function progressHandler( event:ProgressEvent ):void { //loadStatus.bar.scaleX = event.bytesLoaded / event.bytesTotal; new DoTweener( loadStatus.bar, { scaleX : event.bytesLoaded / event.bytesTotal, time : 1.0 } ).execute(); loadStatus.output.text = getParams( event.bytesLoaded, event.bytesTotal ); } override protected function _onInit():void { status = "init"; trace("onInit"); loadStatus.status.text = "onInit"; } override protected function _onOpen():void { status = "open"; trace("onOpen"); loadStatus.status.text = "onOpen"; } override protected function _onProgress():void { status = "progress"; trace("onProgress"); loadStatus.status.text = "onProgress"; } override protected function _onComplete():void { status = "complete"; trace("onComplete"); loadStatus.status.text = "onComplete"; var loc = this; var t:int = 0; // フレームカウント var filterLimit:int = 120; // フィルターの実行時間 var fadeLimit:int = 60; // フェードの実行時間 var scale:Number = 1000; var blur:Number = 32; var point:Point = new Point(); var img:Sprite = BitmapUtil.dummy( logo ); var image:Bitmap = Bitmap( img.getChildByName("bitmap") ); var bitmap:BitmapData = image.bitmapData; var clone:BitmapData = bitmap.clone(); image.alpha = 0.0; clone.perlinNoise( 400, 200, 4, 20, true, true, 7, true ); var mode:String = DisplacementMapFilterMode.CLAMP; var mapFilter:DisplacementMapFilter = new DisplacementMapFilter( clone, point, 1, 1, scale, scale, mode ); var blurFilter:BlurFilter = new BlurFilter( blur , blur , 2 ); var defaultBitmap:BitmapData = bitmap.clone(); bitmap.applyFilter( bitmap , bitmap.rect, new Point(0, 0), mapFilter ); bitmap.applyFilter( bitmap , bitmap.rect, new Point(0, 0), blurFilter ); addEventListener( "enterFrame", function(event:Event) { image.x = stage.stageWidth/2-image.width; if ( status=="skip" ) t = Math.max(filterLimit, fadeLimit)-1; image.alpha = Sine.easeOut( Math.min(t, fadeLimit), 0, 1, fadeLimit); mapFilter.scaleX = mapFilter.scaleY = Cubic.easeOut( t, scale, 1-scale, filterLimit ); blurFilter.blurX = blurFilter.blurY = Cubic.easeOut( t, blur, -blur, filterLimit ); bitmap.applyFilter( defaultBitmap , bitmap.rect, new Point(0, 0), mapFilter ); bitmap.applyFilter( bitmap , bitmap.rect, new Point(0, 0), blurFilter ); if (++t == Math.max(filterLimit, fadeLimit)) { event.target.removeEventListener( event.type, arguments.callee ); new DoTweener( image , { alpha: 0.0, time: 1.0 } , 1000 ).after( loc, close ).execute(); } } ); } override protected function _onIOError():void { status = "failed"; trace("onIOError"); loadStatus.status.text = "onIOError"; } /** * preloaderの一連の処理が終了したことを通知するために用意されたメソッドです。 */ private function close():void { status = "close"; trace("Preloader: close"); loadStatus.status.text = "close"; loadStatus.visible = false; dispatchEvent( new Event(Event.CLOSE) ); } private function getParams( loaded:int=-1, total:int=-1 ):String { if ( loaded < 0 ) loaded = bytesLoaded; if ( total < 0 ) total = bytesTotal ; var param:String = ""; param += "Loaded Bytes : " + loaded + " bytes\n"; param += "Total Bytes : " + total + " bytes\n"; param += "Percentage : " + (loaded / total * 100 >> 0) + "%\n"; return param; } } }