Sprite粒子

二维粒子 everyinch 3595℃ 0评论

在ActionScript3.0中,所有代码都不是写在时间轴上的。那么它们一开始都要继承自 MovieClip或Sprite。MovieClip 类是影片剪辑对象属性和方法的ActionScript模板。它包括一些常用的属性:x, y坐标、缩放等等。ActionScript3.0中新增加的Sprite类,通常把它理解为不包括时间轴的影片剪辑。很多情况下,只使用代码操作对象,并不涉及时间轴和帧,这时就应该使用Sprite这个轻型的类。如果一个类继承自 MovieClip或Sprite,那么它会自动拥有该类所有的属性和方法,当然还可以为这个类增加特殊的属性和方法。所以,Sprite自然成为我们粒子系统所要继承的类,使Sprite成为承载粒子的容器。下面实现了一个简单的粒子的基类。文件名为Particle.as,源代码如下:

package com.particles{
import flash.display.*;

public class Particle extends Sprite{
public var xVelocity:Number;
public var yVelocity:Number;
public var gravity:Number;
public var friction:Number;
public var growX:Number;
public var growY:Number;
public var fade:Number;
public var autoRotate:Boolean;
public var spin:Number;

public function Particle(){
xVelocity=0;
yVelocity=0;
gravity=0;
friction=1;
growX=1;
growY=1;
fade=1;
autoRotate=false;
spin=0;
}

public function update():void{
xVelocity*=friction;
yVelocity*=friction;
yVelocity+=gravity;
this.x+=xVelocity;
this.y+=yVelocity;
this.scaleX*=growX;
this.scaleY*=growY;
this.alpha*=fade;
if (autoRotate){
this.rotation=Math.atan2(yVelocity, xVelocity) * 180 / Math.PI;
}
this.rotation+=spin;
}
}
}
[/code]
在Particle基类中,我们实现了水平速度xVelocity、垂直速度yVelocity、重力gravity、摩擦力friction,粒子的缩放属性growX和growY,以及改变alpha的fade和自旋转的spin属性。在Particle的共有方法update中,分别应用了速度、重力、摩擦力、缩放以及旋转属性,通过调用update方法就可以使粒子发生一些改变,这些改变既可以包括速度上的,也可以包括大小和旋转上的。大家注意到在Particle类中没有实现粒子的外观,下面再让我们自定义一个实现粒子外观的类,既然大多数粒子都是各种形式的圆形,那么就写一个实现圆形外观的类,文件名为Ball.as,源代码如下:

package{
import com.particles.Particle;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.geom.Matrix;

public class Ball extends Particle{
public var radius:Number;
public var startColor:uint;
public var endColor:uint;
public var startAlpha:int;
public var endAlpha:int;

public function Ball(radius:Number=40, startColor:uint=0xff0000,
startAlpha:int=1,endColor:uint=0x000000, endAlpha:int=1){
this.radius=radius;
this.startColor=startColor;
this.endColor = endColor;
this.startAlpha = startAlpha;
this.endAlpha = endAlpha;
init();
}

public function init():void{
var colors:Array=[startColor,endColor];
var alphas:Array = [startAlpha,endAlpha];
var ratios:Array = [0,255];
var mat:Matrix = new Matrix();
mat.createGradientBox(radius*2,radius*2,0,-radius,-radius);
graphics.beginGradientFill(GradientType.RADIAL,colors,alphas,ratios,mat);
graphics.drawCircle(0,0,radius);
graphics.endFill();
}
}
}[/code]
为了实现较好的视觉效果,我们自定义的圆形外观类使用了Radial的渐变填充,这样需要向其传递5个参数,即圆的半径、渐变的起始颜色、渐变起始颜色的alpha、渐变的结束颜色以及渐变结束颜色的alpha。为了使Radial渐变比较均匀,需要自定义GradientBox。通过使用下面两条语句,使渐变能够根据我们自定义的半径而缩放:

var mat:Matrix = new Matrix();
mat.createGradientBox(radius*2,radius*2,0,-radius,-radius);
[/code]

转载请注明:陈童的博客 » Sprite粒子

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

表情

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

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