DynamicStack

by shohei909
1時間でカッコいいViewStack作る. LIVE CODING 2010/07/30 22:14-24:25
ひとまず完成,結局2時間くらいかかってしまった。
複数のDisplayObjectをEffectつきで切り替え表示できる
DynamicStackクラスを作成しました。
クリックで写真が切り替わります。
エフェクトの追加は割と簡単にできるようになっているので、
ちょこちょこやってくつもりです。
特徴とか
複数のエフェクトを重ねてつかうことができる。
ボタンなどを含んだSpriteにもつかえるはず(未テスト)
画像はこちらからお借りしました。
http://sozai-free.com/
♥2 | Line 120 | Modified 2010-08-01 11:18:14 | MIT License | (replaced)
play

Related images

ActionScript3 source code

/**
 * Copyright shohei909 ( http://wonderfl.net/user/shohei909 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/pb4T
 */

//1時間でカッコいいViewStack作る. LIVE CODING 2010/07/30 22:14-24:25
//ひとまず完成,結局2時間くらいかかってしまった。



//複数のDisplayObjectをEffectつきで切り替え表示できる
//DynamicStackクラスを作成しました。
//クリックで写真が切り替わります。

//エフェクトの追加は割と簡単にできるようになっているので、
//ちょこちょこやってくつもりです。


//特徴とか
//複数のエフェクトを重ねてつかうことができる。
//ボタンなどを含んだSpriteにもつかえるはず(未テスト)




//画像はこちらからお借りしました。
//http://sozai-free.com/

package {
    import flash.system.LoaderContext;
    import flash.events.Event;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.net.URLRequest;
    [SWF(width=465, height=465, backgroundColor=0x000000)]
    public class FlashTest extends Sprite {
        private var imgUrl:Array = ["http://assets.wonderfl.net/images/related_images/c/ce/cee8/cee894fed3be286c32b3af4b9ab5788a2809dec9",
                                "http://assets.wonderfl.net/images/related_images/3/39/392f/392fec0c0f2e35cb9a92c74df45b259c3b9f17ff",
                                "http://assets.wonderfl.net/images/related_images/b/b4/b4f1/b4f1fc75b232a258ee294a3cbc838360f64a5a7d"
                                ];
        private var images:Array = [];
        private var count:int = 0;
        private var stack:DynamicStack = new DynamicStack(400,400);
        public function FlashTest():void {
            // 画像読み込み
            for(var i:int=0;i<imgUrl.length;i++){
                images[i] = new Loader();
                images[i].load( new URLRequest(imgUrl[i]), new LoaderContext(true));
                stack.addStack(images[i]);
            }
            addChild(stack);
            stage.addEventListener("mouseDown",onClick);
        }
        
       public function onClick(e:Event):void{
            count++;
            if(count>=imgUrl.length){count=0}
            var d:Array = DynamicStack.EFFECT_NAME;
            stack.removeEffect(0,-1);
            stack.addEffect( d[int( Math.random()*d.length)] );
            
            //二重エフェクト
            if(Math.random()<0.2){ stack.addEffect( d[int( Math.random()*d.length)] ) };
            stack.display(count); 
        }
    }
}

import flash.filters.*;
import flash.geom.*;
import flash.events.Event;
import flash.display.*;

