达达首页 | 设计教程 | 辅助工具 | 字体字库 | 素材贴图 | 非 主 流 | PS 笔刷 | 签名模版 | 网页模版 | 达达贴吧
设为首页

加入收藏

联系我们
PhotoShop 教程 | Illustrator 教程 | CorelDraw 教程 | FireWorks 教程 | 3D MAX 教程 | MAYA 教程 | Flash 教程 | After Effects 教程
相关教程
普通教程 用Flash 8 制作简单…
普通教程 Flash8制作一个效果…
普通教程 Flash常见动画制作分…
普通教程 Flash制作四种3D隧道…
普通教程 露一小手闪晕你——…
普通教程 Flash8简单制作飞速…
普通教程 Flash制作好看的影片…
普通教程 Flash制作星星写字特…
普通教程 如何在FLASH中实现眨…
普通教程 Flash动画技巧:人侧…
最新更新

Photoshop结合Fla…

Photoshop结合Fla…

Photoshop结合Fla…

Flash绘画技巧:绘…
您现在的位置: 达达派 >> 教程中心 >> FLASH教程 >> 动画篇 >> 教程正文
Flash ActionScript制作真实的火焰
作者:未知 文章来源:网络采集 点击数: 更新时间:2006-6-30 22:15:56
教程录入:carcass    责任编辑:carcass  添加到雅虎收藏+
效果如下:

点击这里下载源文件

  主要代码:

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 );
 }
}

  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    关于我们 | 帮助(?) | 广告服务 | 版权声明 | 商业合作 | 发展历程 | 联系我们

    Copyright ? 2005-2008 CGFancy.com, All Rights Reserved,达达网络:陕ICP备06010337号

    技术交流:71125455(平面)、545534707(三维),业务合作:71125455