CAEmitterLayer实现雪花效果

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

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


天上下齿轮.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:官方文档没有具体说明,只说是类似图层的继承属性,用法不清楚
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容