topical media & game development

talk show tell print

#graphic-flex-image-effects-08-Flex-BurningMan.ax

#graphic-flex-image-effects-08-Flex-BurningMan.ax [swf] [flash] flex


  package {
  
          import aether.utils.ImageUtil;
  
          import flash.display.Bitmap;
          import flash.display.BitmapData;
          import flash.display.BitmapDataChannel;
          import flash.display.Sprite;
          import flash.events.Event;
          import flash.filters.BlurFilter;
          import flash.filters.DisplacementMapFilter;
          import flash.filters.DisplacementMapFilterMode;
          import flash.filters.GradientGlowFilter;
          import flash.geom.ColorTransform;
          import flash.geom.Point;
  
          [SWF(width=250, height=450, backgroundColor=0x000000)]
  
          
Demonstrates how flames may be dynamically generated from any object. This uses a loaded image that is then recolored and distorted, constantly over time, creating the flame illusion.

  
          public class @ax-graphic-flex-image-effects-08-Flex-BurningMan extends graphic_flex_image_effects_08_Flex_AbstractImageLoader {
  
                  // the rate at which the flames should move
                  private static const FLICKER_RATE:Number = 10;
  
                  private var _flame:BitmapData;
                  private var _perlinNoise:BitmapData;
                  private var _perlinOffsets:Array;
                  private var _perlinSeed:int;
  
                  
Constructor. Sends path of image to load to super class.

  
                  public function @ax-graphic-flex-image-effects-08-Flex-BurningMan() {
                          super("graphic-flex-image-effects-08-assets-man.png");
                  }
  
                  
Called after image loads in super class. This places loaded image, recolors it using a GradientGlowFilter, then sets up the flame and noise properties that will be used in the flame animation. Finally, the handler for the animation is set up.

  
                  override protected function runPostImageLoad():void {
                          _loadedBitmap.x = (stage.stageWidth - _loadedBitmap.width)/2;
                          _loadedBitmap.y = stage.stageHeight - _loadedBitmap.height - 5;
                          // creates flame colors on image using a filter
                          _loadedBitmap.filters = [
                                  new GradientGlowFilter(
                                          0,
                                          45,
                                          [0xFF0000, 0xFFFF00],
                                          [1, 1],
                                          [50, 255],
                                          15,
                                          15
                                  )
                          ];
                          // initializes properties that will be used in the animating
                          makeFlame();
                          makeNoise();
                          addChild(_loadedBitmap);
                          addEventListener(Event.ENTER_FRAME, onSpriteEnterFrame);
                  }
  
                  
Creates the bitmap data that will be used to draw the flames.

  
                  private function makeFlame():void {
                          // flame image is same size as stage, fully transparent
                          _flame = new BitmapData(
                                  stage.stageWidth,
                                  stage.stageHeight,
                                  true,
                                  0x00000000
                          );
                          addChild(new Bitmap(_flame));
                  }
  
                  
Initializes Perlin noise properties that will be used in flame animation.

  
                  private function makeNoise():void {
                          // noise bitmap data is same size as flame bitmap data
                          _perlinNoise = _flame.clone();
                          _perlinSeed = int(new Date());
                          // only one octave requires only one point
                          _perlinOffsets = [new Point()];
                  }
  
                  
Applies the Perlin noise to the bitmap data, offsetting the octave displacement by the FLICKER_RATE each time this method is called.

  
                  private function applyNoise():void {
                          _perlinNoise.perlinNoise(
                                  20,
                                  20,
                                  1,
                                  _perlinSeed,
                                  false,
                                  true,
                                  BitmapDataChannel.RED,
                                  true,
                                  _perlinOffsets
                          );
                          // altering offset contributes to upward animation of flames
                          (_perlinOffsets[0] as Point).y += FLICKER_RATE;
                  }
  
                  
Updates the flame bitmap data each frame, creating the animation.

  
                  private function drawFlame():void {
                          // draw the current stage image into flame at a reduced brightness and alpha
                          _flame.draw(
                                  stage,
                                  null,
                                  new ColorTransform(.9, .9, .9, .7)
                          );
                          // blur drawn image slightly, more on y axis
                          ImageUtil.applyFilter(
                                  _flame,
                                  new BlurFilter(2, 4)
                          );
                          // move the flame image up slightly, creating upward movement of flames
                          _flame.scroll(0, -4);
                          // apply new Perlin noise with altered offset
                          applyNoise();
                          // displacement flame image with updates Perlin noise
                          ImageUtil.applyFilter(
                                  _flame,
                                  new DisplacementMapFilter(
                                          _perlinNoise,
                                          new Point(),
                                          BitmapDataChannel.RED,
                                          BitmapDataChannel.RED,
                                          2,
                                          8,
                                          DisplacementMapFilterMode.CLAMP
                                  )
                          );
                  }
  
                  
Handler for ENTER_FRAME event. Redraws flame.
parameter: event Event dispatched by this sprite.

  
                  private function onSpriteEnterFrame(event:Event):void {
                          drawFlame();
                  }
  
          }
  
  }
  


(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.