游戏开发者通常需要使用粒子系统来制作视觉特效。粒子系统能够发射大量细小的粒子并对他们进行渲染,而且效率要远高于渲染同样数目的精灵。粒子系统可以模拟下雨、火焰、雪、爆炸、蒸气拖尾以及其他多种视觉效果。
粒子系统由很多属性来驱动,这里的“很多”大概是30种左右,它们不仅影响单个粒子的外观和行为,而且也影响着整体的粒子效果。粒子效果是所有粒子一起工作所创造出的独有的视觉效果。单个粒子或是10个粒子是做不出火焰效果的,一般需要十几个甚至数百个粒子以正确的方式运行才能够制作出火焰效果。
是不是被那三十多种属性吓到了,其实粒子效果的创建也不难,很多在没有接触或者是刚开始的时候都感觉粒子系统很难,确实你如果想要自己从无到有的创建一个粒子效果确实很难,但是如果你想学会使用它,并能够对别人的样板进行修改这是很简单的。下面我们先看看粒子效果如何创建:
第一种:直接使用系统自带的类创建
CCParticleSnow *snow = [[CCParticleSnow alloc] init];
[snow setTexture:[[CCTextureCache sharedTextureCache] addImage:@"snow.png"]];
snow.position = ccp(300, 350);
[self addChild:snow];
运行效果图:
第二种:使用制作好的粒子效果文件(plist)创建 (Particle Designer)
CCParticleSystem *snow = [CCParticleSystemQuad particleWithFile:@"snow.plist"];
snow.position = ccp(200, 350);
[self addChild:snow];
运行效果图:
第三种:用代码创建
//创建粒子发射器
CCParticleSystemQuad *snow = [[CCParticleSystemQuad alloc] init];
//设置创建粒子的最大数量
[snow setTotalParticles:500];
//设置粒子图片
[snow setTexture:[[CCTextureCache sharedTextureCache] addImage:@"snow.png"]];
//设置发射粒子的持续时间,-1表示一直发射,0没有意义,其它值表示持续时间
[snow setDuration:-1];
//设置粒子发射方向,默认x正方向为右,y正方向为上
[snow setGravity:CGPointMake(0, -100)];
//设置粒子角度和角度的变化率
[snow setAngle:0];
[snow setAngleVar:10];
//设置径向加速度和加速度变化率
[snow setRadialAccel:0];
[snow setRadialAccelVar:0];
//设置切向加速度和加速度变化率
[snow setTangentialAccel:30];
[snow setTangentialAccelVar:0];
//设置粒子的发射位置和位置变化率
[snow setPosition:CGPointMake(200, 350)];
[snow setPosVar:CGPointMake(300, 0)];
//设置生命周期和生命周期变化率
[snow setLife:4];
[snow setLifeVar:1];
//设置粒子开始的自旋转速度,开始自旋转速度的变化率
[snow setStartSpin:30];
[snow setStartSpinVar:60];
//设置结束的时候的自旋转以及自旋转的变化率
[snow setEndSpin:60];
[snow setEndSpinVar:60];
//创建颜色
ccColor4F cc;
cc.a = 1.0f;
cc.b = 255.0f;
cc.g = 255.0f;
cc.r = 255.0f;
ccColor4F cc2;
cc2.a = 0;
cc2.b = 0;
cc2.g = 0;
cc2.r = 0;
//设置开始的时候的颜色以及颜色的变化率
[snow setStartColor:cc];
[snow setStartColorVar:cc2];
//设置结束的时候的颜色以及颜色的变化率
[snow setEndColor:cc];
[snow setEndColorVar:cc2];
//设置开始时候粒子的大小,以及大小的变化率
[snow setStartSize:30];
[snow setStartSizeVar:10];
//设置粒子结束的时候的大小,以及大小的变化率
[snow setEndSize:10];
[snow setEndSizeVar:5];
//设置每秒钟产生粒子的数目
[snow setEmissionRate:100];
[self addChild:snow z:1];
运行效果图: