• 23、Cocos2dx 3.0游戏开发找小三之粒子系统:你那里下雪了吗?


    重开发人员的劳动成果。转载的时候请务必注明出处http://blog.csdn.net/haomengzhu/article/details/30485919

    春雨惊春清谷天,夏满芒夏暑相连, 秋处露秋寒霜降,冬雪雪冬小大寒。

    在大自然中,随处可见一些大规模运动的物体,比例如以下雨时的雨点、下雪时的雪花、爆炸时的火花。甚至旋转的星系、扩散的云雾等。

    能够看下显微镜下的雪。是多么的美!


    当我们希望在游戏中模拟这些大规模运动的物体时,通常有例如以下两种方法。

    使用帧动画来模拟。
    设计帧动画并把它渲染为图片序列来模拟特效,不但生成的动画体积庞大,也无法调整其运动參数,
    而且还会失去其灵活性。

    粒子效果的概念
    我们把每个对象看做一个粒子,赋予它们一定的属性(比如外观、位置、速度、加速度和生存时间等)。
    使它们依照一定的规律产生、运动并终于消失。

    在粒子效果中。通常存在一个对全部粒子进行统一调度的引擎。称作粒子系统(partical system),
    它负责粒子的产生。随时间改变粒子的状态。以及最后回收不再须要的粒子。

    假设依照粒子系统的维数来区分。粒子系统能够分为二维粒子系统与三维粒子系统两种。


    Cocos2d-x 3.0为我们提供的粒子系统由 ParticleSystem 类实现。

    与其它的粒子引擎一样。ParticleSystem 实现了对粒子的控制与调度。对粒子的操作包含例如以下几种。
    1、产生粒子:这部分也被称作粒子发射器(emitter)。
    2、更新粒子状态:引擎会随时间更新粒子的位置、速度以及其它状态。

    3、回收无效粒子:当粒子的生存周期结束后,就会被系统回收。

    因此。为了创建一个粒子效果,我们须要定义粒子怎样产生以及状态怎样改变。

    ParticleSystem 提供了多种初始化方式。 
    我们能够通过指定粒子数量来创建一个粒子系统, 然后须要设置粒子的外观 (通常为一张小纹理)、发射方式与运动方式。
    创建一个全新的粒子系统通常较为烦琐,大多数情况下。我们更乐意把粒子系统的參数保存在文件里,
    而 Cocos2d-x 就是使用 Plist 文件来保存这些參数的。
    临时抛开粒子效果文件 Plist 不谈,假设我们已经拥有一个粒子效果文件,就能够利用 ParticleSystem 的初始化方法直接从文件里导入一个粒子效果。相关代码例如以下:
    static ParticleSystem * create(const std::string& plistFile);

    Plist 文件实质上是一个 XML 文件,我们能够利用不论什么文本编辑器来创建或改动。
    为了创建一个新的粒子效果。我们能够从Cocos2d-x 的測试例子文件夹下找到一个现有的粒子系统 Plist 文件,改动再使用。


    实际上,引擎已经内置了若干粒子效果,它们作为粒子系统的例子,仅仅须要简单的几行代码就能够创建。
    内置的几种粒子效果
    ParticleFire                火焰效果
    ParticleSun                  太阳效果
    ParticleExplosion            爆炸效果
    ParticleSnow                 雪花效果

    粒子系统继承自Node,能够被加入到其它节点之中。
    在游戏中显示一个粒子效果十分简单。

    直接把以下的代码加入到游戏场景的初始化方法中,给游戏场景加入一个雪花效果。就可以营造一种冬日氛围。
    准备好一张雪花图片 snow.png,并在GameScene::init 方法中加入下面代码:
      ParticleSnow *snow = ParticleSnow::create();
      snow->setPosition(Point(480,670));
      snow->setTextureWithRect(Director::getInstance()->getTextureCache()->addImage("snow.png"),Rect(0,0,32,32));
      addChild(snow);  
    成功加入后,就能够看到雪花漫天飘舞的效果了。


    对于不论什么粒子系统,Texture 都是一个必须设置的属性,粒子系统中的每个粒子都使用此纹理渲染出来。

    在这个样例中,每个粒子都被赋予雪花纹理,因此能够呈现出雪花飘落的效果。

    创建一个全新的粒子效果须要设定的參数过于繁杂,我们全然能够利用引擎内置的粒子
    演示样例来实现一个粒子效果: 首先找到一个与期望效果类似的粒子效果, 然后改动纹理, 微调參数。


    以下我们以 ParticleSnow 为例,展示它是怎样设置參数的:
    bool ParticleSnow::initWithTotalParticles(int numberOfParticles)
    {
        if( ParticleSystemQuad::initWithTotalParticles(numberOfParticles) ) 
        {
            // duration
            //时间间隔
            _duration = DURATION_INFINITY;
    
            // set gravity mode.
            //设置为重力模式
            setEmitterMode(Mode::GRAVITY);
    
            // Gravity Mode: gravity
            //重力模式參数: 重力
            setGravity(Point(0,-1));
    
            // Gravity Mode: speed of particles
            //重力模式參数: 粒子速度
            setSpeed(5);
            setSpeedVar(1);
    
            // Gravity Mode: radial
            //重力模式參数: 径向加速度
            setRadialAccel(0);
            setRadialAccelVar(1);
    
            // Gravity mode: tangential
            //重力模式參数: 切向加速度
            setTangentialAccel(0);
            setTangentialAccelVar(1);
    
            // emitter position
            //粒子发射器位置
            Size winSize = Director::getInstance()->getWinSize();
            this->setPosition(Point(winSize.width/2, winSize.height + 10));
            setPosVar(Point(winSize.width/2, 0));
    
            // angle
            //角度
            _angle = -90;
            _angleVar = 5;
    
            // life of particles
            //粒子的生命时间
            _life = 45;
            _lifeVar = 15;
    
            // size, in pixels
            //尺寸(以像素为单位)
            _startSize = 10.0f;
            _startSizeVar = 5.0f;
            _endSize = START_SIZE_EQUAL_TO_END_SIZE;
    
            // emits per second
            //每秒发射粒子数
            _emissionRate = 10;
    
            // color of particles
            //粒子着色
            _startColor.r = 1.0f;
            _startColor.g = 1.0f;
            _startColor.b = 1.0f;
            _startColor.a = 1.0f;
            _startColorVar.r = 0.0f;
            _startColorVar.g = 0.0f;
            _startColorVar.b = 0.0f;
            _startColorVar.a = 0.0f;
            _endColor.r = 1.0f;
            _endColor.g = 1.0f;
            _endColor.b = 1.0f;
            _endColor.a = 0.0f;
            _endColorVar.r = 0.0f;
            _endColorVar.g = 0.0f;
            _endColorVar.b = 0.0f;
            _endColorVar.a = 0.0f;
    
            Texture2D* texture = getDefaultTexture();
            if (texture != nullptr)
            {
                setTexture(texture);
            }
    
            // additive
            //禁用线性叠加混合模式
            this->setBlendAdditive(false);
            return true;
        }
        return false;
    }
    


    粒子编辑器
    windows上的一款粒子编辑器。叫做cocos2d-windows-particle-editor


    简单使用概述与说明:

    File:save,save as(导出plist文件),new,Open 

    Samples:有test里面的一些样例,临时版本号没有添加自己加入纹理进来功能

    编辑器功能说明:

    半径模式:这样的仅仅有环绕中心运动。这个以下的參数要有效

    编辑器:IsBackgroundMove背景是否动。Scale缩放

    大小:粒子的開始大小和结束大小

    角度:粒子的运动方向...(-90)垂直朝下

    生命:粒子生命

    位置:设置PosVar值,SourcePosition不用管..设置资源的

    纹理渲染:对于普通情况,仅仅须要记住:“我们最常使用的CC_BLEND_SRC和CC_BLEND_DST分别相应GL_ONE和GL_ONE_MINUS_SRC_ALPHA”。

    颜色:StartColor, EndColor, StartColorVar, EndColorVar这4个属性代表着粒子的初始颜色、结束颜色以及其浮动值。

    重力模式:重力、速度等的设置

    自旋:粒子的旋转

    EmissionRate:粒子的发射速率。即每秒发射的粒子数量。


    郝萌主友情提示:
    发挥自己的想象力,创建属 于自己的与众不同的粒子效果、、、

  • 相关阅读:
    python之enumerate
    PyCharm Debug 调试
    兼容性测试方法
    mongo基本命令
    mongodb启动
    安装STF
    新家
    用数组实现的最大堆(C++)
    VS2013调用GLPK求解线性规划
    转:Java读取txt文件和写入txt文件
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5163950.html
Copyright © 2020-2023  润新知