cocos2d-x 粒子特效
2014-07-15 20:23
253 查看
http://fengyehongyu.blog.163.com/blog/static/344002452012102963120515/
在游戏中很多特效需要我们去实现,以增加我们游戏的视觉感和饱满度,很多特效我们可以用动画来实现,但是使用动画来实现特效,画面的自然程度很差,而且如果美工不给力的话,特效效果也会很不尽人意,同时调整一个动画的细节也会相对的比较麻烦。所以我们使用粒子特效来实现一些需要自然感,带有随机性的特效。如火焰,爆炸,烟花等等都可以用粒子特效来实现。
粒子运行基本流程:
粒子特效实质是很多的精灵,通过粒子系统赋给每个精灵初始属性,然后由发射器发射出来,并在粒子发射的过程中不断的刷新,更新他的属性,让粒子按照设定的方式变换。当粒子寿命到期后,粒子消亡,回到带发射状态,等待初始化发射。如下图所示:
粒子属性设定:
Variance 波动范围:即实际值在原设定值上随机波动的范围(误差),实际值
= 原设定值 + var(var为波动范围内任意值,可正可负),例如Lifespan=5,Lifespan
Variance=3 那么随机出来的结果就是5-3到5+3,即2~8的任意数。
控制例子相对类型:
设置方法:my->setPositionType(kCCPositionTypeRelative);//设置为不跟随屏幕
kCCPositionTypeFree//相对屏幕自由
kCCPositionTypeRelative //相对被绑定精灵静止
kCCPositionTypeGrouped//相对发射点,可向上
发射器属性设定:
发射器分:重力模式和半径模式(放射模式),重力模式下重力模式的粒子参数生效(半径模式参数无效),半径模式下半径模式的参数生效(重力模式参数无效);
OpenGL混合相关说明:
#1神马是混合?
混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
#2混合中的术语
前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,如上例中的红色;把原来的颜色称为“目标颜色”,如上例中的绿色。
OpenGL会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨论这个了)
#3混合公式
下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为:
(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)
当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。
#4各种混合因子
在OpenGL中,源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO: 表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE: 表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。但这些都不是我们现在所需要了解的。毕竟这还是入门教材,不需要整得太复杂~
举例来说:
如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。
如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
注意:
所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕了。
#5混合举例:
glBlendFunc(GL_ONE,GL_ZERO)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
glBlendFunc(GL_ONE,GL_ONE)
纹理Texture:
纹理Texture相当于是每一个粒子的原型,整个粒子特效就是由无数个这样的粒子组成。粒子的贴图没有具体限制,可以是灰度图,也可以是一张具体的图片。但要小于64x64pixel(大小限制带验证,貌似我觉得没有大小限制)。
添加粒子:
只要通过编辑器制作好了粒子特效的plist文件,我们只需把plist和它对应的Textrue原图放到资源文件夹下,然后两句代码就搞定了:
[cpp] view
plaincopyprint?
CCParticleSystem *test=CCParticleSystemQuad::particleWithFile("test.plist");
test->setPosition(ccp(size.width/2,size.height/2));
this->addChild(test);
原图的加载信息是包含在plist文件中的,我们直接加载plist就可以了。
这就是基本的粒子特效的说明了,粒子特效配合重力模式、半径模式的参数调教,可以得到很多意想不到的效果,建议大家多尝试,会有意外收货~。粒子特效博大精深,后面还有什么心得体会我会直接写进来。
最近在学习cocos2d中的粒子效果吧,下面就把学到的和大家分享下吧!
Now!我们先了解下类结构吧
-- CCParticleSystem(所有粒子系统的父类)
-- CCParticleSystemPoint、CCParticleSystemQuad (点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性)
-- CCParticleExplosion (爆炸粒子效果)
-- CCParticleFireworks (烟花粒子效果)
-- CCParticleFire (火焰粒子效果)
-- CCParticleFlower (花束粒子效果)
-- CCParticleGalaxy (星系粒子效果)
-- CCParticleMeteor (流星粒子效果)
-- CCParticleSpiral (漩涡粒子效果)
-- CCParticleSnow (雪粒子效果)
-- CCParticleSmoke (烟粒子效果)
-- CCParticleSun (太阳粒子效果)
-- CCParticleRain (雨粒子效果)
Ok,基本上也就这么多东西吧。都是cocos2d自带的粒子系统,也是蛮强大的。关键玩的不是这些类,而是粒子系统的属性,N多的属性,想调出漂亮的效果还就靠这些属性了。暂且先不管那些,后面会讲到一个工具(Particle Designer),蛮方便的,省去了不少事。现在我们先理解些东西。
1、 有关CCParticleSystemPoint 和CCParticleSystemQuad
大部分粒子系统都会继承这两个系统之一,那到底去继承哪一个呢?我们来分析下:
CCParticleSystemPoint 点粒子系统,消耗内存比较少,运行速度比较快,但这只是说在1、2代机器上,3代以后的性能就不咋地了。
CCParticleSystemQuad 方形粒子系统,在3代以后的机器上运行的比较快, 他会消耗更多的内存和CPU。
可谓各有利弊哈!那么我们可以在代码中根据不同的机器来选择最佳的粒子系统么?
答案是可以的。
使用预处理器ARCH_OPTIMAL_PARTICLE_SYSTEM来定义粒子系统,在代码编译过程中来判断使用哪一个粒子系统。会自动的根据机型选择合适的粒子系统
例:@interface CCParticleExplosion : ARCH_OPTIMAL_PARTICLE_SYSTEM
2、 有关粒子贴图
粒子贴图必须小于64x64的,越小越好。
可以将贴图嵌入到Particle Designer中(缺点:修改贴图不方便),也可导入工程中self.texture = [[CCTextureCachesharedTextureCache] addImage:particleFile]。
好了,下一步我们就来学习下粒子工具 ParticleDesigner,一个可视调属性工具。下载地址:http://particledesigner.71squared.com.这个工具怎么来用就不细说了,打开此工具一目了然。在此说下在项目中怎么来用这个工具导出的文件。
1、 点击工具中SAVE,保存为.plist格式文件,然后将文件导入到项目中(最基本的就不用说了)。
2、 然后实例化粒子对象 (这里必须用ARCH_OPTIMAL_PARTICLE_SYSTEM来初始化,如果用父类CCParticleSystem将什么都看不到)
CCParticleSystem * system;
system = [ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile
"fx-explosion.plist"];
[self addChild:system z:1 tag:1];
3、 OK接下来可以修改下在工具中不能修改的属性
system.positionType = kCCPositionTypeFree;
system.autoRemoveOnFinish = YES;//发射完粒子消失后从父节点移除
system.position = ccp(100, 100);//粒子发射器位置
需要注意一点的是 positionType 这个属性,翻看Himi 的教程,里面有个讲到粒子会随精灵的位置变动而变动。这都取决于这个属性的设定。有三个值:
kCCPositionTypeRelative 相对模式, 粒子发射器会随精灵移动而移动,可用于制作角色身上特效等等
kCCPositionTypeGrouped 这个和上边的产生效果一样(实验得到的结果),区别在于这个是粒子随发射器移动而移动
kCCPositionTypeFree 自由模式, 不会随粒子节点移动而移动(可产生火焰、蒸汽等效果)
4、 最后我们再说个在测试中遇到的问题, 当要显示粒子效果时,在界面上会轻微的卡下,这是粒子在加载贴图资源。这个问题不解决可能会使游戏变得不流畅了。在这里我们可以使用预加载机制,这个方法也是跟教程学的,嘿嘿!学习无处不在嘛!
首先,我们在游戏进入的场景的初始化init中加入[self preloadParticleEffect];
- (void)preloadParticleEffect
{
[ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile
"fx-explosion.plist"];
}
因为particleWithFile方法是以自动释放的方式初始化的粒子,因此不用关心他们的内存释放问题。
当他们释放掉以后他们的贴图会保留再缓存(CCTextureCache)中,因此解决了粒子显示时及时加载贴图的问题。
如果"fx-explosion.plist"里面没有嵌贴图,那就用[[CCTextureCachesharedTextureCache]addImage
"fire.png"];这个方式先把贴图加入缓存啦。
调效果那就需要大家自己用工具调了,貌似不 那么容易 。。。大家加油吧! 有什么要补充的提出来哈,大家一起学习嘛 。。。
基本的设置
Max Particles 粒子的数量
Lifespan 生命周期, 周期越长屏幕上同事存在的粒子数量就越多
LifespanVariance 生命周期的变量值,例如生命周期为5,变量为1,那么生命周期就会在5-1和5+1之间随机一个数
Start Size 开始的粒子大小
Start SizeVariance 开始粒子大小的变量值
Finish Size 结束的粒子大小
Finish SizeVariance 结束粒子大小的变量值
Particle EmitAngle 粒子发射的角度
Particle EmitAngle Variance 粒子发射角度变量值
Position Y 发射的Y坐标
Position X 发射的X坐标
Duration 持续时间,当为 -1时候是持久的
发射模式设置
Gracity 重力模式
Speed 粒子速度
Speed Variance 速度变量值
Gracity x 粒子重力下X轴上的加速度
Gravity y 粒子重力下Y轴上的加速度
Radial Acceleration 当是正数时,离发射器越远,加速就越大;否则相反
Radial Acceleration Variance 以上的浮动值
Tangential Acceleration 让粒子旋转围着发射器运动,越远加速越快。当为正时,逆时针旋转;否则相反
Radial 半径模式(让粒子沿着一个圆形旋转,可产生漩涡、螺旋效果)
Max Radius 最大半径
Max Radius Variance 以上浮动值
Min Radius 最小半径
Deg.Per.Second影响粒子移动的方向和速度
Deg.Per.Second Var 以上浮动值
颜色模式(ccColor4F)
Red 红
Blue 蓝
Green 绿
Alpha 透明度
粒子混合模式Blend Function
来源Source和目标Destination这个两个值都为以下几种情况:
GL_ZERO
GL_ONE
GL_SRC_COLOR
GL_ONE_MINUS_SRC_COLOR
GL_SRC_ALPHA
GL_ONE_MINUS_SRC_ALPHA
GL_DST_ALPHA
GL_ONE_MINUS_DST_ALPHA
比如:
来源混合模式GL_SRC_ALPHA和目标混合模式GL_ONE_MINUS_SRC_ALPHA的话,得到的 将会是透明的粒子。
来源混合模式GL_SRC_ALPHA和目标混合模式GL_ONE经常配合使用来生成递增型 的混合效
第一次接触粒子系统,以前游戏里面的一些小特效,像制作动画一样,是采用一帧一帧的切出来的,由于这种特效,变化无常,切出来的帧,都非常的大,也很耗内存,一下就内存溢出了......呵呵~ 主要是以前都没有接触过... 现在接触了,以后游戏就可以用到了...开心!
//创建一个CCParticleSystem粒子系统
CCParticleSystem* ignore = CCParticleSystemQuad::create("Particles/SmallSun.plist");
//第一种创建节点方式
CCNode *parent1 = CCNode::create();//创建一个节点
//第二种创建节点方式
CCNode *parent2 = CCParticleBatchNode::create(ignore->getTexture());
//第一种:创建一个CCParticleSystemQuad系统:每个粒子用4个点(Quad,矩形)表示的粒子系统
CCParticleSystemQuad *emitter = CCParticleSystemQuad::create("Particles/SmallSun.plist");
//第二种:创建CCParticleSystemQuad系统
m_emitter = new CCParticleSystemQuad();
std::string filename = "Particles/" +“粒子资源文件名字”+ ".plist";
m_emitter->initWithFile(filename.c_str());
下面是一些常用设置:
emitter1->setStartColor(ccc4f(1,0,0,1));//设置粒子RGBA值
emitter1->setBlendAdditive(false);//是否添加混合
emitter1->setPosition(ccp( s.width/2-30, s.height/2+60*neg));//设置发射粒子的位置
emitter->setAutoRemoveOnFinish(true);//完成后制动移除
//将粒子系统添加到节点(也可以直接将其添加到一个背景精灵CCSprite里面)
parent1->addChild(emitter1, 0, 1);
//然后在添加到层里面
layer->addChild(parent1, 10, 1000+i);
CCParticleSystem中的常用设置参数表:
struct {
//重力和方向的向量
CCPoint gravity;
//速度
float speed;
//粒子的速度差异
float speedVar;
//粒子的切线加速度
float tangentialAccel;
//粒子间的切线加速度差异
float tangentialAccelVar;
//粒子的径向加速度
float radialAccel;
//粒子间的径向加速度差异
float radialAccelVar;
} modeA;
struct {
//粒子开始半径
float startRadius;
//粒子间开始半径差异
float startRadiusVar;
//粒子结束半径
float endRadius;
//粒子间结束半径差异
float endRadiusVar;
//粒子每秒的旋转角度
float rotatePerSecond;
//粒子间每秒的旋转角度差异
float rotatePerSecondVar;
} modeB;
cocos2dx已经为我们提供了非常多的粒子系统效果:
CCParticleExplosion爆炸
CCParticleFire 火
CCParticleFireworks烟火
CCParticleFlower花
CCParticleGalaxy 银河
CCParticleMeteor 流行
CCParticleRain 下雨
CCParticleSmoke 下雪
CCParticleSnow 炊烟
CCParticleSpiral 螺旋
CCParticleSun 太阳焰
在游戏中很多特效需要我们去实现,以增加我们游戏的视觉感和饱满度,很多特效我们可以用动画来实现,但是使用动画来实现特效,画面的自然程度很差,而且如果美工不给力的话,特效效果也会很不尽人意,同时调整一个动画的细节也会相对的比较麻烦。所以我们使用粒子特效来实现一些需要自然感,带有随机性的特效。如火焰,爆炸,烟花等等都可以用粒子特效来实现。
粒子运行基本流程:
粒子特效实质是很多的精灵,通过粒子系统赋给每个精灵初始属性,然后由发射器发射出来,并在粒子发射的过程中不断的刷新,更新他的属性,让粒子按照设定的方式变换。当粒子寿命到期后,粒子消亡,回到带发射状态,等待初始化发射。如下图所示:
粒子属性设定:
Variance 波动范围:即实际值在原设定值上随机波动的范围(误差),实际值
= 原设定值 + var(var为波动范围内任意值,可正可负),例如Lifespan=5,Lifespan
Variance=3 那么随机出来的结果就是5-3到5+3,即2~8的任意数。
控制例子相对类型:
设置方法:my->setPositionType(kCCPositionTypeRelative);//设置为不跟随屏幕
kCCPositionTypeFree//相对屏幕自由
kCCPositionTypeRelative //相对被绑定精灵静止
kCCPositionTypeGrouped//相对发射点,可向上
发射器属性设定:
发射器分:重力模式和半径模式(放射模式),重力模式下重力模式的粒子参数生效(半径模式参数无效),半径模式下半径模式的参数生效(重力模式参数无效);
OpenGL混合相关说明:
#1神马是混合?
混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。
假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。
#2混合中的术语
前面我们已经提到,混合需要把原来的颜色和将要画上去的颜色找出来,经过某种方式处理后得到一种新的颜色。这里把将要画上去的颜色称为“源颜色”,如上例中的红色;把原来的颜色称为“目标颜色”,如上例中的绿色。
OpenGL会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨论这个了)
#3混合公式
下面用数学公式来表达一下这个运算方式。假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs, Gs, Bs, As),目标颜色的四个分量是(Rd, Gd, Bd, Ad),又设源因子为(Sr, Sg, Sb, Sa),目标因子为(Dr, Dg, Db, Da)。则混合产生的新颜色可以表示为:
(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)
当然了,如果颜色的某一分量超过了1.0,则它会被自动截取为1.0,不需要考虑越界的问题。
#4各种混合因子
在OpenGL中,源因子和目标因子是可以通过glBlendFunc函数来进行设置的。glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO: 表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE: 表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。
除此以外,还有GL_SRC_COLOR(把源颜色的四个分量分别作为因子的四个分量)、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前两个在OpenGL旧版本中只能用于设置目标因子,后两个在OpenGL旧版本中只能用于设置源因子。新版本的OpenGL则没有这个限制,并且支持新的GL_CONST_COLOR(设定一种常数颜色,将其四个分量分别作为因子的四个分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外还有GL_SRC_ALPHA_SATURATE。新版本的OpenGL还允许颜色的alpha值和RGB值采用不同的混合因子。但这些都不是我们现在所需要了解的。毕竟这还是入门教材,不需要整得太复杂~
举例来说:
如果设置了glBlendFunc(GL_ONE, GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。
如果设置了glBlendFunc(GL_ZERO, GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途)
如果设置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。
如果设置了glBlendFunc(GL_ONE, GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。
注意:
所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕了。
#5混合举例:
glBlendFunc(GL_ONE,GL_ZERO)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
glBlendFunc(GL_ONE,GL_ONE)
纹理Texture:
纹理Texture相当于是每一个粒子的原型,整个粒子特效就是由无数个这样的粒子组成。粒子的贴图没有具体限制,可以是灰度图,也可以是一张具体的图片。但要小于64x64pixel(大小限制带验证,貌似我觉得没有大小限制)。
添加粒子:
只要通过编辑器制作好了粒子特效的plist文件,我们只需把plist和它对应的Textrue原图放到资源文件夹下,然后两句代码就搞定了:
[cpp] view
plaincopyprint?
CCParticleSystem *test=CCParticleSystemQuad::particleWithFile("test.plist");
test->setPosition(ccp(size.width/2,size.height/2));
this->addChild(test);
原图的加载信息是包含在plist文件中的,我们直接加载plist就可以了。
这就是基本的粒子特效的说明了,粒子特效配合重力模式、半径模式的参数调教,可以得到很多意想不到的效果,建议大家多尝试,会有意外收货~。粒子特效博大精深,后面还有什么心得体会我会直接写进来。
最近在学习cocos2d中的粒子效果吧,下面就把学到的和大家分享下吧!
Now!我们先了解下类结构吧
-- CCParticleSystem(所有粒子系统的父类)
-- CCParticleSystemPoint、CCParticleSystemQuad (点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性)
-- CCParticleExplosion (爆炸粒子效果)
-- CCParticleFireworks (烟花粒子效果)
-- CCParticleFire (火焰粒子效果)
-- CCParticleFlower (花束粒子效果)
-- CCParticleGalaxy (星系粒子效果)
-- CCParticleMeteor (流星粒子效果)
-- CCParticleSpiral (漩涡粒子效果)
-- CCParticleSnow (雪粒子效果)
-- CCParticleSmoke (烟粒子效果)
-- CCParticleSun (太阳粒子效果)
-- CCParticleRain (雨粒子效果)
Ok,基本上也就这么多东西吧。都是cocos2d自带的粒子系统,也是蛮强大的。关键玩的不是这些类,而是粒子系统的属性,N多的属性,想调出漂亮的效果还就靠这些属性了。暂且先不管那些,后面会讲到一个工具(Particle Designer),蛮方便的,省去了不少事。现在我们先理解些东西。
1、 有关CCParticleSystemPoint 和CCParticleSystemQuad
大部分粒子系统都会继承这两个系统之一,那到底去继承哪一个呢?我们来分析下:
CCParticleSystemPoint 点粒子系统,消耗内存比较少,运行速度比较快,但这只是说在1、2代机器上,3代以后的性能就不咋地了。
CCParticleSystemQuad 方形粒子系统,在3代以后的机器上运行的比较快, 他会消耗更多的内存和CPU。
可谓各有利弊哈!那么我们可以在代码中根据不同的机器来选择最佳的粒子系统么?
答案是可以的。
使用预处理器ARCH_OPTIMAL_PARTICLE_SYSTEM来定义粒子系统,在代码编译过程中来判断使用哪一个粒子系统。会自动的根据机型选择合适的粒子系统
例:@interface CCParticleExplosion : ARCH_OPTIMAL_PARTICLE_SYSTEM
2、 有关粒子贴图
粒子贴图必须小于64x64的,越小越好。
可以将贴图嵌入到Particle Designer中(缺点:修改贴图不方便),也可导入工程中self.texture = [[CCTextureCachesharedTextureCache] addImage:particleFile]。
好了,下一步我们就来学习下粒子工具 ParticleDesigner,一个可视调属性工具。下载地址:http://particledesigner.71squared.com.这个工具怎么来用就不细说了,打开此工具一目了然。在此说下在项目中怎么来用这个工具导出的文件。
1、 点击工具中SAVE,保存为.plist格式文件,然后将文件导入到项目中(最基本的就不用说了)。
2、 然后实例化粒子对象 (这里必须用ARCH_OPTIMAL_PARTICLE_SYSTEM来初始化,如果用父类CCParticleSystem将什么都看不到)
CCParticleSystem * system;
system = [ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile
"fx-explosion.plist"];
[self addChild:system z:1 tag:1];
3、 OK接下来可以修改下在工具中不能修改的属性
system.positionType = kCCPositionTypeFree;
system.autoRemoveOnFinish = YES;//发射完粒子消失后从父节点移除
system.position = ccp(100, 100);//粒子发射器位置
需要注意一点的是 positionType 这个属性,翻看Himi 的教程,里面有个讲到粒子会随精灵的位置变动而变动。这都取决于这个属性的设定。有三个值:
kCCPositionTypeRelative 相对模式, 粒子发射器会随精灵移动而移动,可用于制作角色身上特效等等
kCCPositionTypeGrouped 这个和上边的产生效果一样(实验得到的结果),区别在于这个是粒子随发射器移动而移动
kCCPositionTypeFree 自由模式, 不会随粒子节点移动而移动(可产生火焰、蒸汽等效果)
4、 最后我们再说个在测试中遇到的问题, 当要显示粒子效果时,在界面上会轻微的卡下,这是粒子在加载贴图资源。这个问题不解决可能会使游戏变得不流畅了。在这里我们可以使用预加载机制,这个方法也是跟教程学的,嘿嘿!学习无处不在嘛!
首先,我们在游戏进入的场景的初始化init中加入[self preloadParticleEffect];
- (void)preloadParticleEffect
{
[ARCH_OPTIMAL_PARTICLE_SYSTEM particleWithFile
"fx-explosion.plist"];
}
因为particleWithFile方法是以自动释放的方式初始化的粒子,因此不用关心他们的内存释放问题。
当他们释放掉以后他们的贴图会保留再缓存(CCTextureCache)中,因此解决了粒子显示时及时加载贴图的问题。
如果"fx-explosion.plist"里面没有嵌贴图,那就用[[CCTextureCachesharedTextureCache]addImage
"fire.png"];这个方式先把贴图加入缓存啦。
调效果那就需要大家自己用工具调了,貌似不 那么容易 。。。大家加油吧! 有什么要补充的提出来哈,大家一起学习嘛 。。。
基本的设置
Max Particles 粒子的数量
Lifespan 生命周期, 周期越长屏幕上同事存在的粒子数量就越多
LifespanVariance 生命周期的变量值,例如生命周期为5,变量为1,那么生命周期就会在5-1和5+1之间随机一个数
Start Size 开始的粒子大小
Start SizeVariance 开始粒子大小的变量值
Finish Size 结束的粒子大小
Finish SizeVariance 结束粒子大小的变量值
Particle EmitAngle 粒子发射的角度
Particle EmitAngle Variance 粒子发射角度变量值
Position Y 发射的Y坐标
Position X 发射的X坐标
Duration 持续时间,当为 -1时候是持久的
发射模式设置
Gracity 重力模式
Speed 粒子速度
Speed Variance 速度变量值
Gracity x 粒子重力下X轴上的加速度
Gravity y 粒子重力下Y轴上的加速度
Radial Acceleration 当是正数时,离发射器越远,加速就越大;否则相反
Radial Acceleration Variance 以上的浮动值
Tangential Acceleration 让粒子旋转围着发射器运动,越远加速越快。当为正时,逆时针旋转;否则相反
Radial 半径模式(让粒子沿着一个圆形旋转,可产生漩涡、螺旋效果)
Max Radius 最大半径
Max Radius Variance 以上浮动值
Min Radius 最小半径
Deg.Per.Second影响粒子移动的方向和速度
Deg.Per.Second Var 以上浮动值
颜色模式(ccColor4F)
Red 红
Blue 蓝
Green 绿
Alpha 透明度
粒子混合模式Blend Function
来源Source和目标Destination这个两个值都为以下几种情况:
GL_ZERO
GL_ONE
GL_SRC_COLOR
GL_ONE_MINUS_SRC_COLOR
GL_SRC_ALPHA
GL_ONE_MINUS_SRC_ALPHA
GL_DST_ALPHA
GL_ONE_MINUS_DST_ALPHA
比如:
来源混合模式GL_SRC_ALPHA和目标混合模式GL_ONE_MINUS_SRC_ALPHA的话,得到的 将会是透明的粒子。
来源混合模式GL_SRC_ALPHA和目标混合模式GL_ONE经常配合使用来生成递增型 的混合效
第一次接触粒子系统,以前游戏里面的一些小特效,像制作动画一样,是采用一帧一帧的切出来的,由于这种特效,变化无常,切出来的帧,都非常的大,也很耗内存,一下就内存溢出了......呵呵~ 主要是以前都没有接触过... 现在接触了,以后游戏就可以用到了...开心!
//创建一个CCParticleSystem粒子系统
CCParticleSystem* ignore = CCParticleSystemQuad::create("Particles/SmallSun.plist");
//第一种创建节点方式
CCNode *parent1 = CCNode::create();//创建一个节点
//第二种创建节点方式
CCNode *parent2 = CCParticleBatchNode::create(ignore->getTexture());
//第一种:创建一个CCParticleSystemQuad系统:每个粒子用4个点(Quad,矩形)表示的粒子系统
CCParticleSystemQuad *emitter = CCParticleSystemQuad::create("Particles/SmallSun.plist");
//第二种:创建CCParticleSystemQuad系统
m_emitter = new CCParticleSystemQuad();
std::string filename = "Particles/" +“粒子资源文件名字”+ ".plist";
m_emitter->initWithFile(filename.c_str());
下面是一些常用设置:
emitter1->setStartColor(ccc4f(1,0,0,1));//设置粒子RGBA值
emitter1->setBlendAdditive(false);//是否添加混合
emitter1->setPosition(ccp( s.width/2-30, s.height/2+60*neg));//设置发射粒子的位置
emitter->setAutoRemoveOnFinish(true);//完成后制动移除
//将粒子系统添加到节点(也可以直接将其添加到一个背景精灵CCSprite里面)
parent1->addChild(emitter1, 0, 1);
//然后在添加到层里面
layer->addChild(parent1, 10, 1000+i);
CCParticleSystem中的常用设置参数表:
struct {
//重力和方向的向量
CCPoint gravity;
//速度
float speed;
//粒子的速度差异
float speedVar;
//粒子的切线加速度
float tangentialAccel;
//粒子间的切线加速度差异
float tangentialAccelVar;
//粒子的径向加速度
float radialAccel;
//粒子间的径向加速度差异
float radialAccelVar;
} modeA;
struct {
//粒子开始半径
float startRadius;
//粒子间开始半径差异
float startRadiusVar;
//粒子结束半径
float endRadius;
//粒子间结束半径差异
float endRadiusVar;
//粒子每秒的旋转角度
float rotatePerSecond;
//粒子间每秒的旋转角度差异
float rotatePerSecondVar;
} modeB;
cocos2dx已经为我们提供了非常多的粒子系统效果:
CCParticleExplosion爆炸
CCParticleFire 火
CCParticleFireworks烟火
CCParticleFlower花
CCParticleGalaxy 银河
CCParticleMeteor 流行
CCParticleRain 下雨
CCParticleSmoke 下雪
CCParticleSnow 炊烟
CCParticleSpiral 螺旋
CCParticleSun 太阳焰
相关文章推荐
- cocos2d-x (四)粒子特效相关说明
- 特效编辑器开发手记1――令人蛋疼菊紧的Cocos2d-x动态改变粒子数
- cocos2d-x 11中粒子特效
- cocos2d-x (四)粒子特效相关说明
- 使用 Cocos2d-x 和粒子编辑器实现“天天爱消除”场景特效
- 使用 Cocos2d-x 和粒子编辑器实现“天天爱消除”场景特效
- 【iOS-Cocos2d游戏开发之十】添加粒子特效并解决粒子系统特效与Layer之间的坐标问题;
- Cocos2d-x 粒子编辑器使用和渲染特效
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- cocos2d-x 自带11种粒子特效
- Cocos2D游戏之旅(六):流星、烟花、火焰、下雪、下雨粒子特效
- cocos2d-x (四)粒子特效相关说明
- Cocos2d-x 和粒子编辑器实现“天天爱消除”场景特效
- Cocos2d-x 中的 11种粒子特效
- 【Cocos2d游戏开发之十】添加粒子特效并解决粒子系统特效与Layer之间的坐标问题;
- Cocos2d-x学习笔记(十四)-------->粒子特效
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- 使用Cocos2d-x 和粒子编辑器实现“天天爱消除”场景特效
- 【iOS-Cocos2d游戏开发之十】添加粒子系统特效并解决粒子特效与Layer之间的坐标问题;
- cocos2d-x 自带11种粒子特效