[b]【[url]http://www.newflash3d.com[/url]---flash3D先锋队:北京贝武易科技公司】[/b]
有疑问请联系我QQ:363596350
Flint Particle粒子的类库有三个文件包:
[img]/upload/attachment/67646/1e24dadf-764c-3d4e-a4ab-7d047858cdf6.jpg[/img]
common,通用文件包;
threeD,三维包;
twoD,二维包;
我们看看twoD,二维包的内容。
[img]/upload/attachment/67648/b98147eb-a23f-3e7a-97ab-9a9588a7313c.jpg[/img]
actions---行为
activities--活动力
emitters---发射器
initializers--初始化器(所有的初始化类都放在这个目录了)
particles---粒子类
renderers---渲染类
zones-----区域类
我们看看渲染类:
[img]/upload/attachment/67650/549665bf-9fac-3311-9df1-87c0f595803c.jpg[/img]
BitmapRenderer.as----位图渲染器
DisplayObjectRenderer.as--显示物体渲染器
PixelRenderer.as----象素渲染器
[b]关于counter(计数器)[/b]
counter是一个接口,它决定了粒子是以何种方式发射,counter由很多counter类来实现它的方法,这每个实现了counter接口的类都是不同方式的粒子发射形式。如稳定的发射或爆炸式的发射。而counter同时是粒子发射器(Emitter )的属性。
下面是它的定义:
[b]counter[/b] — Property in class org.flintparticles.common.emitters.Emitter
The Counter for the Emitter.
[b]Counter[/b] — Interface in package org.flintparticles.common.counters
The Counter interface must be implemented by all counters.
他们之间的关系公式:
Emitter.counter=new 实现counter接口的类();
[img]/upload/attachment/67675/33ba506c-8f96-3b4d-acb2-47095ddca307.jpg[/img]
Blast.as---爆炸式
Counter.as---Counter总接口
KeyDownCounter.as---按键式
PerformanceAdjusted.as---表演调整式
Pulse.as---脉冲式
Random.as---随机式
SineCounter.as---正弦式
Steady.as---稳定式
TimePeriod.as---间断式
ZeroCounter.as---零点式
参阅Emitter.as,我们可以看到Emitter的counter方法是一个set get 存取器:
public function get counter():Counter
{
return _counter;
}
public function set counter( value:Counter ):void
{
_counter = value;
}
默认的情况下:
protected var _counter:Counter;//_counter是一个接口
_counter = new ZeroCounter();//接口实例化
看看ZeroCounter类的代码:
package org.flintparticles.common.counters
{
import org.flintparticles.common.emitters.Emitter;
public class ZeroCounter implements Counter
{
public function ZeroCounter()
{
}
public function startEmitter( emitter:Emitter ):uint
{
return 0;//开始发射为0!!
}
public function updateEmitter( emitter:Emitter, time:Number ):uint
{
return 0;
}
public function stop():void
{
}
public function resume():void
{
}
}
}
粒子的发射为0,也就看不见粒子了。
我们编写一个实例,我们一步一步往下走,相信我们会做出点成绩来的!
进入Flex,建立好各种设置,类和环境的安装,相信大家都会了,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:myCanvas3D="*" layout="absolute" xmlns:myCanvas3D1="myCanvas3D.*" applicationComplete="init();">
<mx:Script>
<![CDATA[
import flash.geom.Point;
import org.flintparticles.common.renderers.Renderer;
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.zones.*;
import org.flintparticles.twoD.renderers.*;
private var render:DisplayObjectRenderer;
private var emitter:Emitter2D;
public function init():void{
emitter=new Emitter2D();//建立二维发射器
emitter.start(); //发射器启动
render = new DisplayObjectRenderer();//建立渲染器
render.addEmitter(emitter); //发射器加入到渲染器
mycanvas3d.canvas.addChild(render); //渲染器加入场景画布
}
]]>
</mx:Script>
<myCanvas3D1:Canvas3D width="500" height="400" id="mycanvas3d" backgroundColor="0x000000"/>
</mx:Application>
一个发射器:private var emitter:Emitter2D;
一个渲染器:private var render:DisplayObjectRenderer;
我们的粒子发射框架就建立好了,剩下的只是增加一些必须的细节环节。
但是这时候我们还不能看到场景里有任何粒子,我们接着操作。
给粒子加一个稳定的发射方式:
emitter.counter = new Steady( 100 );
代码如下:
<mx:Script>
<![CDATA[
import flash.geom.Point;
import org.flintparticles.common.renderers.Renderer;
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.zones.*;
import org.flintparticles.twoD.renderers.*;
private var render:DisplayObjectRenderer;
private var emitter:Emitter2D;
public function init():void{
emitter=new Emitter2D();
emitter.counter = new Steady( 100 );//新加的稳定发射方式
emitter.start();
render = new DisplayObjectRenderer();
render.addEmitter(emitter);
mycanvas3d.canvas.addChild(render);
}
]]>
</mx:Script>
<myCanvas3D1:Canvas3D width="500" height="400" id="mycanvas3d" backgroundColor="0x000000"/>
</mx:Application>
运行,会报错。
TypeError: Error #2007: 参数 child 不能为空。
at flash.display::DisplayObjectContainer/addChildAt()
at org.flintparticles.twoD.renderers::DisplayObjectRenderer/addParticle()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\twoD\renderers\DisplayObjectRenderer.as:95]
at org.flintparticles.common.renderers::SpriteRendererBase/particleAdded()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\common\renderers\SpriteRendererBase.as:121]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at org.flintparticles.common.emitters::Emitter/createParticle()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\common\emitters\Emitter.as:548]
at org.flintparticles.common.emitters::Emitter/update()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\common\emitters\Emitter.as:677]
at org.flintparticles.common.emitters::Emitter/updateEventListener()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\common\emitters\Emitter.as:642]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at org.flintparticles.common.utils::FrameUpdater/frameUpdate()[E:\flexProject\papervision3dExe\FlintSnow\src\org\flintparticles\common\utils\FrameUpdater.as:88]
错误类型为子物体不能为空,是在DisplayObjectRenderer.as类的第95行
我们看看DisplayObjectRenderer.as类的第95行。
addChildAt( particle.image, 0 );
也就是说程序找不到这个粒子图像元素(particle.image)。
进入particle类,看看image变量的定义:
/**
* The object used to display the image. In a 2D particle, this is usually
* a DisplayObject. In a 3D particle, this may be a DisplayObject, for
* displaying on a billboard or similar, or a 3D object in the form used
* by the render system.
*/
public var image:* = null;
image变量默认的情况下为空,但是它的类型不是单一的,二维粒子(2D particle)的时候它通常是一个显示物体(DisplayObject),在三维粒子(3D particle)它可以是一个显示物体(DisplayObject)或是根据渲染系统定义的一个三维物体(3D object)。那么为了让DisplayObjectRenderer渲染出物体,我们还需要一个方法来给粒子图像元素(particle.image)实例化出来。
这里会涉及到另外一个接口-初始化接口(initialize)
[b]关于初始化接口(initialize):[/b]
initialize接口类在common目录下:
[img]/upload/attachment/67677/351f9b48-6ee9-36ba-b8ef-ce98e6c1736f.jpg[/img]
我们看看它里面的文档结构:
[img]/upload/attachment/67679/472c79c7-3950-33ae-b31e-37c70ed5ffd6.jpg[/img]
Initializer.as--总接口
package org.flintparticles.common.initializers
{
//发射器(它主要是处理发射器与粒子之间的关系)
import org.flintparticles.common.emitters.Emitter;
//粒子
import org.flintparticles.common.particles.Particle;
public interface Initializer
{
//设置初始化设置器的优先权
function getDefaultPriority():Number;
//加到发射器上
function addedToEmitter( emitter:Emitter ):void;
//从发射器移除
function removedFromEmitter( emitter:Emitter ):void;
//初始化的方法,建立粒子和发射器之间的关系
function initialize( emitter:Emitter, particle:Particle ):void;
}
}
所有的初始化设置器必须要实现以上的4个方法。
回到刚才的实例,我们加入如下代码:
emitter.addInitializer( new ImageClass( RadialDot, 18 ) );
完整的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:myCanvas3D="*" layout="absolute" xmlns:myCanvas3D1="myCanvas3D.*" applicationComplete="init();">
<mx:Script>
<![CDATA[
import flash.geom.Point;
import org.flintparticles.common.renderers.Renderer;
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.zones.*;
import org.flintparticles.twoD.renderers.*;
private var render:DisplayObjectRenderer;
private var emitter:Emitter2D;
public function init():void{
emitter=new Emitter2D();
emitter.counter = new Steady( 100 );
emitter.addInitializer( new ImageClass( RadialDot, 18 ) );
emitter.start();
render = new DisplayObjectRenderer();
render.addEmitter(emitter);
mycanvas3d.canvas.addChild(render);
}
]]>
</mx:Script>
<myCanvas3D1:Canvas3D width="500" height="400" id="mycanvas3d" backgroundColor="0x000000"/>
</mx:Application>
运行程序,我们看到在画布的左上交一个大的点,其实那就是我们发射的粒子。这回没有报错,因为我们实现了粒子的实例化了。
下面我们分析一下
emitter.addInitializer( new ImageClass( RadialDot, 18 ) );
的意义。
ImageClass其实是一个初始化设置器,它实现了Initializer.as的接口。