package {
    /*
    * Requires Flex SDK 3.0.1 or later to be compiled.
    */
    import flash.display.Bitmap;
    import flash.display.Shader;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.filters.ShaderFilter;
    import flash.utils.Timer;

    [SWF(width="550",height="400",backgroundColor="0x0",frameRate="24")]
    
    public class PB04 extends Sprite{
        //Photo
        [(source="data/twitter_250.png")]
        private var TestImage:Class;
        
        //Pixel Bender Filter data in the binary form.
        [(source="data/twirl.pbj", mimeType="application/octet-stream")]
        private var PbjObject:Class;
        
        private var img:Bitmap;
        private var shader:Shader;
        private var filter:ShaderFilter;
        private var flgClick:Boolean;
        
        public function PB04(){
            //Photo
            img = new TestImage();
            img.x = stage.stageWidth/2 - img.width/2;
            img.y = stage.stageHeight/2 - img.height/2;
            addChild(img);
            
            //Button wrapping the image (invisible)
            var btn:Sprite = new Sprite();
            btn.buttonMode = true;
            btn.graphics.beginFill(0x0,0);
            btn.graphics.drawRect(img.x,img.y,img.width,img.height);
            btn.graphics.endFill();
            addChild(btn);
            
            //Pixel Bender Filter "twirl"
            shader = new Shader(new PbjObject());
            shader.data["center"]["value"] = [125,125];
            shader.data["radius"]["value"] = [80];
            shader.data["twirlAngle"]["value"] = [0];
            filter= new ShaderFilter(shader);
            img.filters = [filter];
            
            btn.addEventListener(MouseEvent.CLICK,onClick);
        }
        
        private function onClick(e:MouseEvent):void{
            if (!flgClick){
                const FREQENCY:int = 10;
                const THETA_MAX:Number = Math.PI/2;
                const AMPLITUDE:Number = 2*(Math.random()-0.5)*360;
                var tick:Number = 0;
                var timer:Timer = new Timer(20,FREQENCY);
                timer.addEventListener(TimerEvent.TIMER,changeAngle);
                timer.start();
                flgClick = true;
            }
            
            function changeAngle(e:TimerEvent):void{
                tick += THETA_MAX/FREQENCY;
                shader.data["twirlAngle"]["value"] = [AMPLITUDE*Math.cos(tick)];
                img.filters = [filter];
                e.updateAfterEvent();
                if (tick >= THETA_MAX){
                    flgClick = false;
                }
            }
        }
    }
}
Powered by blog Boreal Kiss 2008.