粒子系统简介
粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象、物理现象及空间扭曲上具备得天独厚的优势,能为我们实现一些真实自然而又带有随机性的效果(如爆炸、烟花、水流)提供了方便。
粒子系统的组件(ParticlreSystem)
该组件是用来读取 粒子资源 数据,并且对其进行一系列例如播放、暂停、销毁等操作。
ParticleSystem属性
| 属性 | 功能说明 |
|---|---|
| Preview | 在编辑器模式下预览粒子,启用后选中粒子时,粒子将自动播放 |
| Play On Load | 如果设置为 true 运行时会自动发射粒子 |
| Auto Remove On Finish | 粒子播放完毕后自动销毁所在的节点 |
| File Plist | 格式的粒子配置文件 |
| Custom | 是否自定义粒子属性。开启该属性后可自定义以下部分粒子属性 |
| Sprite Frame | 自定义的粒子贴图 |
| Duration | 发射器生存时间,单位秒,-1 表示持续发射 |
| Emission Rate | 每秒发射的粒子数目 |
| Life | 粒子的运行时间及变化范围 |
| Total Particle | 粒子最大数量 |
| Start Color | 粒子初始颜色 |
| Start Color Var | 粒子初始颜色变化范围 |
| End Color | 粒子结束颜色 |
| End Color Var | 粒子结束颜色变化范围 |
| Angle | 粒子角度及变化范围 |
| Start Size | 粒子的初始大小及变化范围 |
| End Size | 粒子结束时的大小及变化范围 |
| Start Spin | 粒子开始自旋角度及变化范围 |
| End Spin | 粒子结束自旋角度及变化范围 |
| Source Pos | 发射器位置 |
| Pos Var | 发射器位置的变化范围。(横向和纵向) |
| Position Type | 粒子位置类型,包括 FREE、RELATIVE、GROUPED 三种。详情可参考 PositionType API |
| Emitter Mode | 发射器类型,包括 GRAVITY、RADIUS 两种。详情可参考 EmitterMode API |
| Gravity | 重力。仅在 Emitter Mode 设为 GRAVITY 时生效 |
| Speed | 速度及变化范围。仅在 Emitter Mode 设为 GRAVITY 时生效 |
| Tangential Accel | 每个粒子的切向加速度及变化范围,即垂直于重力方向的加速度。仅在 Emitter Mode 设为 GRAVITY 时生效 |
| Radial Accel | 粒子径向加速度及变化范围,即平行于重力方向的加速度。仅在 Emitter Mode 设为 GRAVITY 时生效 |
| Rotation Is Dir | 每个粒子的旋转是否等于其方向。仅在 Emitter Mode 设为 GRAVITY 时生效 |
| Start Radius | 初始半径及变化范围,表示粒子发射时相对发射器的距离。仅在 Emitter Mode 设为 RADIUS 时生效 |
| End Radius | 结束半径。仅在 Emitter Mode 设为 RADIUS 时生效 |
| Rotate Per S | 粒子每秒围绕起始点的旋转角度及变化范围。仅在 Emitter Mode 设为 RADIUS 时生效 |
| Src Blend Factor | 混合显示两张图片时,原图片的取值模式。 |
| Dst Blend Factor | 混合显示两张图片时,目标图片的取值模式。 |
组建上的属性都有注解
如何用代码控制粒子
外面组件是在想要的粒子效果的节点上加一个ParticleSystem组件。
一款免费制作粒子的工具
如果你不满足组建的设置也可以用软件制作自己喜欢的粒子效果,网址:http://www.effecthub.com/particle2dx
用粒子实现烟花效果
代码
cc.Class({
extends: cc.Component,
properties: {
//声明预制体
fireworks:cc.Prefab,
},
start () {
// 烟花对象池
this.fireworksPool = new cc.NodePool();
// 预先放20个烟花进去
var initCount = 20;
for(var i = 0;i < initCount;i ++){
//创建烟花节点
var fireworks = cc.instantiate(this.fireworks);
//通过put接口放入对象池
this.fireworksPool.put(fireworks);
}
// 计时器,从第0秒开始,每隔1秒放一个,放15+1=16次
this.schedule(this.createfireworks,1,15,0);
},
// 制造烟花
createfireworks(){
// 通过size接口判断对象池中是否有空闲的对象
if(this.fireworksPool.size() > 0) {
var fireworks = this.fireworksPool.get();
}
else {
//如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
var fireworks = cc.instantiate(this.fireworks);
}
// 设置父节点
fireworks.parent = this.node;
// 随机位置(960 * 640)
fireworks.x = -450+960 * Math.random();
fireworks.y = -320+640 * Math.random();
// resetSystem()函数重置发射器,开始发射粒子;
fireworks.getComponent(cc.ParticleSystem).resetSystem();
// 4秒后自动回收
this.scheduleOnce(function(){
// 回收之前stopSystem();
fireworks.getComponent(cc.ParticleSystem).stopSystem();
this.fireworksPool.put(fireworks);
},4);
},
});
粒子组建的调试如下
效果图如下