最近想给自己应用增加一个雪花特效❄️,于是翻到了这个CALayer的子类,从iOS5开始就有的高性能粒子引擎CAEmitterLayer,通过修改它和它对应的粒子原型CAEmitterCell的各种参数,就能够实现多种特殊的效果,例如爆炸,烟花,雪花,喷射等。
先看效果,原谅我这个丑了一点。。。效果下面有对CAEmitterLayer和CAEmitterCell属性的详细解释,有兴趣可以了解一下。
直接上代码,全是对参数的设置,随便改改就能玩出不同效果
CAEmitterLayer *lineEmitter = [CAEmitterLayer layer];
lineEmitter.emitterPosition = CGPointMake(self.view.center.x, 0);//发射器位置
lineEmitter.emitterSize = CGSizeMake([UIScreen mainScreen].bounds.size.width + 40, 1);//发射器尺寸
lineEmitter.emitterMode = kCAEmitterLayerSurface;//发射器形状
lineEmitter.emitterShape = kCAEmitterLayerLine;//发射模式
lineEmitter.preservesDepth = YES;//是否启用3D效果
lineEmitter.renderMode = kCAEmitterLayerUnordered;//发射器渲染模式
NSMutableArray *cells = @[].mutableCopy;
for (int i = 0; i < 6; i++) {//单行cell数量,可以用于控制横向密度
CAEmitterCell *cell = [[CAEmitterCell alloc] init];
cell.name = @"ball";
cell.birthRate = 2.0;//生成速度,必须设置,可以用于控制纵向密度
cell.velocity = 60.0;//运动速度
cell.velocityRange = 30.0;//运动速度浮动范围
cell.scale = .4;//缩放
cell.scaleRange = .2;//缩放浮动范围
cell.emissionLongitude = M_PI;//粒子运动方向,0朝上,M_PI_2朝右,M_PI朝下
cell.emissionRange = M_PI_4;//运动方向偏移范围
cell.lifetime = 12.0;//生命周期
cell.lifetimeRange = 5.0;//生命周期浮动范围
cell.spin = 2.0;//自转速度
cell.spinRange = 1.0;//自转速度浮动范围
cell.xAcceleration = 2.0;//x轴加速度,相当于给雪花加点风力
// cell.yAcceleration = 5;//y轴加速度,好像没必要
cell.alphaRange = .3;//透明度随机范围
cell.alphaSpeed = -0.05;//透明度递减
cell.contents = (__bridge id)[UIImage imageNamed:@"snow"].CGImage;//cell绘制内容
[cells addObject:cell];
}
lineEmitter.emitterCells = cells;
[self.view.layer addSublayer:lineEmitter];
Demo地址:雪花Demo
下面来介绍一下CAEmitterLayer和CAEmitterCell:
CAEmitterLayer继承自CALayer,实质上是粒子发射器的定义,用它你可以修改发射器的位置形状等各种属性,每个发射器都支持同时发射多种粒子。但是当你想控制每个粒子的形态大小属性等值时,就需要用到粒子原型CAEmitterCell了。
CAEmitterCell继承自NSObject,它是单个粒子的原型,我们在粒子动画效果中看到的每个粒子都是一个CAEmitterCell,通过对CAEmitterCell的属性设置不同的值,我们就能得到许多不一样的特效。
CAEmitterLayer的属性:
- emitterCells:CAEmitterCell容器,发射器要渲染的粒子对象数组。
- birthRate:粒子的出生率乘以这个数值,就是每个粒子生成时间间隔,数值越大粒子生成越快,默认为1秒1次。
- lifetime:粒子存在时间乘以这个数值,得出每个粒子真实生命长度,默认为1。
- emitterPosition:发射器位置。
- emitterZPosition:发射器Z轴位置。
- emitterSize:发射器尺寸。
- emitterDepth:发射器深度。
- emitterShape:发射模式,默认kCAEmitterLayerPoint从一个点发出粒子。
kCAEmitterLayerPoint:从一个点发出粒子
kCAEmitterLayerLine:从一条线发出粒子
kCAEmitterLayerRectangle:从一个矩形发出粒子
kCAEmitterLayerCuboid:从一个立方体发出粒子,有Z轴影响。
kCAEmitterLayerCircle:从一个圆形发出粒子
kCAEmitterLayerSphere:从一个球形发出粒子,有Z轴影响。
- emitterMode:发射器形状。
kCAEmitterLayerPoints:从发射器中点发出
kCAEmitterLayerOutline:从发射器边缘发出
kCAEmitterLayerSurface:从发射器表面发出
kCAEmitterLayerVolume:从发射器中点发出,有Z轴影响。
- renderMode:发射器渲染模式。
kCAEmitterLayerUnordered:粒子无序出现
kCAEmitterLayerOldestFirst:最老的粒子在最上层
kCAEmitterLayerOldestLast:最年轻的粒子在最上层
kCAEmitterLayerBackToFront:粒子按Z轴顺序从下往上出现
kCAEmitterLayerAdditive:混合
- preservesDepth:默认为NO,粒子平铺到当前图层,当开启时,会应用到3D效果,可以理解为启用z轴的效果。
- velocity:粒子运动速度乘以这个数值,得出粒子真实运动速度,默认为1。
- scale:粒子缩放乘以这个数值,得出粒子真实缩放比例,默认为1。
- spin:粒子自转速度乘以这个数值,得出粒子真实自转速度,默认为1。
- seed:初始化随机数生成的种子。
CAEmitterCell的属性:
- name:cell名称,用于构造key路径。
- enabled:是否渲染,默认YES,当设置为NO时不渲染到当前发射器。
- birthRate:粒子生成速度,乘以发射器的birthRate后才是真实生成速度,默认为0所以必须赋值才会生成粒子。
- lifetime:生命周期,乘以发射器的lifetime后得出真实生命长度,默认为0,必须赋值。
- lifetimeRange:生命周期随机浮动范围,默认为0。
- emissionLatitude:粒子在Z轴运动方向
- emissionLongitude:粒子平面运动方向
- emissionRange:粒子运动方向随机浮动范围
- velocity:粒子运动速度,默认为0。
- velocityRange:粒子运动速度随机浮动范围
- xAcceleration:粒子x方向的加速度
- yAcceleration:粒子y方向的加速度
- zAcceleration:粒子z方向的加速度
- scale:粒子缩放比例,乘以发射器的scale后得到真实缩放比例,默认为1不缩放。
- scaleRange:粒子缩放比例随机浮动范围,默认为0。
- scaleSpeed:粒子缩放比例改变速度
- spin:自转速度,乘以发射器的spin后得到真实自转速度,默认为0.
- spinRange:自转速度随机浮动范围
- color:粒子颜色,默认为透明白色,RGBA(0,0,0,0)
- redRange:红色浮动范围
- greenRange:绿色浮动范围
- blueRange:蓝色浮动范围
- alphaRange:透明度浮动范围
- redSpeed:红色改变速度
- greenSpeed:绿色改变速度
- blueSpeed:蓝色改变速度
- alphaSpeed:透明度改变速度
- contents:cell内容,通常为CGImageRef,默认为空。
- contentsRect:绘制内容图像的矩形,默认[0,0,1,1]
- contentsScale:绘制内容的缩放比例
- minificationFilter:使用拉伸过滤算法的缩小过滤器
- magnificationFilter:使用拉伸过滤算法的放大过滤器
- minificationFilterBias:官方文档说是缩小过滤器用于确定细节水平的偏差值
- emitterCells:当前粒子的子粒子数组,默认为空,当有值时,当前粒子能够作为发射器继续渲染粒子效果。
- style:官方文档没有具体说明,只说是类似图层的继承属性,用法不清楚