iOS-粒子发射器

QQ和微信里面有个红包雨,苹果提供了一个非常方便的方法来实现:粒子发射器。

粒子发射器包括两个部分:发射器(CAEmitterLayer)和粒子(CAEmitterCell)。

这里以雪花效果为例:

snow.gif

代码如下所示:

    CAEmitterCell *cell = [[CAEmitterCell alloc] init];
    //展示的图片
    cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"snow"].CGImage);
    //每秒粒子产生个数的乘数因子,会和layer的birthRate相乘,然后确定每秒产生的粒子个数
    cell.birthRate = 10;
    //每个粒子存活时长
    cell.lifetime = 10.0;
    //粒子生命周期范围
    cell.lifetimeRange = 0.3;
    //粒子透明度变化,设置为-0.4,就是每过一秒透明度就减少0.4,这样就有消失的效果,一般设置为负数。
    cell.alphaSpeed = -0.1;
    cell.alphaRange = 0.01;
    //粒子的速度
    cell.velocity = 40;
    //粒子的速度范围
    cell.velocityRange = 20;
    
    //粒子内容的颜色
    cell.color = [[UIColor whiteColor] CGColor];
    
    //设置了颜色变化范围后每次产生的粒子的颜色都是随机的
    //cell.redRange = 0.5;
    //cell.blueRange = 0.5;
    //cell.greenRange = 0.5;
    
    //缩放比例
    cell.scale = 0.4;
    //缩放比例范围
    cell.scaleRange = 0.05;
    cell.scaleSpeed = -0.01;//scale每秒变化率,负数缩小,正数放大
    
    //粒子的初始发射方向
    //emissionLongitude:抛洒的角度,x-y平面的发射方向;顺时针方向角度变化为0~PI/2~PI,逆时针变化是负的
    cell.emissionLongitude =  M_PI;
    //cell.emissionLatitude = M_PI_4;
    
    //emissionRange: 抛洒角度的浮动角度,这个角度指定了抛洒出的对象能够在多大角度范围内扩散。
    //cell.emissionRange = M_PI_2;
    
    //Y方向的加速度
    cell.yAcceleration = 9.8;

    
   _emitterLayer = [CAEmitterLayer layer];
    _emitterLayer.backgroundColor = [UIColor redColor].CGColor;
    //发射位置
    _emitterLayer.emitterPosition = CGPointMake(SCREEN_WIDTH/2, 200);
    //粒子产生系数,默认为1
    _emitterLayer.birthRate = 1;
    //发射器的尺寸
    _emitterLayer.emitterSize = CGSizeMake(SCREEN_WIDTH, 0);
    //发射的形状
    _emitterLayer.emitterShape = kCAEmitterLayerLine;
    //发射的模式
    _emitterLayer.emitterMode = kCAEmitterLayerSurface;
    //渲染模式
    _emitterLayer.renderMode = kCAEmitterLayerOldestFirst;
    _emitterLayer.masksToBounds = NO;
    //_emitterLayer.zPosition = -1;
    _emitterLayer.emitterCells = @[cell];
    [self.view.layer addSublayer:_emitterLayer];
CAEmitterCell粒子单元
  • contents : 一般放一张图片,是粒子要展示的内容 ;
  • birthRate : 每秒粒子产生个数的乘数因子,会和layer的* birthRate相乘, 然后确定每秒产生的粒子个数;
  • lifetimeRange : 所有的range属性都是你设置的属性值加减它后得到一个范围,例如cell.lifetime=5.0, cell.lifetimeRange = 1.0; 那么粒子的存活时间就是[4.0,6.0](也就是说lifetimeRange是和lifetime组合使用的);
  • color : 粒子内容的颜色,更改后粒子会变色 ,默认不透明白色;
  • redRange,blueRange,greenRange : 设置了颜色变化范围后会产生随机的颜色,这样粒子就会是五颜六色的了 ;
  • scale : 粒子缩放比例,我们看到的烟花粒子就是缩放比例很小得到的,你可以用任意图,然后缩放比例设置很小,就可以得到很小的粒子;
  • scaleRange : 缩放比例范围(类似lifetimeRange);
  • scaleSpeed : scale每秒变化率,负数缩小,正数放大;
  • emissionLongitude:抛洒的角度,x-y平面的发射方向;顺时针方向角度变化为0PI/2PI,逆时针变化是负的;
  • emissionLatitude:发射的z轴方向的角度;
  • emissionRange : 抛洒角度的浮动角度,这个角度指定了抛洒出的对象能够在多大角度范围内扩散;
  • yAcceleration : Y方向的加速度
