【3.x】

    (1)去掉“CC”

    (2)粒子位置模式 tPositionType 改为强枚举类型 ParticleSystem::PositionType::

//
ParticleSystem::PositionType::FREE //自由模式: 不与发射器联系,自己走自己的路线
ParticleSystem::PositionType::RELATIVE //相对模式: 粒子发射器随粒子节点的移动而移动
ParticleSystem::PositionType::GROUPED //相对模式: 粒子群随粒子发射器的移动而移动
//

    (3)发射器模式 kCCParticleModeGravity / kCCParticleModeRadius 

        改为强枚举类型:ParticleSystem::Mode::

//
ParticleSystem::Mode::GRAVITY //重力发射器
ParticleSystem::Mode::RADIUS //半径发射器
//

【CCParticleSystem】

CCParticleSystem为粒子系统的主要类,它的父类为CCNode和CCTextureProtocol。由此可见粒子系统包含了一张纹理图片用于显示。而它还有一个子类CCParticleSystemQuad,该类只是在父类的基础上,又加了一些属性。而我们主要关注的是CCParticleSystemQuad这个类的用法。

1、原理

首先来讲讲粒子系统的工作原理。

粒子系统主要由两部分组成:粒子粒子发射器

粒子的生命周期:出生、成长、死亡。

(1)在引擎中存在一个粒子池,存放了待激活的粒子。发射器每次从粒子池中获取一个粒子,然后计算赋予粒子初始的属性(速度、大小、方向、生存时间等)后,将粒子发射出去。

(2)粒子被发射出去后,会不断地刷新来修正它的属性。

(3)当粒子的生存时间结束后,粒子就会死亡,然后重新被粒子池回收,等待下一次的激活。

2、粒子属性

粒子发射器每秒会发射许许多多的粒子,而每个粒子在发射时,都会被赋予粒子相关的属性。另外值得注意的是:粒子被赋予的属性并不是全部一样的,发射器会根据原始值与浮动值Var进行设置。这样就能保证每个粒子会有不同的展现效果。

    浮动值Var:表示随机上下浮动的修正值。实际值 = 原始值 + 浮动值Var。

           如:原始值为5,浮动值Var为2。那么实际值取值范围:3~7。

3、发射器属性

发射器有两种类型:重力发射器模式、半径发射器模式。

3.1、发射器共有属性

3.2、重力发射器

3.3、半径发射器

4、现成粒子特效

cocos2dx引擎中为我们提供了一些粒子效果的类,这些类是为了方便开发者直接用于表现某种粒子效果的。

如下列出11种粒子特效:

粒子特效类 中文名 特效图
CCParticleExplosion 爆炸特效
CCParticleFire 火焰特效
CCParticleFlower 花束特效

CCParticleFireworks 烟花特效
CCParticleGalaxy 星系特效
CCParticleMeteor 流星特效
CCParticleRain 下雨特效
CCParticleSmoke 烟雾特效
CCParticleSnow 下雪特效
CCParticleSpiral 漩涡特效
CCParticleSun 太阳特效

5、混合方式

粒子发射器一般都会发射大量的粒子出来,必然会有许多的粒子重叠或者交叉在一起。

所以对于粒子纹理图片的混合方式,在很大程度上影响了视觉效果。

使用方法如下举例:

//
//{ 源因子 , 混合因子 }
ccBlendFunc cbl = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA };
emitter->setBlendFunc(cbl);
//

6、粒子纹理

介绍粒子系统类的继承关系时,其中包含了CCTextureProtocol这个纹理协议类。如果没有纹理图片的话,所有粒子将会是单调的色块。如果想要精美的视觉效果,就要考虑在粒子效果中使用纹理了。

值得注意的是:不要因为粒子会很小而忽略它的纹理图片,如果没有设置纹理属性的具体值,那么引擎就会设定一个默认正方形的纹理,多数情况下,效果是非常差的。最好的方式是使用一个球形的图片,其透明度为半透明的。

还有重要的一点:就是图片的尺寸最好不要超过64像素*64像素。因为贴图尺寸越小,粒子效果就运行得越流畅,画面也更加细腻。同时,由于粒子效果就是依靠粒子相互叠加产生的画面效果。如果纹理过大的话,叠加太多就会变成了白色区域。

PS:粒子系统还可以在发生粒子的过程中,动态改变纹理贴图,使用setTexture()。

    通过如下例子来设置纹理:

//
emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png") );
//

【代码实战】

主要测试粒子特效的四种创建方式。

(1)使用代码,创建重力发射器模式

(2)使用代码,创建半径发射器模式

(3)创建现成粒子特效

(4)使用plist文件,创建自定义的粒子特效(使用“红孩儿工具箱”制作)

不建议使用:(1)、(2)。因为这两种方法太过繁琐,且不容易看出效果。

建议使用  :(3)、(4)。方便、且有现成的特效制作工具。

1、创建重力发射器模式

不建议使用。

//
void HelloWorld::testGravity()
{
CCPoint mysize = CCDirector::sharedDirector()->getVisibleSize(); CCParticleSystemQuad* quad = CCParticleSystemQuad::create();
this->addChild(quad,1,1); //纹理图片
quad->setTexture( CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png") ); //混合模式
ccBlendFunc cbl = { GL_SRC_ALPHA , GL_ONE};
quad->setBlendFunc(cbl); /********************/
/* 粒子属性 */
/********************/ //粒子生命,单位:秒
quad->setLife(3);
quad->setLifeVar(0.25); //大小,-1表示和初始大小一致
quad->setStartSize(100);
quad->setStartSizeVar(0);
quad->setEndSize(-1);
quad->setEndSizeVar(0); //颜色,ccc4f:取值0~1
quad->setStartColor( ccc4f(192/255.0, 63/255.0, 63/255.0, 63/255.0) );
quad->setStartColorVar( ccc4f(0, 0, 0, 0) );
quad->setEndColor( ccc4f(0, 0, 0, 0) );
quad->setEndColorVar( ccc4f(0, 0, 0, 0) ); //旋转角度
quad->setStartSpin(0);
quad->setStartSpinVar(60);
quad->setEndSpin(180);
quad->setEndSpinVar(30); //发射角度
quad->setAngle(90);
quad->setAngleVar(10); /********************/
/* 发射器子属性 */
/********************/ //最大粒子个数
quad->setTotalParticles(1000); //粒子发射器持续时间,-1为永久
quad->setDuration(-1); //发射速率
quad->setEmissionRate( quad->getTotalParticles()/quad->getLife() ); //发射器位置
quad->setPosition( mysize/2 );
quad->setPosVar( ccp(10,10) ); //重力模式
quad->setEmitterMode(kCCParticleModeGravity); //粒子位置模式
quad->setPositionType(kCCPositionTypeFree); //粒子速度
quad->setSpeed(60);
quad->setSpeedVar(20); //重力加速度
quad->setGravity( ccp(0, 0) ); //径向加速度
quad->setRadialAccel(0);
quad->setRadialAccelVar(0); //切向加速度
quad->setTangentialAccel(0);
quad->setTangentialAccelVar(0);
}
//

2、创建半径发射器模式

不建议使用。

//
void HelloWorld::testRadius()
{
CCPoint mysize = CCDirector::sharedDirector()->getVisibleSize(); CCParticleSystemQuad* quad = CCParticleSystemQuad::create();
this->addChild(quad,1,1); //纹理图片
quad->setTexture( CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png") ); //混合模式
ccBlendFunc cbl = { GL_SRC_ALPHA , GL_ONE};
quad->setBlendFunc(cbl); /********************/
/* 粒子属性 */
/********************/ //粒子生命,单位:秒
quad->setLife(3);
quad->setLifeVar(0.25); //大小,-1表示和初始大小一致
quad->setStartSize(20);
quad->setStartSizeVar(0);
quad->setEndSize(-1);
quad->setEndSizeVar(0); //颜色,ccc4f:取值0~1
quad->setStartColor( ccc4f(192/255.0, 63/255.0, 63/255.0, 63/255.0) );
quad->setStartColorVar( ccc4f(0, 0, 0, 0) );
quad->setEndColor( ccc4f(0, 0, 0, 0) );
quad->setEndColorVar( ccc4f(0, 0, 0, 0) ); //旋转角度
quad->setStartSpin(0);
quad->setStartSpinVar(60);
quad->setEndSpin(180);
quad->setEndSpinVar(30); //发射角度
quad->setAngle(90);
quad->setAngleVar(10); /********************/
/* 发射器子属性 */
/********************/ //最大粒子个数
quad->setTotalParticles(1000); //粒子发射器持续时间,-1为永久
quad->setDuration(-1); //发射速率
quad->setEmissionRate( quad->getTotalParticles()/quad->getLife() ); //发射器位置
quad->setPosition( mysize/2 );
quad->setPosVar( ccp(10,10) ); //环形模式
quad->setEmitterMode(kCCParticleModeRadius); //粒子位置模式
quad->setPositionType(kCCPositionTypeFree); //初始半径
quad->setStartRadius(20);
quad->setStartRadiusVar(1); //结束半径,-1和初始大小一致
quad->setEndRadius(100);
quad->setEndRadiusVar(1); //粒子围绕初始点,每秒旋转角度
quad->setRotatePerSecond(360);
quad->setRotatePerSecondVar(1); }
//

3、创建火焰粒子特效

无需添加纹理图片Texture,可直接使用。

//
void HelloWorld::testParticle()
{
CCParticleFire* quad = CCParticleFire::create();
this->addChild(quad,1,1);
}
//

4、创建自定义plist的粒子特效

plist粒子特效,可以通过“红孩儿工具箱”进行制作。

//
void HelloWorld::testPlist()
{
CCPoint mysize = CCDirector::sharedDirector()->getVisibleSize(); CCParticleSystemQuad* quad = CCParticleSystemQuad::create("1.plist");
quad->setPosition( mysize/2 );
this->addChild(quad,1,1);
}
//

5、运行结果

    

    

cocos2dx基础篇(23) 粒子系统CCParticleSystem的更多相关文章

  1. cocos2dx基础篇(3) 常用重要类

    ---------------------------------------- 入口类main.cpp 主要控制类AppDelegate.cpp -------------------------- ...

  2. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  3. cocos2dx基础篇(22) 基本动画CCAnimation/CCAnimate

    [小知识] CCSpriteFrame     :精灵帧.    它是相对动画而产生的,其实就是一张纹理图片. CCAnimationFrame  :动画帧.    由精灵帧与间隔帧数组成,是动画CC ...

  4. cocos2dx基础篇(15) 列表视图CCTableView

    [3.x] (1)去掉 "CC" (2)TableViewCell 中: > unsigned int getIdx() 返回类型改为 ssize_t(类型为 long) ( ...

  5. cocos2dx基础篇(28) 布景层Layer的三个子类

    [3.x]     (1)去掉 "CC" [CCLayerColor] 颜色布景层CCLayerColor有两个父类:CCLayerRGBA.CCBlendProtocol.相信有 ...

  6. cocos2dx基础篇(27) 屏幕适配

    [3.x]https://blog.csdn.net/qq_40338728/article/details/82964046 [屏幕适配] 1.两个分辨率 1.1.窗口分辨率 在main.cpp中有 ...

  7. cocos2dx基础篇(26) 单例模式

    单例模式,说的通俗一点就是:创建某个类的全局唯一静态实例对象.也就是说从它创建开始,一直到整个游戏程序结束才会释放资源,期间一直保存的着数据. 单例类在大部分游戏中应该是必不可少的部分,如整个游戏音乐 ...

  8. cocos2dx基础篇(25) 简单碰撞检测

    [3.x] 将数学类 CCPoint.CCRect 改为v3.x版本的 Vec2.Rect 就好了. [简单碰撞检测] 在一些游戏中经常会遇到碰撞检测的情况,如愤怒的小鸟飞出去后,是否与石头发生碰撞. ...

  9. cocos2dx基础篇(7) 触碰事件

    cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...

随机推荐

  1. 三大方面,分析 to B和 to C产品的区别

    作为互联网从业者,我们经常听到to B(或2B)和to C(或2C)两个概念.to B即面向企业客户,to C即面向普通用户.只要是互联网人基本都懂知道这两个概念,但如果别人再问“to B和to C产 ...

  2. Java 5,6,7,8,9,10,11新特性

    转自https://it18monkey.github.io java5 泛型 (Generics) List<Integer> list=new ArrayList<Integer ...

  3. HDU6739 2019CCPC秦皇岛赛区 I. Invoker

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6739思路:暴力dp           一个special skill最多有6种排列组合          ...

  4. 红帽Linux故障定位技术详解与实例(2)

    红帽Linux故障定位技术详解与实例(2) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...

  5. 在Controller中使用AOP

    转:http://usherlight.iteye.com/blog/1306111 在Controller中使用AOP的问题主要在于如何让Controller能够被检测到. Controller和其 ...

  6. Linux命令-文件管理(二)

    Linux命令-文件管理(二) Linux gitview命令 Linux gitview命令用于观看文件的内容,它会同时显示十六进制和ASCII格式的字码. 语法:gitview [-bchilv] ...

  7. 15.Python bool布尔类型

    Python 提供了 bool 类型来表示真(对)或假(错),比如常见的5 > 3比较算式,这个是正确的,在程序世界里称之为真(对),Python 使用 True 来代表:再比如4 > 2 ...

  8. springboot+mybatis 使用事务

    一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优点是: 1)非侵入式,业务逻辑不受事务管理代码的污染. 2)方 ...

  9. C++入门经典-例3.20-使用continue跳出循环

    1:continue不是立即跳出循环体,而是跳过本次循环结束前的语句,回到循环的条件测试部分.代码如下: // 3.20.cpp : 定义控制台应用程序的入口点. // #include " ...

  10. C++入门经典-例2.9-输出十六进制数以及大写的十六进制数

    1:代码如下: #include "stdafx.h" #include <iostream> #include <iomanip> using names ...