package { import flash.display.*; import flash.events.*; import flash.filters.*; import flash.geom.*; import flash.net.*; import flash.text.*; import flash.utils.*; import jp.progression.core.commands.*; import jp.progression.commands.*; import caurina.transitions.Equations; public class MainDisplay extends Sprite { public function MainDisplay() { var loading :TextField = new TextField(); loading.text ="loading"; loading.width = 400; loading.alpha = 0; var imgurl:URLRequest= ProxyRequest.get( "http://level0.kayac.com/images/doke/oshiruko.png" ); var loader :Loader = new Loader(); var canvas:Sprite = this; var command:CommandList = new SerialList( null, //ローディング表示 new AddChild( this, loading ), new DoTweener( loading, { alpha:1, time:1 } ), // ロード開始 new LoadObject( loader, imgurl ), // ローディング非表示 new DoTweener( loading , { alpha:0, time:1 } ), new RemoveChild( this, loading ), // ローディング非表示 function ():void { var origin:BitmapData = Bitmap( loader.content ).bitmapData as BitmapData; var mapBmp:BitmapData = new FilterMap( origin.width, origin.height ); //読み込んだ画像をエフェクトクラスに突っ込んでTweenさせる var effect:Effect = new ThresholdEffect( origin, mapBmp ); var tx:int= ( canvas.stage.stageWidth-origin.width)*0.5; var ty:int= ( canvas.stage.stageHeight-origin.height)*0.5; this.parent.insertCommand( new Prop( effect, { x:tx, y:ty } ), new AddChild( canvas , effect ), new DoTweener( effect, { percent:1, time:2, transition: Equations.easeInCubic } ) ); } ); command.execute(); } } } import flash.errors.IllegalOperationError; import flash.events.*; import flash.display.*; import flash.geom.*; import flash.net.*; import flash.system.*; //-------------------------------------- // エフェクト本体(Templateパターン) //-------------------------------------- class Effect extends Sprite { private var _origin:BitmapData; private var _output:BitmapData; private var _effect:BitmapData; public function Effect( origin:BitmapData, output :BitmapData = null ) { _origin = origin; _output = output ? output : new BitmapData( _origin.width, _origin.height, true, 0x0 ); addChild( new Bitmap( _output ) ); } protected var _percent:Number = 0; public function get percent():Number { return _percent; } public function set percent(value:Number):void { _percent = value; _updateEffect(); } private function _updateEffect():void{ _effect = _origin.clone(); updateEffect(_effect); _output.draw( _effect ); } // ここでエフェクト処理を何かする。 protected function updateEffect( effect:BitmapData ):void{ new IllegalOperationError("updateEffectはOverrideする必要があります。"); } } //-------------------------------------- // エフェクト本体 //-------------------------------------- class ThresholdEffect extends Effect { private var _mapBmp:BitmapData; private static const START_PARAM:uint = 0x00; private static const END_PARAM:uint = 0xFF; public function ThresholdEffect( origin:BitmapData, mapBmp:BitmapData, output:BitmapData = null ) { super( origin, output ); _mapBmp = mapBmp; } // パーセント値に応じてエフェクトをアップデート protected override function updateEffect( effect :BitmapData ):void { var threshold:uint = Math.round( Number( END_PARAM - START_PARAM) * _percent ); effect.threshold( _mapBmp, _mapBmp.rect, new Point(), ">=",threshold, 0x00, 0xFF ); } } //-------------------------------------- // エフェクト用のフィルタBitmapData //-------------------------------------- class FilterMap extends BitmapData { public function FilterMap( w:int, h:int ) { super( w, h, false, 0x0 ); var map:Shape = new Shape(); var gMat:Matrix = new Matrix(); gMat.createGradientBox( w, h, -45 ); map.graphics.beginGradientFill( GradientType.LINEAR, [ 0x000000, 0xFFFFFF ], [ 1.0, 1.0 ], [ 0, 255 ], gMat ); map.graphics.drawRect( 0, 0, w, h ); map.graphics.endFill(); var rnd:int = Math.round(Math.random() * 65432); this.perlinNoise( width/6, height/6, 24, rnd, true, true, 1, true ); draw( map, null, null, BlendMode.MULTIPLY ); } } //-------------------------------------- // Proxy経由のURL生成 //-------------------------------------- class ProxyRequest { public static const PROXY:String = "http://5ivestar.org/proxy/"; public static const CROSSDOMAIN:String = "http://5ivestar.org/proxy/crossdomain.xml"; public var onComplete:Function; public static function get( imagePath:String ) :URLRequest{ Security.loadPolicyFile(CROSSDOMAIN); return new URLRequest( PROXY+imagePath ); } } //-------------------------------------- // ロードコマンド(がなぜかかなったので) //-------------------------------------- import jp.progression.core.commands.*; class LoadObject extends Command { private var _loader:Loader; private var _url:URLRequest; public function LoadObject( loader:Loader, url:URLRequest, initObject:Object = null ){ super( _execute, _interrupt, initObject ); _loader= loader; _url = url; } private function _execute():void { //executeComplete(); _loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onLoadComplete ); _loader.load( _url ); } private function onLoadComplete( e:Event ):void { executeComplete(); } private function _interrupt():void { interruptComplete(); } } TransitionEffect