简介

粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象、物理现象及空间扭曲上具备得天独厚的优势,为我们实现一些真实自然而又带有随机性的特效(如爆炸、烟花、水流)提供了方便。Cocos2d-x引擎中就为我们提供了强大的粒子系统,以下是粒子系统的继承关系图:

粒子属性

主要属性:

  • _duration 发射器生存时间,即它可以发射粒子的时间,注意这个时间和粒子生存时间不同。单位秒,-1表示永远;粒子发射结束后可点击工具栏的播放按钮再次发射
  • _emissionRate 每秒喷发的粒子数目
  • _emitterMode 喷发器模式,有重力模式(GraviTY)和半径模式(RADIUS,也叫放射模式)两种
  • _totalParticles 场景中存在的最大粒子数目,往往与_emissionRate配合起来使用
  • _isAutoRemoveOnFinish 粒子结束时是否自动删除

重力模式(modeA):

顾名思义,重力模式模拟重力,可让粒子围绕一个中心点移近或移远,它的优点是非常动态,而且移动有规则。下列各属性只在重力模式下起作用。

  • gravity 重力X
  • radiaAccel 粒子径向加速度,即平行于重力方向的加速度
  • radiaAccelVar 粒子径向加速度变化范围
  • speed 速度
  • speedVar 速度变化范围
  • tangentialAccel 粒子切向加速度,即垂直于重力方向的加速度
  • tangentialAccelVar 粒子切向加速度变化范围

半径模式(modeB):

半径模式可以使粒子以圆圈方式旋转,它也可以创造螺旋效果让粒子急速前进或后退。下列各属性只在半径模式下起作用。

  • endRadius 结束半径
  • endRadiusVar 结束半径变化范围,即结束半径值的范围在 (endRadius - endRadiusVar) 和 (endRadius + endRadiusVar )之间,下面类似。
  • rotatePerSecond 粒子每秒围绕起始点的旋转角度
  • rotatePerSecondVar 粒子每秒围绕起始点的旋转角度变化范围
  • starTradius 初始半径
  • starTradiusVar 初始半径变化范围

生命属性:

  • _life 粒子生命,即粒子的生存时间
  • _lifeVar 粒子生命变化范围

大小属性:

  • _endSize 粒子结束时的大小,-1表示和初始大小一致
  • _endSizeVar 粒子结束大小的变化范围
  • _startSize 粒子的初始大小
  • _startSizeVar 粒子初始大小的变化范围

角度属性:

  • _angle 粒子角度
  • _angleVar 粒子角度变化范围

颜色属性:

  • _endColor 粒子结束颜色
  • _endColorVar 粒子结束颜色变化范围
  • _startColor 粒子初始颜色
  • _startColorVar 粒子初始颜色变化范围
    如果你不想编辑出五颜六色的粒子效果,那应该把_endColorVar,_startColorVar尽量设置为(0,0)。

位置属性:

  • _positionType 粒子位置类型,有自由模式(FREE)、相对模式(RELATIVE)和打组模式(GROUPED)三种。
  • _posVar 发射器位置的变化范围(横向和纵向)
  • _sourcePosition 发射器原始坐标位置
  • Free自由模式,相对于屏幕自由,不会随粒子节点移动而移动(可产生火焰、蒸汽等效果);
  • Relative相对模式,相对于被绑定的Node静止,粒子发射器会随Node移动而移动,可用于制作移动角色身上的特效等等;
  • Grouped打组模式是相对于发射点的,粒子随发射器移动而移动。

自旋属性:

  • _endSpin 粒子结束自旋角度
  • _endSpinVar 粒子结束自旋角度变化范围
  • _startSpin 粒子开始自旋角度
  • _startSpinVar 粒子开始自旋角度变化范围

纹理渲染属性:

  • _texture 粒子贴图纹理
  • _blendFunc 纹理的混合模式方法,有disABLE、ALPHA_PREMULTIPLIED、ALPHA_NON_PREMULTIPLIED、ADDITIVE四种类型。
    • disABLE = {GL_ONE,GL_ZERO};
    • ALPHA_PREMULTIPLIED = {GL_ONE,GL_ONE_MINUS_SRC_ALPHA};
    • ALPHA_NON_PREMULTIPLIED = {GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA};
    • ADDITIVE = {GL_SRC_ALPHA,GL_ONE};

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值来作为因子。
Cocos2dx使用OpenGL混合原理对图形进行渲染绘制。混合就是指把两种颜色混在一起,具体一点就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。它是一种常用的技巧,通常可以用来实现半透明,你也可以通过不同的设置得到不同的混合结果,产生一些有趣或者奇怪的图象。

这里的图形学原理可以看本人的另一篇博文:《DirectX11 混合状态》

ParticleBatchNode

ParticleBatchNode 和批处理节点一样,它将通过一次调用OpenGL来绘制它的子节点。 ParticleBatchNode 实例可以引用一个且只能引用一个 texture 的对象。 只有 ParticleSystem 包含 texture 的时候它才可以被添加到SpriteBatchNode中。 所有添加到SpriteBatchNode里面的ParticleSystem都会在同一OpenGL ES调用里面被绘制. 如果 ParticleSystem 没有被添加到ParticleBatchNode中,那么OpenGL ES会调用每个粒子系统的绘图函数,这样做效率会很低。

局限性:

  • 目前只支持 ParticleSystemQuad
    所有的系统都使用相同的参数被绘制:混合函数、纹理等

最为有效的用法:

  • 为所有粒子系统初始化ParticleBatchNode纹理和足够的容量
    初始化所有粒子系统,并将其添加为批处理节点的子节点

