`

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
分享到:
评论

相关推荐

    flint粒子系统-飞翔的乌鸦flash 3d

    其中,Flint粒子系统是一款强大的开源粒子编辑器,它允许开发者通过简单易用的界面创建出复杂的3D效果。本篇文章将深入探讨如何利用Flint粒子系统来实现《飞翔的乌鸦》这一特定的3D场景。 1. Flint粒子系统简介 ...

    BornGrass-flint粒子系统-完美的草丛flash 3d

    本文将深入探讨"BornGrass-flint粒子系统",一种专为Flash 3D设计的粒子系统,它能够模拟出极其逼真的草丛动画效果。 首先,BornGrass-flint粒子系统是基于Flash平台的3D引擎,它充分利用了Flash的性能,实现了高效...

    数论库flint手册

    - **基础示例**:通过几个简单的示例演示了如何使用FLINT进行基本操作。 - **高级应用**:展示了FLINT在解决复杂数学问题方面的应用案例。 - **代码解析**:详细解释了示例代码的工作原理和实现细节。 #### 十五、...

    Flint_2_1_3_source.zip_Flint_2_1_3_source_flex

    Flint 2.1.3 是一款专为Adobe Flex开发者设计的3D粒子系统库,它的核心功能在于提供强大的工具来创建令人惊叹的视觉效果,如火焰、烟雾、雪花、星光等。这款开源库为Flex应用程序注入了丰富的动态元素,使得用户界面...

    FLINT Jul 2012.pdf

    FLINT(FLEXIBLE INTERCEPTOR A REALISTIC MISSILE SIMULATION SOFTWARE)是一款针对商品游戏(commodity games)的现实主义导弹模拟软件。它能在不需要复杂引擎支持的情况下,为游戏提供相当真实的导弹和火箭弹道的...

    Flint: Making Sparks (and Sharks!)

    在某个峰会上,他深入探讨了Flint的相关知识,特别是其架构和安装流程。Flint项目的目标是将大数据分析服务(Big Data Analytics Service,简称BDAS)带入亚马逊网络服务(Amazon Web Services,简称AWS)的大众市场...

    flint8.5 on linux特效合成系统.pdf

    flint8.5 on linux特效合成系统.pdf

    flint_加密方法_C++语言库

    "flint_加密方法_C++语言库"显然是一个专门针对C++编程环境设计的加密工具包,旨在帮助开发者实现安全的数据保护功能。 标题中的“flint”可能是指该库的项目名,它可能来源于英文单词“flint”,意为燧石,象征着...

    flint:前端入门套件

    **Flint前端入门套件** 是一款专为初学者设计的工具包,旨在简化前端开发的初始阶段。它特别强调了CSS预处理的功能,帮助开发者更高效地编写样式代码。预处理器如Sass、Less或Stylus允许开发者使用变量、嵌套规则、...

    前端开源库-flint-babylon

    3. **预设组件**:`flint-babylon`可能包含了预设的3D对象和组件,如相机、粒子系统、UI元素等,方便开发者快速搭建3D场景。 4. **性能优化**:通过针对前端应用场景的优化,`flint-babylon`可能提高了Babylon.js在...

    数论库FLINT

    强大的数论库

    一个数论库,用C语言编写,它包括一个非常快的多项式算法库FLINT

    FLINT 是一个支持数论计算的 C 库。这也是一个 数论算法研究项目。FLINT 主要由快速 标量和多项式算术、因式分解和线性代数 基本环(整数、有理数、实数、有限域、数域、p-adics)。 它包括一些更高级别的代数和解析...

    基于Flint的师生互动实证研究论文.pdf

    Flint是 Foreign Language Interaction System 的缩写,是一种互动分析系统,用于分析课堂师生言语行为的教学效果。 论文首先介绍了研究背景,指出传统的教学评估方法存在缺陷,于是引入了FIAS(Flanders ...

    Discreet推出基于英特尔架构IBM Linux工作站的flint视觉效果系统.pdf

    即Discreet公司(可能是指现在的Autodesk Discreet,Autodesk的一个子公司,专注于媒体与娱乐行业的软件)发布了一款名为flint的视觉效果(Visual Effects, VFX)系统。这款系统是特别设计用于IBM Linux工作站的,这...

    flint:用于智能合约的Flint编程语言

    int石编程语言 Flint是一种新型的类型安全,面向合同的编程语言,专门用于在以太坊上编写健壮的智能合同。 Flint仍处于alpha开发阶段,尚未准备好用于生产中。 中型文章: 和编程2018! 论文:当前工作文件: 在苏珊...

    flint:Flint是一种无功能的Fortran解析器,delinter和分析器。 或不。 目前只是一个想法

    目前,它是作为Python模块编写的,但是我希望有一天它将使用命令行工具。 Flint目前尚无法完全使用,但它确实包含一些不错的功能,并且已从非常基本的水平集成到了一些项目中。 当前,标记化是好的,并且几个非常大...

    Flint-Store:另一个 EmberJS 项目

    `Flint-Store` 是一个基于 EmberJS 框架构建的电子商务项目,旨在创建一个在线商店,提供各种令人敬畏的商品。EmberJS 是一款强大的、用于构建用户界面的前端JavaScript框架,特别适合开发单页应用程序(SPA)。它...

    swift-Flint为高效使用iOS常用特性而生的工具框架库

    为Apple平台构建出色的应用程序涉及大量工作; 自定义网址方案,应用内购买,授权系统权限,通用链接,切换和Siri支持,跟踪分析事件,功能标记等。 这些东西可能是繁琐而耗时的,但你不应该动手做这一切!

    Flint:Flint框架,用于使用功能驱动开发在Apple平台上构建应用程序

    Flint是一个框架,可使用Swift的功能根据功能和操作为Apple平台构建应用程序。 应用的功能是根据运行时限制启用的; 系统权限,操作系统版本或应用内购买。 它需要您的操作,并提供增强的日志记录,自动分析事件,...

Global site tag (gtag.js) - Google Analytics