在前面两篇的教程基础上 接下来 我们来创建 一束草 demo : http://flintparticles.org/swf2/Grass.swf
首先 我们创建发射器emitter
var emitter :Emitter2D = new Emitter2D();
//下面我们创建渲染环境 这里用的渲染环境是 BitmaplineRenderer 这种渲染环境一般用来创建 头发丝 草 等一些纤细的对象
//它的使用和上个例子中的DisplayObjectRender相似
var render:BitmaplineRenderer = new BitmapLineRenderer(new Rectangle( 0, 0, 500, 500 ));//渲染环境为500*500大小
//将其添加进舞台
addChild(render);
//下面我们把ermitter对象放入渲染环境中 并确定它的坐标位置
render.addEmitter(emitter);
emitter.x= stage.stageWidth/2;
emitter.y=stage.stageHeight+50;
// 由于草堆的底部是由圆组成的 ,这里我们用的Zone 是DiscZone, DiscZone 类确定一个圆形区域
var zone:DiscZone = new DiscZone(new Point(0,0),40);//point(0,0)是其的中心坐标 40是草堆的外部最大的圆形区域
//创建position
var position :Position = new Position (zone);
//添加进emitter
emitter.addInitializer(position);//此时DiscZone添加进ermitter,DiscZone在舞台上的坐标 是 x=DiscZone.centerX+ermitter.x y=DiscZone.centerY+ermitter.y
//下面我们添加速度velocity
/*
velocity的介绍:velocity的创建 与zone有关 :
使用指定了的一个方向的一个确定的速度 用PointZone (上两篇教程就是用的它) 假如要一个方向使用不同的速度 用到的是LineZone
在多个方向上使用固定的速度 用到的是DiscZone或者DiscSectorZone . 在不同的方向上使用不同的速度,只需在DiscZone或者DiscSectorZone 的构造函数设个随机数即可 (在内外半径加上随机数,使半径变化,从而达到速度的变化)
DiscSectorZone(center:Point = null, outerRadius:Number = 0, innerRadius:Number = 0, minAngle:Number = 0, maxAngle:Number = 0) 即里面的 outerRadius innerRadius参数改成随机数即可 最后两个参数 是角度 角度在minAngle
和maxAngle之间随机变化
*/
//创建DiscSectorZone
var discSectorZone:DiscSectorZone = new DiscSectorZone (new Point(0,0),80,40, -5 * Math.PI / 8, -3 * Math.PI / 8 );
emitter.addInitializer(new Velocity(discSectorZone));
//使用counter
emitter.counter= new Blast(100);
//创建粒子对象的颜色
emitter.addInitializer(new ColorInit(0xFF006600, 0xFF009900));
//下面创建动作 由于草堆不能永远的长下去 必须设定一个界限 用Age 和Lifetime确定它的生长时间
//首先创建动作Move
emitter.addAction(new Move());
emitter.addInitializer(new Lifetime(7));//生长时间为七秒
emitter.addAction(new Age())//Age用来计算它用的时间 时间到了就停止运动
//我们在粒子对象进行缩放 它随着Age进行缩放
emitter.addAction(new ScaleImage(4,1));// 4 表示开始时的大小 1 表示结束时的大小 (1是正常大小,4是原来的4倍)
// 下面我们模仿力的作用 给它加上加速度 这里我们加上重力加速度
emitter.addAction(new Accelerate(0,10));
//最后发射
emitter.start();
所有的代码如下:
import flash.geom.Point;
import org.flintparticles.common.counters.*;
import org.flintparticles.common.displayObjects.RadialDot;
import org.flintparticles.common.initializers.*;
import org.flintparticles.twoD.actions.*;
import org.flintparticles.twoD.emitters.Emitter2D;
import org.flintparticles.twoD.initializers.*;
import org.flintparticles.twoD.renderers.*;
import org.flintparticles.twoD.zones.*;
import org.flintparticles.twoD.renderers.*;
import org.flintparticles.common.actions.*;
var emitter :Emitter2D = new Emitter2D();
var render:BitmapLineRenderer=new BitmapLineRenderer(new Rectangle(0,0,500,500));
addChild(render);
render.addEmitter(emitter);
emitter.x=250;
emitter.y=300;
var zone:DiscZone=new DiscZone(new Point(0,0),40);
var position:Position=new Position(zone);
emitter.addInitializer(position);
var discSectorZone:DiscSectorZone=new DiscSectorZone(new Point(0,0),80,40,-5*Math.PI/8,-3*Math.PI/8);
emitter.addInitializer(new Velocity(discSectorZone));
emitter.counter=new Blast(100);
emitter.addInitializer(new ColorInit(0xFF006600, 0xFF009900));
emitter.addAction(new Move());
emitter.addInitializer(new Lifetime(7));
emitter.addAction(new Age());
emitter.addAction(new ScaleImage(4,1));
emitter.addAction(new Accelerate(0,10));
emitter.start();