模拟烟雾

二维粒子 everyinch 7031℃ 0评论

使用粒子来模拟烟雾的效果是比较常见而又吸引人的。想象一下大家平时见到的烟雾效果:速度是向上的,具有一定的加速度,且逐渐扩散并透明。再分析了烟雾的粒子属性之后,还要为其定义适当的外观,这里使用了Flash制作了一段动画。动画总共50帧,前10帧使灰色的图形元件逐渐放大到原先的105%,再接下来的40帧里使其顺时针旋转1周。将该动画在其属性对话框中命名为“SmokAnimation”,最后将该元件导出成SWC文件,并在Flex Builder中加载它。

package{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.filters.BlurFilter;

[SWF(width="800", height="600", backgroundColor="0xffffff", frameRate="31")]
public class Smoke extends Sprite{
private var numbers:Number=60;
private var particles:Array;
private var container:Sprite=new Sprite();

public function Smoke(){
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

particles=new Array();
addChild(container);
container.filters=[new BlurFilter(20, 20, 1)];
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}

private function onEnterFrame(e:Event):void{
var trash:*;
var particle:*=new SmokeAnimation();
container.addChild(particle);
particle.x=this.mouseX;
particle.y=this.mouseY;
particle.gravity=-0.1;
particle.friction=1.02;
particle.xVelocity=Math.random() * 2 - 1;
particle.yVelocity=Math.random() * 1 - 2;
particle.fade=0.95;
particle.alpha=Math.random() + 0.6;
particle.scaleX=particle.scaleY=Math.random() * 0.5 + 0.7;
particle.growX=1.02;
particle.growY=1.02;
particles.push(particle);
while (particles.length > numbers){
trash=particles.shift();
container.removeChild(trash);
trash=null;
}
for (var i:int=0; i < particles.length; i++){
particles[i].update();
if (particles[i].alpha[/code]
代码中将粒子的xVelocity设置为-1~1之间的随机数,yVelocity设置为-2~-1的随机数。将gravity设置为-0.1,使粒子在Y方向上由一个0.1的加速度。将growX、growY设置为1.02,将fade设置为0.95,从而实现粒子逐渐放大且透明的效果。
为了避免加载过多的粒子,将while循环中如果粒子数组长度超过了指定的数值,就将弹出粒子数组中前面的元素并也从显示对象列表中移除。

转载请注明:陈童的博客 » 模拟烟雾

喜欢 (1)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
'; } if( dopt('d_footcode_b') ) echo dopt('d_footcode'); ?>