class DynamicStack extends Sprite{
    private var w:int,h:int;
    private var transMap:BitmapData; 
    private var bitmap:Bitmap;
    private var maskMap:Bitmap = new Bitmap(new BitmapData(1,1));
    private var children:Vector.<DisplayObject> = new Vector.<DisplayObject>();
    private var _selectedChild:int = 0;
    private var effects:Vector.<Object> = new Vector.<Object>();
    private var time:int = 0;
    private var maxTime:int = 0;
    private var center:Point;
    public static const EFFECT_NAME:Array = ["fade","zoomOut","spin","slide","blur","color","flash"];
    public static const EFFECT_DATA:Array = [
        {name:"normal",type:"matrix",time:0,matrix:new Matrix() },
        {name:"fade",type:"matrix",time:30,matrix:new Matrix()  },
        {name:"zoomOut",type:"matrix",time:30,matrix:new Matrix(0.8,0,0,0.8) },
        {name:"spin",type:"matrix",time:30,matrix:new Matrix(0.98,-0.02,0.02,0.98) },
        {name:"slide",type:"matrix",time:30,matrix:new Matrix(1,0,0,1,-2,0) },
        {name:"blur",type:"filter",time:30,filter:new BlurFilter() },
        {name:"color",type:"filter",time:30,filter:new ColorMatrixFilter([0.8,0.2,0,0,10, 0,0.8,0.2,0,10, 0.2,0,0.8,0,10, 0,0,0,1,0]) },
        {name:"flash",type:"filter",time:30,filter:new ColorMatrixFilter([0.4,0.6,0,0,5, 0,0.3,0.8,0,5, 0.8,0,0.1,0,5, 0,0,0,1,5]) }
    ];
    public function DynamicStack(w:int,h:int):void{
        transMap = new BitmapData(w,h,true,0x01AAAAAA);
        bitmap =  new Bitmap(new BitmapData(w,h,true,0x0));
        bitmap.visible = false; super.addChild(bitmap);
        addEventListener("enterFrame",onFrame);
        super.addChild(maskMap); maskMap.scaleX = w; maskMap.scaleY = h;  mask = maskMap;
    }
    public function addStack(obj:DisplayObject):DisplayObject{
        children.push(obj); addChildAt(obj,0); obj.visible = false;
        return obj;
    }
    public function display(index:int):DisplayObject{
        children[_selectedChild].visible = false;
        var size:int = effects.length;
        time = 0;
        for(var i:int=0;i<size;i++){ time += effects[i].time; }
        maxTime = time;
        if(time>0){ 
            bitmap.visible = true;
            var b:BitmapData = bitmap.bitmapData;
            b.fillRect(b.rect,0);
            b.draw( children[_selectedChild] );
        }
        _selectedChild = index;
        return children[index];
    }
    
    //エフェクトの追加
    public function addEffect(effectName:String="normal"):void{ effects.push(effect(effectName)); }
    //エフェクトの削除 (index から lengthの数だけ削除, ただし、length=-1で以降全て削除)
    public function removeEffect(index:int=0,length:int=1):Object{ return effects.splice(index, length) }
    
    //オブジェクトを渡して、エフェクトを追加します。
    public function addEffectObject(effect:Object):void{ effects.push(effect) }
    
    //指定された名前のEffectを返します
    static public function effect(effectName:String="normal"):Object{ return EFFECT_DATA[EFFECT_NAME.indexOf(effectName)+1]; }
    
    //matrixタイプのEffectを作ってかえします
    static public function matrixEffect(matrix:Matrix,time:int=40):Object{ return { name:"fade",type:"matrix",time:time,matrix:matrix } }
    //filterタイプのEffectを作ってかえします
    static public function filterEffect(filter:BitmapFilter,time:int=40):Object{ return { name:"fade",type:"filter",time:time,filter:filter } }
    
    private function onFrame(e:Event=null):void{
        if(_selectedChild>=0 && _selectedChild<children.length){
            var b:BitmapData = bitmap.bitmapData;
            children[_selectedChild].visible = true;
            var size:int = effects.length;
            if(time>0){
                b.lock();
                for(var i:int=0;i<size;i++){
                    switch(effects[i].type){
                         case "matrix":
                             b.draw(b,effects[i].matrix);
                             break;
                         case "filter":
                             b.applyFilter(b,b.rect,new Point,effects[i].filter);
                    }
                    var r:uint = (1- time / maxTime)*256;
                    b.merge(transMap,b.rect,new Point(),r,r,r,r);
                    time--;
                }
                b.unlock();
            }
        }
        if(time==0){
            bitmap.visible = false;
        }
    }
}