//完整的代码看附件吧
//初始化函数,建立对象等
private function initialize():Void
{
particles = new Array();
mBitmapData = new BitmapData(width,height+20,false,0x00000000);//这个BitmapData用来生成一个波纹的位图,具体如何生成后面有
mPerlinBitmapData = new BitmapData(width,20,false,0x00000000);//这是一个存放Perlin杂色的位图,不知道什么是Perlin可以看Flash自带的文档,经然后由他的Bio
mSmokingBitmapData = BitmapData.loadBitmap("queen")//背景图像MC
mSmokingClip = viewPort.createEmptyMovieClip("queen",1);
mSmokingClip.attachBitmap(mSmokingBitmapData,1,"auto",false);
mSmokingClip.blendMode = 13;//将他的渲染模式设置为13也就是Overlay模式,也可以当作光照模式,具体可以看Flash自带的介绍
viewPort.scrollRect = new Rectangle(0,0,width,height);
mRectangle = new Rectangle(0,0,width,height);
mPoint_1 = new Point(0,0);
mPoint_2 = new Point(0,0);
viewPort.attachBitmap(mBitmapData, 0, "auto", false);//将mBitmapData放到舞台上,因为前面背景的渲染模式是Overlay,所以就带来了一种光照+反光的效果,非常逼真的波光
mMatrix = new Matrix();
mMatrix.translate(0,height-20);
mBlur = new BlurFilter(4,4,3);//一个模糊滤镜,用来为生成波纹位图服务
}
public function onEnterFrame():Void
{
//以下主要就是如何生成连续的波纹位图的代码
mPoint_1.x += 1;
mPoint_1.y += .5;
mPoint_2.x += 5;
mPoint_2.y += 2;//这些都是为生成连续Perlin 杂点服务的
mPerlinBitmapData.perlinNoise(width/2,10,2,12345,false,true,1,true,[mPoint_1, mPoint_2]);//生成杂点函数
mBitmapData.draw(mPerlinBitmapData,mMatrix);//将杂点画在上一个波纹位图最底端,作为新的激荡点
mBitmapData.applyFilter(mBitmapData, mRectangle, new Point(0,-5), mBlur);//使用前面的那个模糊滤镜,主要模拟波纹扩散的效果
mDisplacement = new DisplacementMapFilter(mBitmapData, new Point(0,0), 1,1,0,-40,"color",0x000000,100);//用这张波纹位图创建一个DisplacementMapFilter,用来产生折射效果
mSmokingClip.filters = [mDisplacement];//套用这个折射效果
}
//之后每进入一帧都重复此过程,这样就出现了一系列连续的波纹位图。主要思路就是使用DisplacementMapFilter来带来折射效果,并且使用Overlay来模拟波光的效果。效果及其真实,和网友共勉。
图片附件: [scrShot]
scr.PNG 附件:
smoke.zip