package {
    import __AS3__.vec.Vector;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    [SWF(width="550",height="400",backgroundColor="0x0",frameRate="24")]

    public class Astro08 extends Sprite{
        [(source="img/girl.jpg")]
        private var TestImage:Class;
        
        private var img:Bitmap;
        private var spr:Sprite;
        
        //true for mouse down, otherwise false.
        private var flgMouseDown:Boolean;
        
        //true for mouse rollover, otherwise false.
        private var flgMouseOver:Boolean;
        
        //drawTriangles
        private var vertices:Vector.<Number>;
        private var indices:Vector.<int>;
        private var uvts:Vector.<Number>;
        
        //The origin of springing motion
        private var initP:Point;
        
        //Velocities of springing motion
        private var velocities:Vector.<Number> = Vector.<Number>([0,0]);
        
        public function Astro08(){
            img = new TestImage();
            initImage(img.width*0.5,img.height*0.5);
            
            spr.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
            spr.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
            spr.addEventListener(MouseEvent.MOUSE_OVER, onRollOver);
            spr.addEventListener(MouseEvent.MOUSE_OUT, onRollOut);
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
        }
        
        private function initImage(w:Number,h:Number):void{
            initP = new Point(w/2,h/2);
            vertices = Vector.<Number>([0,0, w,0, initP.x,initP.y, w,h, 0,h]);
            indices = Vector.<int>([0,1,2, 1,3,2, 2,3,4, 2,4,0]);
            uvts = Vector.<Number>([0,0, 1,0, 1/2,1/2, 1,1, 0,1]);
            
            //Canvas
            spr = new Sprite();
            spr.x = stage.stageWidth/2 - w/2;
            spr.y = stage.stageHeight/2 - h/2;
            addChild(spr);
            
            spr.graphics.beginBitmapFill(img.bitmapData);
            spr.graphics.drawTriangles(vertices,indices,uvts);
        }
        
        private function onEnterFrame(e:Event):void{
            const SPRING:Number = 0.9;
            const FRICTION:Number = 0.8;
            
            spr.graphics.clear();
            
            if(flgMouseDown && flgMouseOver){
                vertices[4] = spr.mouseX;
                vertices[5] = spr.mouseY;
            }
            else{
                //Springing motion
                var dx:Number = initP.x - vertices[4];
                var ax:Number = dx*SPRING;
                velocities[0] += ax;
                velocities[0] *= FRICTION;
                vertices[4] += velocities[0];
                
                var dy:Number = initP.y - vertices[5];
                var ay:Number = dy*SPRING;
                velocities[1] += ay;
                velocities[1] *= FRICTION;
                vertices[5] += velocities[1];
            }
            
            spr.graphics.beginBitmapFill(img.bitmapData);
            spr.graphics.drawTriangles(vertices,indices,uvts);
        }
        
        private function onMouseDown(e:MouseEvent):void{
            flgMouseDown = true;
        }
        
        private function onMouseUp(e:MouseEvent):void{
            flgMouseDown = false;
        }
        
        private function onRollOver(e:MouseEvent):void{
            flgMouseOver = true;
        }
        
        private function onRollOut(e:MouseEvent):void{
            flgMouseOver = false;
        }
    }
}
Powered by blog Boreal Kiss 2008.