超真实火焰效果,纯AS,奉上源文件! ! !

本来想回复 "超酷蜡烛效果 高手解析一下"这个主题的,后来想想还是另开一个主题吧,干净些

效果跟sxnow给的那个网址基本差不多,代码稍稍有点长。//声明:不是我写的

效果查看:http://www.healdream.com/blog/upload/fire.swf

主文件代码

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

源文件下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值