`

Flint Particle粒子入门教程(一)

阅读更多
http://www.newflash3d.com---flash3D先锋队:北京贝武易科技公司】
有疑问请联系我QQ:363596350
Flint Particle粒子的类库有三个文件包:

common,通用文件包;
threeD,三维包;
twoD,二维包;
我们看看twoD,二维包的内容。

actions---行为
activities--活动力
emitters---发射器
initializers--初始化器(所有的初始化类都放在这个目录了)
particles---粒子类
renderers---渲染类
zones-----区域类
我们看看渲染类:

BitmapRenderer.as----位图渲染器
DisplayObjectRenderer.as--显示物体渲染器
PixelRenderer.as----象素渲染器

关于counter(计数器)
counter是一个接口,它决定了粒子是以何种方式发射,counter由很多counter类来实现它的方法,这每个实现了counter接口的类都是不同方式的粒子发射形式。如稳定的发射或爆炸式的发射。而counter同时是粒子发射器(Emitter )的属性。
下面是它的定义:
counter — Property in class org.flintparticles.common.emitters.Emitter
The Counter for the Emitter.
Counter — Interface in package org.flintparticles.common.counters
The Counter interface must be implemented by all counters.
他们之间的关系公式:
Emitter.counter=new 实现counter接口的类();




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)

关于初始化接口(initialize):

initialize接口类在common目录下:

我们看看它里面的文档结构:

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的接口。

        






  • 大小: 5 KB
  • 大小: 10.3 KB
  • 大小: 10.4 KB
  • 大小: 31.4 KB
  • 大小: 27.6 KB
  • 大小: 58.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics