【唠叨】

粒子系统CCParticleSystem,第一次听到这名词,感觉好高级的样子啊。

i_f32.gif

其实在游戏中我们也经常能见到的,像燃烧的火焰、飘散的烟雾、爆炸、暴风雪、流星、雨水、闪电等等都是粒子特效。

给大家看一张甜美的粒子特效:

wKiom1QDNBzj9IYzAAIduD0EWgc443.gif

因为粒子系统的知识比较复杂,所以在这里,强烈建议大家下载一个粒子编辑器,通过编辑粒子特效,来学习粒子系统。

我就是借助了以下这个“红孩儿工具箱”,来学习粒子系统的。

wKioL1QEcDHCSmagAAOnZyku2N8610.jpg

【致谢】

http://blog.csdn.net/honghaier(提供了强大的“红孩儿工具箱”)

http://www.jb51.cc/article/p-kxbrzgaj-vm.html(提供了详细的原理)

【小知识】

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

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

【Demo下载】

http://down.51cto.com/data/1869970

【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//半径发射器//

(4)其他变化不大。

【CCParticleSystem】

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

wKiom1QDRL2ySa0RAAB3E8pel4U629.jpg

1、原理

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

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

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

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

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

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

wKioL1QECSSgjpeKAADb_BXNzm0765.jpg

来个具体的粒子发射图:

wKioL1QEDROhCtOaAAC1ZbM30x0928.jpg

2、粒子属性

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

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

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

wKioL1QEK8SQZSvjAATSneo4-cY762.jpg

3、发射器属性

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

3.1、发射器共有属性

wKioL1QEbeLgkH8WAAXgZ7s00Y4897.jpg

3.2、重力发射器

wKioL1QEbrrwKbW7AAOY4mNgRnM563.jpg

3.3、半径发射器

wKiom1QEbtLSkUWHAAL2ODJMw3s396.jpg

4、现成粒子特效

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

如下列出11种粒子特效:

粒子特效类 中文名 特效图
CCParticleExplosion 爆炸特效

wKioL1QElTnxsvynAAOhhjdFpnQ245.gif

CCParticleFire 火焰特效

wKioL1QElXfxvPr4AAJ5EL27VA4957.gif

CCParticleFlower 花束特效

wKioL1QElpCBGs-fAAM5uk4Fkwo114.gifocg.gif">

CCParticleFireworks 烟花特效

wKiom1QElpDCz8dVAAHRRjeRu8U947.gif

CCParticlegalaxy 星系特效

galaxy.gif" alt="wKiom1QElpCTS1fBAAHGotw6_5g755.gif" style="border:0px;vertical-align:middle;" src="http://www.dexcoder.com/images/201507/N9QiBocd0UZ1wZu5.gif">

CCParticleMeteor 流星特效

wKioL1QElpGA-JsyAALJgHqUsUY422.gif

CCParticleRain 下雨特效

wKiom1QElpHic2uAAADwya6Jcl8519.gif

CCParticleSmoke 烟雾特效

wKioL1QElxuBhfVlAAHNxnAtaDc841.gif

CCParticleSNow 下雪特效

Now.gif" alt="wKioL1QElpHxVbpCAAcTynw2yOY759.gif" style="border:0px;vertical-align:middle;" src="http://www.dexcoder.com/images/201507/v9xgMznhbr1OnDv2.gif">

CCParticleSpiral 漩涡特效

piral.gif" alt="wKiom1QElpKgVyqnAA-UOFdZTZ4915.gif" style="border:0px;vertical-align:middle;" src="http://www.dexcoder.com/images/201507/7StZ8wdKVU5bxwkO.gif">

CCParticleSun 太阳特效

wKioL1QEl<a href=plt2r3LAACvjfQFuCQ333.gif" style="border:0px;vertical-align:middle;" src="http://www.dexcoder.com/images/201507/t3p1dFnBS3bTPox9.gif">

5、混合方式

参考:http://www.jb51.cc/article/p-fpnoljdp-wx.html

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

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

使用方法如下举例:

//
	//{源因子,混合因子}
	ccBlendFunccbl={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、创建重力发射器模式

不建议使用。

//
	voidHelloWorld::testGravity()
	{
		CCPointmysize=CCDirector::sharedDirector()->getVisibleSize();
		CCParticleSystemQuad*quad=CCParticleSystemQuad::create();
		this->addChild(quad,1,1);
	//纹理图片
		quad->setTexture(CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png"));
	//混合模式
		ccBlendFunccbl={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));
		quad->setStartColorVar(ccc4f(0,0));
		quad->setEndColor(ccc4f(0,0));
		quad->setEndColorVar(ccc4f(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、创建半径发射器模式

// voidHelloWorld::tesTradius() { CCPointmysize=CCDirector::sharedDirector()->getVisibleSize(); CCParticleSystemQuad*quad=CCParticleSystemQuad::create(); this->addChild(quad,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,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,可直接使用。

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

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

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

//
	voidHelloWorld::testPlist()
	{
		CCPointmysize=CCDirector::sharedDirector()->getVisibleSize();
		CCParticleSystemQuad*quad=CCParticleSystemQuad::create("1.plist");
		quad->setPosition(mysize/2);
		this->addChild(quad,255);">5、运行结果 

wKiom1QE1dGzrfN7AASA9ZQKHOY175.gif

wKioL1QE1dLTxDDPAAXbM5kR9yg836.gif

wKiom1QE1dKwp7AJAAhLNkpvsiI400.gif

wKioL1QE1dODQ03FAALwqKCEi1k382.gif

6、分析与总结

(1)明显发现使用1、2方法创建粒子特效太过繁琐,并且属性值也不容易控制。

(2)推荐使用现有粒子特效,或者使用“红孩儿工具箱”制作粒子特效。

cocos2dx 粒子系统CCParticleSystem的更多相关文章

  1. osx – mountainlion apr编译缺少’cc’

    尝试使用XCode版本4.4.1在MountainLion上构建mod_auth_openid,我收到一个关于缺少“cc”命令的投诉,如下所示:该怎么办?解决方法我试图在Mac上使用自制软件安装mod_wsgi时遇到类似的问题.虽然bmargulies通过指向github链接在他的评论中发布了答案.但是仍然在这里发布解决方案的完整性.运行以下命令.然后重新运行安装命令

  2. swift – SceneKit:应用程序在SCNView上渲染SpriteKit粒子系统时崩溃,当所有代码似乎都是系统代码的一部分时如何调试

    在SCNView的overlaySKScene属性中运行SpriteKit粒子系统会导致应用程序崩溃,并显示下面的堆栈跟踪.基于堆栈跟踪,似乎所有系统代码都在运行,所以你应该如何调试崩溃,更重要的是,确定它是否是SceneKit/SpriteKit的错误或应用程序中的错误?

  3. THREE.JS入门教程(4)创建粒子系统

    Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D本文将介绍创建一个粒子系统/风格/引入物理等等,感兴趣的朋友可以了解下哦,希望本文对你有所帮助

  4. 用PHP和ACCESS写聊天室(八)

    emotion.php3:代码如下:表情动作

  5. PHP利用COM对象访问SQLServer、Access

    PHP4.0.6以上可以在Win32平台中访问COM和DCOM对象。这里借用ASP思想访问一下SQLServer。当然你也可以用mssql系列函数。如果是一个ASPCoder,你会觉得下面代码非常眼熟,习惯----无他,但PHP强尔~_~:怎么样,很简单吧?对于ASPCoder,万一突然你的BOSS接到一个PHP项目的单子,你也不必惊慌,花一点时候你也可以顺利地进行开发了~访问SQLServer的存储过程,也和ASP的做法几乎一样。

  6. 用PHP和ACCESS写聊天室(九)

    >输入房间口令

  7. 从C/C++迁移到PHP——判断字符类型的函数

    在C/C中,头文件ctype.h中定义了关于字符类型一组宏,可以得到给定字符的类型。而PHP中没有相关函数。前些天发现在www.mm4.de下载的PHP中提供了一个名为php_ctype.dll的扩展库,加载后发现提供一部分此类的函数,特整理出来供大家参考。>可以看到以下信息:ctypectypefunctionsenabled然后就可以使用它所提供的函数了。所有函数的用法同C/C基本相同,区别在于在C/C中函数的参数是字符型,而在PHP中函数的参数可以是字符串。php$string="123ADAADA

  8. 用PHP和ACCESS写聊天室(七)

    chtcont.php3:代码如下:

  9. IOS 粒子系统 (CAEmitterLayer)实例详解

    这篇文章主要介绍了IOS 粒子系统 (CAEmitterLayer)实例详解的相关资料,需要的朋友可以参考下

  10. Access数据库导入Mysql的方法之一

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部