CAEmitterLayer实现雪花效果

最近想给自己应用增加一个雪花特效❄️,于是翻到了这个CALayer的子类,从iOS5开始就有的高性能粒子引擎CAEmitterLayer,通过修改它和它对应的粒子原型CAEmitterCell的各种参数,就能够实现多种特殊的效果,例如爆炸,烟花,雪花,喷射等。

先看效果,原谅我这个丑了一点。。。效果下面有对CAEmitterLayer和CAEmitterCell属性的详细解释,有兴趣可以了解一下。


CAEmitterLayer实现雪花效果_第1张图片
天上下齿轮.gif

直接上代码,全是对参数的设置,随便改改就能玩出不同效果

    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:官方文档没有具体说明,只说是类似图层的继承属性,用法不清楚

你可能感兴趣的:(CAEmitterLayer实现雪花效果)