flash特效原理:粒子爆

鼠标按下的时候,生成200个粒子,粒子向不同的方向移动,从而产生一种像仙女散花的感觉。

 

 

下面是散开的效果,同样你可以为你的效果添加很多元素,包括引力,重力,摩擦力等等情况,但这部分就靠自己,还是需要自己想法出来

 

 

简单的做法,代码很少,涉及到运动的方向做法。效果看起来让我觉得惊讶,不过换来代价是卡卡卡,当我尝试换成1000个粒子的时候

则会产生很多问题,是由于生成的对象太多了,内存占用率很高,你可以测试一下。生成效果很不错。

 

基本思路:鼠标按下--》生成一定数量的粒子,粒子按随机的方向行走,行走一定的时候,就需要立刻对其删除,否则会产生内存问题。

 

看看下面的代码,做法很简单。只是觉得有一种不错的想法,暂时先把他记录下来。

 

粒子随机轨迹角度,则需要通过Math.atan2 进行计算,在flash里面这个方法可以为运动学创造带来很多方便。有兴趣的可以去测试一下。

 

其中:Ball 为通过库链接的链接过来的影片剪辑,因此在创建这个程序的时候,可以在元件库里面 自行添加进去,尝试更改粒子的样貌,这样效果会呈现出不同的形态。

 

这个只是一个元件,缩放元件的大小,产生的效果也不一样,周边的白色边,加上一些高光的效果,就能够发挥出不错的夜光性。

(由于上传图片 太麻烦,只能在最近才修改这些。 上传日期:1月27日)

 再对其进行修正,粒子的轨迹也可以是不按随机的,也可以按随机的方向。这样不同的做法,效果看起来会更加不错,相信你会创建出很多很多绚丽的特效,而这些事情就需要去完善。

package { import flash.display.MovieClip; import flash.display.DisplayObject; import flash.events.*; public class Main extends MovieClip { //private var list:Array=new Array();//管理粒子 //private var speed:int=5; private var contain:MovieClip=new MovieClip();//容器管理粒子 public function Main() { init(); } private function init():void { addChild(contain); stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); } //生成粒子,200个小球,然后向不同的方向移动,速度不一样,角度也不样 private function MouseDownHandler(event:MouseEvent):void { for (var i:int=0; i<200; i++) { var ball:Ball=new Ball(); contain.addChild(ball); ball.x=mouseX; ball.y=mouseY; ball.vx=Math.random()*4+2;//随机生成不同的x速度 ball.vy=Math.random()*5+2;//随机生成不同的y速度 //ball.alpha=Math.random()+0.1; var angle:Number=Math.atan2(Math.random()*400-ball.y,Math.random()*550-ball.x);//随机一个角度 ball.angle=angle; ball.addEventListener(Event.ENTER_FRAME,BallMove); //list.push(ball); } } //每一个粒子的移动 private function BallMove(event:Event):void { event.currentTarget.x+=Math.cos(event.currentTarget.angle)*event.currentTarget.vx; event.currentTarget.y+=Math.sin(event.currentTarget.angle)*event.currentTarget.vy; //drawLine(mouseX,mouseY,event.currentTarget.x,event.currentTarget.y); if (event.currentTarget.y<0 || event.currentTarget.y>stage.stageHeight|| event.currentTarget.x<0 || event.currentTarget.x>stage.stageWidth ) { event.currentTarget.removeEventListener(Event.ENTER_FRAME,BallMove); contain.removeChild(DisplayObject(event.currentTarget)); } } //绘制线条,这个方法你可以尝试一下, private function drawLine(x1,y1,x2,y2:Number):void { graphics.clear(); graphics.lineStyle(1,0xff0000); for (var i:int=0; i<=contain.numChildren; i++) { graphics.moveTo(x1,y1); graphics.lineTo(contain.getChildAt(i).x,contain.getChildAt(i).y); } } } }

 

你可能感兴趣的:(flash,特效原理)