CAEmitterLayer发射器
  • emitterCells : 粒子单元数组,你可以创建两个单元,负责不同的效果。
  • emitterPosition : 在xy平面的发射位置
  • emitterZPosition: z轴上的位置
  • birthRate : 粒子产生系数,默认为1,想停下就设为0,这样就没有粒子产生了 (控制发射器开始与停止的开关)
  • emitterSize : 发射器的尺寸
  • emitterShape : 发射的形状,有6种值,分别是点、线、矩形、立方体、圆形、球形,如下代码所示。
/** `emitterShape' values. **/

CA_EXTERN NSString * const kCAEmitterLayerPoint
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//点
CA_EXTERN NSString * const kCAEmitterLayerLine
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//线
CA_EXTERN NSString * const kCAEmitterLayerRectangle
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//矩形
CA_EXTERN NSString * const kCAEmitterLayerCuboid
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//立方体
CA_EXTERN NSString * const kCAEmitterLayerCircle
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//圆形
CA_EXTERN NSString * const kCAEmitterLayerSphere
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//球体
  • renderMode: 发射模式,如下所示:
/** `emitterMode' values. **/

CA_EXTERN NSString * const kCAEmitterLayerPoints
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//从发射器中
CA_EXTERN NSString * const kCAEmitterLayerOutline
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//边缘
CA_EXTERN NSString * const kCAEmitterLayerSurface
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//表面
CA_EXTERN NSString * const kCAEmitterLayerVolume
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//中点
  • renderMode : 渲染模式,值如下所示:
/** `renderMode' values. **/

CA_EXTERN NSString * const kCAEmitterLayerUnordered
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//粒子是无序出现的
CA_EXTERN NSString * const kCAEmitterLayerOldestFirst
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//声明久的粒子会被渲染在最上层
CA_EXTERN NSString * const kCAEmitterLayerOldestLast
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//年轻的粒子会被渲染在最上层
CA_EXTERN NSString * const kCAEmitterLayerBackToFront
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//粒子的渲染按照Z轴的前后顺序进行
CA_EXTERN NSString * const kCAEmitterLayerAdditive
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//进行粒子混合(变成火的就是这个)

发射器可以实现的效果:雨,雪,火,爆炸,波纹 ,水波, 声波 ,海水等。想不到的效果还有很多,需要多想,多记录,很多效果或许都有人已经调好数值,不需要我们花时间再去调试,但我们需要想到发射器能实现这种效果。

参考:
iOS CAEmitterLayer 粒子发射器的使用详解
iOS进阶之CAEmitterLayer

网上的一份代码,包括了集中效果,虽然因为年代久远无法运行,但把代码拷贝出来使用应该还是可以的:http://www.okbase.net/file/item/21207

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,396评论 1 301
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,482评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 94,858评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,131评论 0 179
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,903评论 1 256
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,847评论 1 177
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,454评论 2 273
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,206评论 0 167
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,047评论 6 232
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,563评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,344评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,667评论 1 231
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,264评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,163评论 2 214
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,546评论 3 207
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,630评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,032评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,572评论 2 231
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,668评论 2 232

推荐阅读更多精彩内容

  • 1.粒子发送器图层 CAEmitterLayer:发送器 每秒发送粒子数量:birthRate 发送形状的样式:e...
    磊CC阅读 577评论 0 0
  • 开始iOS的动效学习,一开始只对普通的CALayer有所了解,偶然的机会想到做一些全局的飘洒的效果。当时采用最笨的...
    清蘂翅膀的技术阅读 2,958评论 0 11
  • 转载:http://blog.csdn.net/wang631106979/article/details/512...
    F麦子阅读 181评论 0 0
  • 在上一篇中我们大致了解了粒子系统,在这篇中我们再深入解析一下。在粒子系统中,CAEmitterLayer负责发射粒...
    Fendouzhe阅读 573评论 0 4
  • 公元600多年,意志力超强的唐朝高僧玄奘,在穿越楼兰古城附近的沙漠时有过这样的记载: “曾经有很多人在此迷失方向,...
    骑驴漫游阅读 755评论 0 3