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

news/2024/7/5 21:13:32
重开发人员的劳动成果。转载的时候请务必注明出处: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
开源地址: http://code.google.com/p/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:粒子的发射速率。即每秒发射的粒子数量。


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


http://www.niftyadmin.cn/n/1941913.html

相关文章

【练习】trace文本重建控制文件

这个小练习是针对控制文件全部丢失后怎么能快速的重建一个控制文件,快速的起库 1.备份控制文件到trace下 SQL> alter database backup controlfile to trace;Database altered. 2.trace文本放在user_dump_dest的路径下 SQL> show parameter dump;NAME …

Camera Calibration in detail

Tomorrow转载于:https://www.cnblogs.com/stevenxiu/p/5612916.html

硬盘和计算机的接口类型有哪两种,常见的不同类型接口的固态硬盘有哪些

固态硬盘的读写速度要比机械硬盘快。电脑用户在安装时,都会购买固态硬盘作为系统盘。一些老用户对电脑机器进行升级。升级和升级的首选是硬盘。立即改进。机械硬盘只有一种SATA接口,而硬盘与硬盘不同。它的接口和种类繁多。用户在选择时自然要注意与电脑…

django 模板 (ああああああああ!かぴ)

一 常用 1. {{ 不存在 | default : "xx" }} 2. {{ name | length }} 3. {{ xx | slice "1:-1" }} 4. {{ now | date: "Y-m-d H:i:s" }} now datetime.now() 5. {{ xx | truncatechars : x }} 截取文字 6. {{ xx | truncatewords : x }} …

ES6 数组解构赋值

1.数组解构 let [a, b, c,d] ["aa", "bb", 77,88]; alert(a) //弹出aa 可以用babel 解析看ES5的转换结果 嵌套数组解构 let [a,b,[c,d],e] ["aa",bb,[33,44],55]; alert(c) //弹出33 空缺变量 let [a,b,,e] ["aa",bb,[33,…

第二个议题

① 在每个问题后面,请说明哪一章节的什么内容引起了你的提问,提供一些上下文 ② 列出一些事例或资料,支持你的提问 。 ③ 说说你提问题的原因,你说因为自己的假设和书中的不同而提问,还是不懂书中的术语,还…

山东省高中学业水平考试计算机考试教材,2017年山东高中学业水平考试科目

考试科目(1)会考的文化科目为:语文、数学、外语、思想政治、物理、化学、历史、地理、生物、信息技术、通用技术,共计11科;实践科目为:物理、化学、通用技术、生物的实验操作。文化科目的会考方式分为考试、考查两种,采…

Kafka入门, 消费者组案例(十九)

pom 文件 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency></dependencies>独立消费者案例&#xff08;订阅主语&a…