//////////////////////////////////////////////////////////////////////////////// // // MCに残像を付与する // //////////////////////////////////////////////////////////////////////////////// import flash.display.BitmapData; import flash.geom.*; //****************************************************************************// // // クラス宣言 // //****************************************************************************// class motion.AfterEffect{ //////////////////////////////////////////////////////////////////////////// // // 変数・定数定義 // //////////////////////////////////////////////////////////////////////////// //************************************************************************// // // 処理 // //************************************************************************// private var mc :MovieClip; private var inter :Number; private var eraze :Number; private var clr :ColorTransform; private var stageMC:MovieClip; private var elist :Object; //エフェクト一覧管理用 private var timerID:Number; private var STAGE_MC :String = "stageMC"; private var EFFECT_MC:String = "effectMC"; //////////////////////////////////////////////////////////////////////////// // // public // //////////////////////////////////////////////////////////////////////////// //************************************************************************// // // コンストラクタ // // mc : 残像付与対象MC // inter : 残像表示間隔(ミリ秒) // eraze : 消去スピード(1~100) // clr : 残像色情報 // //************************************************************************// public function AfterEffect( mc:MovieClip, inter:Number, eraze:Number, clr:ColorTransform ){ this.mc = mc; this.inter = inter; this.eraze = eraze; this.clr = clr; this.elist = { mc:new Object(), bmp:new Object() }; //エフェクト表示用ステージMCと残像付与対象MCの深度入れ替え var id:Number = mc._parent.getNextHighestDepth(); this.stageMC = mc._parent.createEmptyMovieClip( STAGE_MC + id, id ); this.mc.swapDepths( this.stageMC ); } //************************************************************************// // // 処理開始 // //************************************************************************// public function main():Void{ //指定間隔でエフェクト作成 var sc = this; timerID = setInterval( function(){ sc.createEffect(); }, inter ); } //************************************************************************// // // エフェクト作成 // //************************************************************************// private function createEffect():Void{ //残像付与対象MCの現在の形状をキャプチャー var bmp:BitmapData = new BitmapData( mc._width, mc._height, true, 0 ); bmp.draw( mc ); //Bitmap割り当て var id:Number = stageMC.getNextHighestDepth(); var effectMC:MovieClip = stageMC.createEmptyMovieClip( EFFECT_MC + id, id ); effectMC.attachBitmap( bmp, 0 ); //一覧に追加 elist.mc[ id ] = effectMC; elist.bmp[ id ] = bmp; //位置設定 effectMC._x = mc._x; effectMC._y = mc._y; //色設定 var trans:Transform = new Transform( effectMC ); trans.colorTransform = this.clr; //エフェクトを徐々にライトアップし消去 var sc = this; effectMC.onEnterFrame = function(){ //アルファ消去 if( ( this._alpha -= sc.eraze ) > 0 ){ continue; } effectMC.removeMovieClip(); bmp.dispose(); delete sc.elist.mc[ id ]; delete sc.elist.bmp[ id ]; }; } //************************************************************************// // // 破棄処理 // //************************************************************************// public function destroy():Void{ for( var i:String in elist.mc ) elist.mc[i].removeMovieClip(); for( var i:String in elist.bmp ) elist.bmp[i].dispose(); clearInterval( timerID ); //深度を元に戻してから削除 mc.swapDepths( stageMC ); stageMC.removeMovieClip(); } }