package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.geom.Point; import flash.text.TextField; import flash.utils.Timer; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.Cubic; import org.libspark.betweenas3.tweens.ITween; [SWF( frameRate="60" )] public class test_genie extends Sprite { [Embed( source="assets/image2.jpg" )] private var img: Class; private var bitmap: Bitmap; private var bitmapData: BitmapData; private var points: Vector.<Vector.<Point>>; private var segments: int = 30; private var sprite: Sprite; private var vertex: Vector.<Number>; private var indices: Vector.<int>; private var uvdata: Vector.<Number>; public function test_genie() { addEventListener( Event.ADDED_TO_STAGE, onAddedToStage ); } private function draw( e: Event = null ): void { vertex.length = 0; indices.length = 0; uvdata.length = 0; var k: int = 0; var tf: TextField; var mx: Number = Math.max( 0, Math.min( bitmapData.width, sprite.mouseX )); var my: Number = Math.max( 0, Math.min( bitmapData.height, sprite.mouseY )); var mouse: Point = new Point( mx, my ); var maxdist: Number = Math.sqrt(( bitmapData.width * bitmapData.width ) + ( bitmapData.height * bitmapData.height )); var center: Point = new Point( bitmapData.width / 2, bitmapData.height / 2 ); var npoint: Point; center = mouse; for ( var x: int = 0; x < points.length; x++ ) { var pt: Point; for ( var y: int = 0; y < points[x].length; y++ ) { pt = points[x][y].clone(); var uvx: Number = x / segments; var uvy: Number = y / segments; vertex.push( pt.x ); vertex.push( pt.y ); if ( y < segments ) indices.push( k, k + segments + 1, k + 1, k + segments + 1, k + segments + 2, k + 1 ); uvdata.push( uvx, uvy ); ++k; } } sprite.graphics.clear(); sprite.graphics.beginBitmapFill( bitmapData, null, false, false ); sprite.graphics.drawTriangles( vertex, indices, uvdata ); sprite.graphics.endFill(); } private function onAddedToStage( event: Event ): void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; this.x = this.y = 20; bitmap = new img() as Bitmap; bitmapData = bitmap.bitmapData; addChild( sprite = new Sprite()); test(); } private function onClick(event: Event ):void { var point: Point; var tweens: Array = []; var mpoint: Point = new Point( this.mouseX, this.mouseY ); var k: int = 0; var delay: Number; for ( var y: int = segments; y >= 0; y-- ) { for ( var x: int = 0; x < segments + 1; x++ ) { point = points[x][y]; delay = ( k/1000 ) + ( x/1000 ); tweens.push( BetweenAS3.delay( BetweenAS3.tween( points[x][y], { x: mpoint.x, y: mpoint.y }, null, 0.4, org.libspark.betweenas3.easing.Cubic.easeIn ), delay / 2 ) ); ++k; } } var itw: ITween = BetweenAS3.parallelTweens( tweens ); itw.onComplete = onTweenComplete; itw.play(); } private function onTweenComplete(): void { var t: Timer = new Timer( 500, 1 ); t.addEventListener( TimerEvent.TIMER_COMPLETE, test, false, 0, true ); t.start(); } private function test( event: Event = null ): void { stage.addEventListener( MouseEvent.CLICK, onClick ); points = new Vector.<Vector.<Point>>(); vertex = new Vector.<Number>(); indices = new Vector.<int>(); uvdata = new Vector.<Number>(); for ( var x: int = 0; x < segments + 1; x++ ) { points[x] = new Vector.<Point>(); var px: Number = ( x / segments ) * bitmapData.width; for ( var y: int = 0; y < segments + 1; y++ ) { var py: Number = ( y / segments ) * bitmapData.height; points[x][y] = new Point( px, py ); } } draw(); addEventListener( Event.ENTER_FRAME, draw ); } } }