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教程