topical media & game development

talk show tell print

#graphic-flex-image-effects-12-Flex-AetherKaleidoscope.ax

#graphic-flex-image-effects-12-Flex-AetherKaleidoscope.ax [swf] [flash] flex


  package {
  
          import aether.effects.carnival.KaleidoscopeEffect;
  
          import flash.display.Bitmap;
          import flash.display.BitmapData;
          import flash.display.Loader;
          import flash.display.LoaderInfo;
          import flash.display.Sprite;
          import flash.events.Event;
          import flash.events.MouseEvent;
          import flash.geom.Matrix;
          import flash.net.FileFilter;
          import flash.net.FileReference;
  
          [SWF(width=500, height=500, backgroundColor=0xCCCCCC)]
  
          
Shows how kaleidoscope effect can be achieved with aether effect. This also animates the effect so that the kaleidoscope spins automatically.

  
          public class @ax-graphic-flex-image-effects-12-Flex-AetherKaleidoscope extends Sprite {
  
                  // number of segments in kaleidoscope
                  private static const NUM_SEGMENTS:uint = 8;
  
                  private var _file:FileReference;
                  private var _originalImage:BitmapData;
                  private var _kaleidoscope:Bitmap;
                  private var _angle:Number;
  
                  
Constructor. This sets up a listener for when the stage is clicked.

  
                  public function @ax-graphic-flex-image-effects-12-Flex-AetherKaleidoscope() {
                          stage.addEventListener(MouseEvent.CLICK, onStageClick);
                  }
  
                  
Applies the kaleidoscope effect to clone of original loaded image.

  
                  private function applyEffect():void {
                          // clone original so that it remains undistorted
                          var clone:BitmapData = _originalImage.clone();
                          // apply effect with current angle value to clone
                          new KaleidoscopeEffect(NUM_SEGMENTS, _angle).apply(clone);
                          _kaleidoscope.bitmapData.dispose();
                          _kaleidoscope.bitmapData = clone;
                  }
  
                  
Handler for when stage is clicked. This opens file browse dialog.
parameter: event Event dispatched by stage.

  
                  private function onStageClick(event:MouseEvent):void {
                          _file = new FileReference();
                          _file.addEventListener(Event.SELECT, onFileSelect);
                          _file.browse([new FileFilter("Images", "*.jpg;*.jpeg;*.gif;*.png")]);
                  }
  
                  
Handler for when a file is selected. Loads file.
parameter: event Event dispatched by FileReference.

  
                  private function onFileSelect(event:Event):void {
                          stage.removeEventListener(MouseEvent.CLICK, onStageClick);
                          _file.addEventListener(Event.COMPLETE, onImageLoadComplete);
                          _file.load();
                  }
  
                  
Handler for when local image completes loading. This loads bytes into Loader for access.
parameter: event Event dispatched by FileReference.

  
                  private function onImageLoadComplete(event:Event):void {
                          var loader:Loader = new Loader();
                          loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLocalFileRead);
                          loader.loadBytes(_file.data);
                  }
  
                  
Handler for when bytes from local file are read into Loader. This kicks off the effect with the loaded image and sets up an ENTER_FRAME listener so that the effect may be animated.
parameter: event Event dispatched by LoaderInfo.

  
                  private function onLocalFileRead(event:Event):void {
                          var loaderInfo:LoaderInfo = event.target as LoaderInfo;
                          // add initial image to stage
                          _kaleidoscope = loaderInfo.content as Bitmap;
                          addChild(_kaleidoscope);
                          var width:Number = stage.stageWidth;
                          var height:Number = stage.stageHeight;
                          // will be used to save reference to original image, scaled to stage
                          _originalImage = new BitmapData(width, height);
                          var bitmapData:BitmapData = _kaleidoscope.bitmapData;
                          var matrix:Matrix = new Matrix();
                          // scale loaded image to stage size
                          matrix.scale(width/bitmapData.width, height/bitmapData.height);
                          _originalImage.draw(bitmapData, matrix);
                          _angle = 0;
                          // apply initial effect
                          applyEffect();
                          addEventListener(Event.ENTER_FRAME, onSpriteEnterFrame);
                  }
  
                  
Handler for ENTER_FRAME. This updates current angle of effect and reapplies effect.
parameter: event Event dispatched by this sprite.

  
                  private function onSpriteEnterFrame(event:Event):void {
                          _angle += 1;
                          applyEffect();
                  }
  
          }
  
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.