• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

知易Cocos2D

mysql 搞代码 4年前 (2022-01-09) 24次浏览 已收录 0个评论

为什么需要粒子系统 如果只是做卡通效果的游戏,我们可以通过动画实现所有游戏视觉效果,ZYG006中的爆炸效果就是这样的。但是如果需要更加真实的效果模拟,实现更加随机的、栩栩如生的烟雾、闪电、雨雪、火花掉落效果,我们就必须使用粒子系统。粒子系统让你

为什么需要粒子系统

如果只是做卡通效果的游戏,我们可以通过动画实现所有游戏视觉效果,ZYG006中的爆炸效果就是这样的。但是如果需要更加真实的效果模拟,实现更加随机的、栩栩如生的烟雾、闪电、雨雪、火花掉落效果,我们就必须使用粒子系统。粒子系统让你的游戏显得更加真实而富有生命感(BenBritten Smith-《iPhone Advanced Projects》)。

通过对这些自然现象的分析我们发现:这些现象的出现并不涉及一个可以触摸的、很明确的实体,而且现象的本身是动态的(随时间迅速变化的),而这种变化的效果是由大量微小微粒组合而成的,大量的粒子效果叠加成了我们看到的整体效果。这样一来,明确的、可以用数学公式表述的图形、图像效果都很难模拟出这样的效果,因为其中包含着大量的、不确定性的、随机性、混乱的模糊内涵。

物理学上关于大量粒子无规则运动的学科是热力统计学,一个令大家耳熟能详的概念是“熵”。关于这个物理量的典型描述是热力学第二定律,也称为“熵增原理”。当然还有一个更加令人费解但确实又是无可奈何的必然概念是“系综”。

无论是我们主观的分析判断也好,还是热力统计学的基本定律也好,共同的一点认识就是:这些自然现象的存在涉及到大量无规则运动的微粒。因此,为了模拟这样的系统所产生的现象,我们要建立这样一个粒子系统:

1) 包含大量所谓粒子对象(Particles)。

2) 宏观特性: 每一个例子都要遵守的主要规律。

3) 微观特性:每个例子都在宏观属性上的随机、变异特性。

4) 过程动态特性:每个粒子系统模拟的都是一个不断变化的动态效果而不是静态不变的,因此这就有一个持续更新状态的要求。

按照预先设计好的规则,不断产生、喷射出大量粒子,每个粒子按照自己的运动参数不断变化、运动,大量粒子效果叠加成为我们所需要的宏观现象。这样我们就可以模拟出许多栩栩如生的自然效果。

大约在1982年-1983年,一个叫做威廉姆·瑞午斯(WilliamReeves)的游戏开发者最先使用了这样的系统。他的算法实现了宏观上对粒子群整体的控制,同时保证了微观上各个粒子的无规则乱序运动。这就比较完美的给游戏系统带来的全新的体验。

当然,在一些简单的卡通类游戏和纸牌游戏中添加几丝粒子效果,也可以为玩家带来欣喜、兴奋的视觉体验。让你的游戏显得更加精致而令人珍惜。

粒子系统的组成

一个例子系统通常由以下几个关键部分组成:

l 粒子(Particles)

每一个粒子就是一个图形对象,可以使一色点或者一个图片。下面就是CocosNoded关于粒子的定义:(文件CCParticleSystem.h)

typedef struct sParticle

{

CGPoint pos; // A位置

CGPointstartPos; //A开始位置

CGPoint dir; // A运动方向

float radialAccel; // 径向加速度。逃离发射原点的速度

float tangentialAccel; //切线加速度。围绕发射原点旋转速度

ccColor4F color; // A颜色

ccColor4F deltaColor; // B颜色变化

float size; // A大小

float deltaSize; //B大小变化

float angle; // A角度

float deltaAngle; // B角度变化量

float life; // A存在时间

} Particle;

每一个粒子都有自己独立的属性,按照之前关于粒子系统的定义包括两大类:

A类,表述粒子的主属性,也就是宏观系统需要的宏观特性。

B类,代表每个例子的无规则变化属性,也就是微观特性。

