用Flash制作烟火效果
网络与通信
大家在制作Flash动画的时候为了表现情节,渲染气氛,难免会遇到很多特殊效果的制作。下面我就结合自己的经验来谈谈如何制作烟火效果。
制作原理
利用Photoshop或者其他位图工具制作出一张静态的烟雾(或火焰)图片,在Fireworks中对图片进行加工,将它处理为透明的PNG格式图片,再将该图导入到Flash中做最后的处理。
实现步骤
下面我们先使用Photoimpact 6.0进行制作,在Photoimpact中新建200×200背景色为黑色的新文件(如(图1)),在百宝箱中选择Partical gallery→fire,右键单击想要的效果,在弹出菜单中选择Modify properties and apply,打开Partical面板,在这里我们可以调整火焰的属性,将Density调整为1,点击OK。选取File→save as保存图片,并选择保存文件格式为PSD格式。

再新建文件,在“百宝箱”中选择Partical gallery→smoke,右键单击想要的效果,在弹出菜单中选择Modify properties and apply,打开Partical面板,在这里我们可以调整烟雾的属性,将Density调整为18,点击OK。File→save as保存图片,并选择保存文件格式为PSD格式。
在Fireworks中打开火焰的图片,使用魔术棒工具(magic wand tool)选择黑色的背景色,按Del键删除。Files→save保存图形,选择格式为PNG格式,使用同样的方法处理好烟雾的图片。最后打开Flash,File→new新建文件,“Modify→movie”在弹出的Movie proporties面板中设置文件高200,宽200,背景色为黑色,File→import将图导入。Insert→symbol新建元件命名为“烟”,Windows→library打开Library面板,将烟图片拖曳到“烟”元件中,Windows→pannel→align打开Align面板,设置其居中对齐。Insert→symbol新建元件命名为“火”,Windows-library打开Llibrary面板,将火图片拖曳到“火”元件中,设置为居中对齐。
新建元件命名为“火动画”,从Library中拖曳“火”到layer 1,分别在第5、10、15、20帧建立关键帧(在要建关键帧的帧上单击鼠标右键,在弹出菜弹中选择Insert keyframe)。单击第1帧,Windows→panels→frame打开Drame面板,在Frame面板中设置Label属性为“a0”,单击第5帧,在Frame面板中设置label属性为“a1”,单击第10帧,在Label面板中设置Name属性为“a2”。单击第1帧,使用工具栏上的Scale与Rotate工具调整元件的大小与位置,Windows→panels→effect,打开Effect面板,在Effect面板中的下拉菜单中选择Advanced选项,将元件的颜色调整为深红色,透明度为70%。使用同样的方法,依次调整各个关键帧上元件的大小,颜色与透明度。鼠标右键单击从第1帧到第5帧之间的任意一帧,在弹出的菜单中选择Create motion tween,建立Motion动画,同样的方法在其他各关键帧之间分别建立Motion动画。如(图2),新建元件命名为“as火动画”,将“火动画”拖曳到Layer 1,Windows→panels→instance打开Instance面板,在Instance面板中设置Name属性为“fire”。双击第1帧,在弹出的Actions面板中输入如下:

i = 0;
a = random (3);
setProperty ("fire", _visible, "0");
while (i<10) {
duplicateMovieClip ("fire", "fire" add i, i);
//当I<10时复制mc
setProperty ("fire" add i, _x, random (50));
setProperty ("fire" add i, _y, random (30));
//使用random函数取随机数,设置复制出的mc的x、y坐标
setProperty ("fire" add i, _xscale, random (50)+50);
setProperty ("fire" add i, _yscale, random (50)+50);
//设置复制出的mc的宽与高
setProperty ("fire" add i, _alpha, 70+random (30));
//设置复制出的mc的透明度
setProperty ("fire" add i, _rotation, random (50)) ;
//设置复制出的mc的旋转角度
tellTarget ("fire" add i) {
gotoAndPlay ("a" add random (3));
}
//利用随机数决定从mc的什么位置开始播放
i = number(i)+1;
}
语法说明:
duplicatemovieclip,当动画正在播放是复制一个movie clip。复制出的moveclip与被复制的movieclip完全一样,并从第1帧开始播放。
语法:
duplicatemovieclip(target,newname,depth)
参数
target:要复制的movieclip的路径与名称
newname:复制出的movieclip唯一的名称
depth:景深
random()函数:random在actionscrip中是一个应用相当广的函数,它的作用是获取0到指定整数之间的任意整数。利用它,我们可以解决随机显示,随机移动等一系列的效果。是复杂动画的基础,对random函数的灵活应用,是我们解决很多实际问题,创造奇妙效果的前提。我们来看看它的语法:
random(value);
参数
value:所生成随机整数的上限
实例
random(4)所返回值可能为0,1,2,3
setProperty,在movieclip播放时设置其属性。语法:
setProperty(target,property,expression)
参数
target:要设置属性值的movieclip的路径与名称
property:待设置的属性
expression:待设置的属性值
实例
setProperty("xxx",_x,100)
将xxx的x坐标设为100
值得注意的是最后telltarget的使用,为什么要使用随机函数实现帧间跳转呢?这么做的目的是为了使复制出的mc的颜色不完全相同,才能表现出火焰的随机性。
下面开始制作烟雾效果,新建元件“烟动画”从Library中拖曳“烟”元件到Layer 1,分别在第5、10、15、20帧建立关键帧。单击第1帧,在Frame面板中设置Label属性为“b0”,单击第5帧,在Frame面板中设置label属性为“b1”,单击第10帧,在Frame面板中设置Name属性为“b2”。与制作“火”动画时一样,使用Scale与Rotate调整每一关键帧上元件的大小与位置,并且在Effect面板中调整各元件的颜色与透明度。在各关键帧之间分别建立Motion动画。新建元件命名为“as烟动画”,将“烟动画”拖曳到Layer 1,在Instance面板中给它命名为“smoke”。双击第1帧,在弹出的Actions面板中输入如下as:
k = 70;
b = random (3);
setProperty ("smoke", _visible, "0");
while (k<75) {
duplicateMovieClip ("smoke", "smoke" add k, k);
setProperty ("smoke" add k, _x, random (50));
setProperty ("smoke" add k, _y, random (30));
setProperty ("smoke" add k, _xscale, random (30)+70);
setProperty ("smoke" add k, _yscale, random (30)+70);
setProperty ("smoke" add k, _rotation, random (50)) ;
tellTarget ("smoke" add k) {
gotoAndPlay ("b" add random (3));
}
k = number(k)+1;
}
完成了烟雾的制作。最后回到scene 1,从library中将“as火动画”与“as烟动画元件”拖曳到舞台,调整位置与大小就最终完成了作品(如(图3))。

我们大量使用随机函数的目的是在于准确地表现烟火这一特殊效果的不确定性,有时浓烟滚滚,有时几缕青烟,红黄的火苗交替出现不正像我们平常所见到的么。但凡自然界中的景象都有自身的随机性,也就是不确定性,因此在模仿这些效果的时候如何使用好random函数是值得大家好好考虑的问题。
本例效果:http://www.5dmedia.com/users/pcking/fire.html
本例源文件:http://www.5dmedia.com/users/pcking/fire.fla