ParticleSystemQuad是粒子系统的一种,早前的Cocos2d-x版本中,粒子系统是有两种类型的,既:ParticleSystemQuad 和 ParticleSystemPoint(现已被移除)。

示例:

auto _emitter = ParticleSystemQuad::createWithTotalParticles(50);
    addChild(_emitter,10);
    _emitter->setTexture(Director::getInstance()->getTextureCache()->addImage("Closenormal.png"));
    _emitter->setAnchorPoint(Point(0,0));
    // duration
    _emitter->setDuration(ParticleSystem::DURATION_INFINITY);

    // radius mode
    _emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);

    // radius mode: start and end radius in pixels
    _emitter->setStarTradius(4);
    _emitter->setStarTradiusVar(1);
    _emitter->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
    _emitter->setEndRadiusVar(0);

    // radius mode: degrees per second
    _emitter->setRotatePerSecond(100);
    _emitter->setRotatePerSecondVar(0);

    // angle
    _emitter->setAngle(90);
    _emitter->setAngleVar(0);

    // emitter position
    auto size = Director::getInstance()->getWinSize();
    _emitter->setPosVar(Point::ZERO);

    // life of particles
    _emitter->setLife(0.5);
    _emitter->setLifeVar(0);

    // spin of particles
    _emitter->setStartSpin(0);
    _emitter->setStartSpinVar(0);
    _emitter->setEndSpin(0);
    _emitter->setEndSpinVar(0);

    // color of particles
    Color4F startColor(0.0f,0.8f,0.9f,1.0f);
    _emitter->setStartColor(startColor);

    Color4F startColorVar(0,0,1.0f);
    _emitter->setStartColorVar(startColorVar);

    Color4F endColor(1.0f,1.0f,0.1f);
    _emitter->setEndColor(endColor);

    Color4F endColorVar(0,0.1f);
    _emitter->setEndColorVar(endColorVar);

    // size,in pixels
    _emitter->setStartSize(20);
    _emitter->setStartSizeVar(1);
    _emitter->setEndSize(0);

    // emits per second
    _emitter->setEmissionRate(_emitter->getTotalParticles() / _emitter->getLife());

    // additive
    _emitter->setBlendAdditive(false);

    //addChild(_emitter);
    _emitter->setPosition(Point(200,200));

效果图:

Cocos2d-x 图像渲染和动画——粒子系统的更多相关文章

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

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

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

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

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

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

  4. 我应该使用什么方法进行C#脚本编写

    回答这个问题时要考虑的另一个非常重要的事情:请注意,这将是游戏的粒子系统.编译的代码每帧调用超过3000次.因此,编译代码执行的时间比其他游戏函数要长得多,这一点非常重要.将修饰符脚本编译到表单的委托中会很好:委托voidModifyParticle;这可能吗?解决方法是,使用CSScriptlibrary可以实现这一点非常简单.

  5. cocos2dx -- 150505 学习笔记

    CCParticleSystem:粒子系统类,不过只是一个基类,并不完善。CCParticleSystemQuad:粒子系统矩形类,实现CCParticleSystem的虚函数,postStep、updateQuadWithParticle、setTotalParticles和draw函数。postStep完成不使用BatchNode时的VBO的更新,该类可以在不使用BatchNode的情况下,自己完成粒子的渲染。产生出特定的粒子系统:通过从CCParticleSystemQuad派生子类,并重写初始化函

  6. Cocos2d-JS内置粒子系统

    从类图中我们可以看到,Cocos2d-JS中有内置的11种粒子,这些粒子的属性都是预先定义好的,我们也可以在程序代码中单独修改某些属性,我们在上一节的实例中都已经实现了这些属性的设置。其中this.pLabel.setString函数是为场景中标签设置内容,这样在进入场景后可以看到粒子系统的名称。

  7. 错误日志--2 cocos2dx,粒子系统,plist

    最近几天想试试在小游戏里面加入粒子系统,但是,内置的粒子系统满足不了需求。检查plist,原来是MaxParticle为0。这个编辑器不知道为什么最大粒子数不会写入,可能是让用户手动设置最大数,好蛋疼。将plist文件读取进来只需要一句话就够了,plist文件,使用XML保存,按照键值对的形式记录粒子系统的每项数据,比想象中的简单。

  8. cocos2d粒子系统--粒子编辑器Parti…

    CCParticleSystemQuad方形粒子系统,在3代以后的机器上运行的比较快,他会消耗更多的内存和cpu。使用预处理器ARCH_OPTIMAL_PARTICLE_SYstem来定义粒子系统,在代码编译过程中来判断使用哪一个粒子系统。会自动的根据机型选择合适的粒子系统例:@interfaceCCParticleExplosion:ARCH_OPTIMAL_PARTICLE_SYstem2、有关粒子贴图粒子贴图必须小于64x64的,越小越好。好了,下一步我们就来学习下粒子工具ParticleDesig

  9. Cocos2d-JS自定义粒子系统

    使用ParticleSystem自定义粒子系统至少有两种方式可以实现:代码创建和plist文件创建。雪花图片雪花粒子纹理图片提示描述粒子属性的plist文件,可以通过粒子系统设计工具生成,有关粒子系统工具使用大家可以参考本系列丛书的工具卷。

  10. 我的Cocos2d-x学习笔记二十一内置粒子系统、使用粒子特效文件

    当我们希望在游戏中模拟这些大规模运动的物体时,通常有如下两种方法。Cocos2d-x中粒子系统由CCParticleSystem类实现,CCParticleSystem实现了对粒子的控制与调度。对粒子的操作包括:产生粒子:也称作粒子发射器。

随机推荐

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

返回
顶部