这里需要说明的是,发射器对象在生成每一个的时候,已经会在宏观特性的基础之上设置每一个粒子的个性,B类变量保存了这种变化在生命周期中的单步变换量。

l 发射器(emitter)

发射器对象就是一个粒子系统的整体,一片云,一团雾,一次闪电,一股烟都是由一个独立的粒子系统来模拟的,Cocos2d-iPhone中关于粒子系统的定义如下:(文件CCParticle本文来源gao@!dai!ma.com搞$$代^@码5网@System.h):

@interface CCParticleSystem : CCNode

{

intid;

// is theparticle system active ?

BOOLactive;

//duration in seconds of the system. -1 is infinity

floatduration;

// timeelapsed since the start of the system (in seconds)

floatelapsed;

///Gravity of the particles

CGPointgravity; //A所有粒子的纵、横运动速度。

//position is from “superclass” CocosNode

//Emitter centerOfGravity position

CGPointcenterOfGravity; //粒子重力原点。

//Position variance

CGPointposVar; //B粒子喷发原点的宽高变化范围。

// Theangle (direction) of the particles measured in degrees

floatangle; //A粒子喷发角度

// Anglevariance measured in degrees;

floatangleVar; //B粒子喷发角度的变化范围

// Thespeed the particles will have.

floatspeed; //A粒子运动速度

// Thespeedvariance

floatspeedVar; //B粒子运动速度的变化范围

//Tangential acceleration

floattangentialAccel; //A粒子切向加速度

//Tangential acceleration variance

floattangentialAccelVar; //B粒子切向加速度的变化范围

// Radialacceleration

floatradialAccel; //A粒子径向加速度

// Radialacceleration variance

floatradialAccelVar; //B粒子径向加速度变化范围

// startize of the particles

floatstartSize; //A粒子起始大小

// startSize variance

floatstartSizeVar; //B粒子起始大小尺寸变化范围

// Endsize of the particle

floatendSize; //A粒子完毕尺寸

// endsize of variance

floatendSizeVar; //B粒子完毕尺寸变化范围

// Howmany seconds will the particle live

floatlife; //A粒子生命周期

// Lifevariance

floatlifeVar; //B粒子生命周期变化范围

// Startcolor of the particles

ccColor4FstartColor; //A粒子开始颜色

// Startcolor variance

ccColor4FstartColorVar; //B粒子开始颜色变化范围

// Endcolor of the particles

ccColor4FendColor; //A粒子结束颜色

// Endcolor variance

ccColor4FendColorVar; //B粒子结束颜色变化范围

// startangle of the particles

floatstartSpin; //A粒子开始自旋角度

// startangle variance

floatstartSpinVar; //B粒子开始自旋角度变化范围

// Endangle of the particle

floatendSpin; //A粒子结束自旋角度

// endangle ariance

floatendSpinVar; //B粒子结束自旋角度变化范围

// Arrayof particles

Particle*particles;

//Maximum particles

inttotalParticles;

// Countof active particles

intparticleCount;

//additive color or blend

BOOLblendAdditive;

// colormodulate

BOOLcolorModulate;

// Howmany particles can be emitted per second

floatemissionRate; //粒子喷发速率

floatemitCounter;

//Texture of the particles

CCTexture2D *texture_;

// blendfunction

ccBlendFunc blendFunc_;

//movment type: free or grouped

tPositionType positionType_;

//Whether or not the node will be auto-removed when there are notparticles

BOOL autoRemoveOnFinish_;

// particle idx

intparticleIdx;

}

通过以上定义我们可以看到,A类属性定义了整个粒子系统的宏观特性,B类属性定义了粒子微观特性,B类属性是由粒子系统在生成每一个微观粒子时通过随机函数CCRANDOM_MINUS1_1随机赋予的,一旦被激活,就可以模拟整个系统的随机、混乱的效果。

粒子和发射器对象描述了一个粒子系统的复杂性的全部属性,我们还可以根据自己游戏设计内容,通过增加新的A、B类属性来增加上述复杂性:闪烁、随机扰动等等。

如果您对本文感兴趣,可以到这里下载完整PDF。示例源代码下载。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:知易Cocos2D

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址