Flash ActionScript制作真實的火焰_Flash教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:Flash8設置及獲取Cookies值
      最新開發的項目需要到了,正好寫下來。//設置Cookies參數local_data=SharedObject.getLocal(user_data);local_data.data.user_name=JohnSmith;l

      效果如下:

      點擊這里下載源文件

        主要代碼:

      import flash.display.*;
      import flash.filters.*;
      import flash.geom.*;
      import de.popforge.bitmap.Shape;
      Shape.setContainer( this.createEmptyMovieClip( 'shapes', 10000 ) );
      //-- get blue circle as a bitmap
      var blueSpotClip: MovieClip = attachMovie( "blueSpot", "blueSpotClip", 0 );
      var clipBounds: Object = blueSpotClip.getBounds();
      var blueSpot: BitmapData = new BitmapData( clipBounds.xMax, clipBounds.yMax, true, 0 );
      blueSpot.draw( blueSpotClip, new Matrix() );
      blueSpotClip.removeMovieClip();
      //-- involved bitmaps
      var source: BitmapData = new BitmapData( 256, 256, false, 0 );
      var output: BitmapData = new BitmapData( 256, 256, false, 0 );
      var buffer: BitmapData = new BitmapData( 256, 256, false, 0 );
      var bounds: Rectangle = new Rectangle( 0, 0, 256, 256 );
      var origin: Point = new Point();
      var matrix: Matrix = new Matrix();
      //-- creating a gradient with fire colors
      import de.popforge.bitmap.Gradient;
      var firePalette: Array = Gradient.fillArray
      (
      [ 0, 0xA20000, 0xFFF122, 0xFFFFFF, 0xF8FF1B, 0xC53C05, 0 ],
      [ 0, 50, 50, 100, 75, 25, 0 ],
      [ 0, 64, 132, 186, 220, 250, 255 ]
      );
      //-- Filter to let the flame grow
      var flame: ConvolutionFilter = new ConvolutionFilter( 3, 3, null, 2.7, -2 );
      attachBitmap( output, 0, false, false );
      var ms: Number = getTimer();
      var frame: Number = 0;
      onMouseMove = function()
      {
      //-- create burning area
      var mouse: Point = new Point( _xmouse - clipBounds.xMax/2, _ymouse - clipBounds.yMax/2 );
      source.copyPixels( blueSpot, new Rectangle( 0, 0, clipBounds.xMax, clipBounds.yMax ), mouse );
      }
      onEnterFrame = function()
      {
      //-- create burning area
      var mouse: Point = new Point( _xmouse - clipBounds.xMax/2, _ymouse - clipBounds.yMax/2 );
      source.copyPixels( blueSpot, new Rectangle( 0, 0, clipBounds.xMax, clipBounds.yMax ), mouse );
      //-- the flames matrix with some randoms to expand the flame sidewards
      var flameMatrix: Array = [ 0, 0, 0, 0, 0.2, 0, 0, 1.6, 0 ];
      flameMatrix[3] = Math.random() * .001;
      flameMatrix[5] = Math.random() * .001;
      flameMatrix[6] = .4 Math.random() * .1;
      flameMatrix[8] = .4 Math.random() * .1;
      flame.matrix = flameMatrix;
      //-- applying the filter 3 times to increase the flame speed
      //-- compute the affected region by "generateFilterRect", "getColorBoundsRect"
      var area: Rectangle = source.generateFilterRect( source.getColorBoundsRect( 0xFF, 0, false ), flame );
      source.applyFilter( source, area, area.topLeft, flame );
      area = source.generateFilterRect( area, flame );
      source.applyFilter( source, area, area.topLeft, flame );
      area = source.generateFilterRect( area, flame );
      source.applyFilter( source, area, area.topLeft, flame );
      //-- remap the the flame bitmap with fire colors
      output.paletteMap( source, area, area.topLeft, null, null, firePalette );
      //-- fps
      if( getTimer() - 1000 > ms )
      {
      ms = getTimer();
      fps = frame;
      fpsDisplay.text = fps.toString();
      frame = 0;
      }
      else
      {
      frame ;
      }
      }
      var mouseDown: Boolean = false;
      onMouseDown = function()
      {
      mouseDown = true;
      }
      onMouseUp = function()
      {
      onEnterFrame();
      mouseDown = false;
      }
      createTextField( "fpsDisplay", 99, 0, 0, 60, 20 );
      fpsDisplay.textColor = 0xffffff;
      fpsDisplay.selectable = false;

      對應的AS代碼:Gradient.as

      import de.popforge.bitmap.Shape;

      import flash.display.BitmapData;
      import flash.geom.ColorTransform;
      import flash.geom.Matrix;

      class de.popforge.bitmap.Gradient
      {
      public static function createXYGradient(): BitmapData
      {
      /*
      * get canvas
      */
      var g: Shape = Shape.get();

      if( g == null )
      {
      return null;
      }

      var xyGradient: BitmapData = new BitmapData( 256, 256, false, 0 );

      var matrix: Matrix = new Matrix();

      /*
      * create y as blue colorvalues
      */

      matrix.createGradientBox( 256, 256, Math.PI/2, 0, 0 );

      g.beginGradientFill( 'linear', [ 0, 0x0000ff ], [ 100, 100 ], [ 0, 0xff ], matrix );
      g.moveTo( 0, 0 );
      g.lineTo( 256, 0 );
      g.lineTo( 256, 256 );
      g.lineTo( 0, 256 );
      g.lineTo( 0, 0 );
      g.endFill();

      matrix.identity();
      xyGradient.draw( g, matrix );

      g.clear();

      /*
      * create x as green colorvalues
      */

      matrix.createGradientBox( 256, 256, 0, 0, 0 );

      g.beginGradientFill( 'linear', [ 0, 0x00ff00 ], [ 100, 100 ], [ 0, 0xff ], matrix );
      g.moveTo( 0, 0 );
      g.lineTo( 256, 0 );
      g.lineTo( 256, 256 );
      g.lineTo( 0, 256 );
      g.lineTo( 0, 0 );
      g.endFill();

      matrix.identity();
      xyGradient.draw( g, matrix, null, 'add' );

      g.removeMovieClip();

      return xyGradient;
      }

      public static function createDisplacementMapFromMidMap( midmap: BitmapData ): BitmapData
      {
      var displace: BitmapData = createXYGradient();

      if( displace == null )
      {
      return null;
      }

      var colorTransform: ColorTransform = new ColorTransform();
      var m: Matrix = new Matrix();
      colorTransform.greenMultiplier = .5;
      colorTransform.blueMultiplier = .5;
      displace.draw( displace, m, colorTransform );
      colorTransform.greenOffset = 128;
      colorTransform.blueOffset = 128;
      displace.draw( midmap, m, colorTransform, 'difference' );

      return displace;
      }

      /*
      * returns an array with 32bit colorvalues
      * usefull to remap a bitmap using 'paletteMap'
      */

      public static function fillArray( colors: Array, alphas: Array, ratios: Array ): Array
      {
      var g: Shape = Shape.get();

      if( g == null )
      {
      return null;
      }

      var array: Array = new Array;

      var m: Matrix = new Matrix();

      m.a = m.d = .15625;
      m.b = m.c = 0;
      m.tx = m.ty = 128;

      g.beginGradientFill( 'linear', colors, alphas, ratios, m );
      g.moveTo( 0, 0 );
      g.lineTo( 256, 0 );
      g.lineTo( 256, 1 );
      g.lineTo( 0, 1 );
      g.lineTo( 0, 0 );
      g.endFill();

      var bmp: BitmapData = new BitmapData( 256, 1, true, 0 );

      m.identity();

      bmp.draw( g, m );

      g.removeMovieClip();

      var x: Number = 256;

      while( --x > -1 )
      {
      array[x] = bmp.getPixel32( x, 0 );
      }

      return array;
      }
      }

      shap.as

      import flash.display.BitmapData;
      class de.popforge.bitmap.Shape extends MovieClip
      {
      static var id: String = '__Packages.de.popforge.bitmap.Shape';

      static private var container: MovieClip;

      static public function setContainer( container: MovieClip ): Void
      {
      Shape.container = container;
      Object.registerClass( id, Shape );
      }

      static public function get(): Shape
      {
      if( container == undefined )
      {
      trace( 'ERROR: No container is defined. Call Shape.setContainer( timeline: MovieClip );' );
      return null;
      }

      var d: Number = container.getNextHighestDepth();

      return Shape( container.attachMovie( id, d.toString(), d ) );
      }

      public function rasterize( target: BitmapData ): Void
      {
      target.draw( this );
      }
      }

      分享:Flash繪畫技巧:藍色人物繪制教程
      首先跟各位說一聲不才,咱們的網站處處藏龍臥虎,藍色的這個教程,在各位看來只能是班門弄斧,只希望可以拋磚引玉,貽笑大方之行請各位一定諒解!開始進入教程

      來源:設計前沿收集整理//所屬分類:Flash教程/更新時間:2008-03-05
      相關Flash教程