看着代码很烦人是吧?把我们前面的 emitterLayer 和 showCell 结合在一起,就是一个完整的粒子发射过程了,给大家看看效果:

其实实现的效果比较简洁,但一定要自己去尝试下面代码中,那些注释了的东西。
![]()
接下来继续,下雨效果,大家来想想下雨效果是什么样子呢?粒子应该从什么位置发射?应该怎么配置?
思考结束,我们继续:
// 创建粒子发射器图层
CAEmitterLayer * rainEmitterLayer = [CAEmitterLayer layer];
// 设置属性
// 发射源的形状 是枚举类型 ⭐️因为是下雨 所以要作为 直线发射
rainEmitterLayer.emitterShape = kCAEmitterLayerLine;
// 发射模式 从表面发射
rainEmitterLayer.emitterMode = kCAEmitterLayerSurface;
// 发射源的size 据定了发射源的大小 设定发射器大小为整个屏幕的大小
rainEmitterLayer.emitterSize = self.view.frame.size;
// 发射源的位置 ⭐️因为是下雨 所以要从屏幕上方往下发射(如果想让粒子占据整个屏幕的宽度,设定位置宽度为视图的一半)
rainEmitterLayer.emitterPosition = CGPointMake(self.view.frame.size.width*0.5, -20);
// 渲染模式,暂不使用 ⭐️很不常用
// 添加到目标视图的layer上
[self.view.layer addSublayer:rainEmitterLayer];
// 配置粒子Cell
CAEmitterCell * rainCell = [CAEmitterCell emitterCell];
// 设置粒子图片
rainCell.contents = (id)[[UIImage imageNamed:@"rain"]CGImage];
// 可以以分组的形式来记忆粒子的设定如下:
// 组1 ⭐️三个参数缺一不可
// 设置粒子产生率 每秒 60个 ⭐️粒子产生率可以通过 EmitterLayer 来控制
rainCell.birthRate = 60.f;
// 设置粒子生命周期 生命周期 40秒
rainCell.lifetime = 40.f;
// 设置粒子持续时间,持续时间制约粒子生命周期
rainCell.speed = 5.f;
// 组2
// 设置粒子速度
rainCell.velocity = 20.f;
// 设置粒子速度范围
rainCell.velocityRange = 100.f;
// 设置粒子下落加速度 Y轴
rainCell.yAcceleration = 2000.f;
// 组3 雨图片需要缩放统一大小 不能使用范围
// 设置缩放比例
rainCell.scale = 0.05f;
// // 设置缩放范围
// rainCell.scaleRange = 0.8f;
// // 设置粒子存在期间缩放变化的速度
// rainCell.scaleSpeed = 0.5f;
// // 组4 雨点不需要旋转
// // 设置粒子旋转速度
// rainCell.spin = 0.5f;
// // 设置粒子旋转范围
// rainCell.spinRange = M_PI_2;
// 设置粒子颜色 会附和图片修改图片颜色
rainCell.color = [[UIColor whiteColor]CGColor];
// 添加到粒子发射器
rainEmitterLayer.emitterCells = @[rainCell];
运行效果如下:

我们可以稍加改进,比如绵绵细雨,试想一下,怎么能够做到往一个方向倾斜的呢?我们正常的加速度是:yAcceleration,用来设定粒子下落加速度(Y轴),如果想要倾斜,我们就加上xAcceleration,也就是X轴加速度。运行效果如下:

这时候新的难题来了,我们会看到ios下雪下雨的,下雨覆盖不满屏幕了这是为什么呢?之前说了 EmitterLayer 设置属性有:
①发射源的size 据定了发射源的大小 EmitterLayer.emitterSize 目前我们的size是屏幕尺寸,即使我们把雨弄倾斜了,发射源的大小和下落位置的大小还是屏幕尺寸,这时候我们就应该调整 EmitterLayer 的父 layer 的 View 的大小了,宽度变成 2 倍。
②发射源的位置 EmitterLayer.emitterPosition,之前我们学习到了如果想让粒子占据整个屏幕的长度,设定位置尺寸为视图的一半,这时候也相同。
通过以下两个步骤,倾斜的雨点就会布满整个屏幕了

好了,我们继续来学习下雪效果,之前下雨效果已经完成了,下雪就很简单啦,直接上代码:
// 设置发射器图层
CAEmitterLayer * snowEmitterlayer = [CAEmitterLayer layer];
// 发射源的形状 是枚举类型 ,因为是下雨 所以要作为 直线发射
snowEmitterlayer.emitterShape = kCAEmitterLayerLine;
// 发射模式
snowEmitterlayer.emitterMode = kCAEmitterLayerSurface;
// 发射源的size 据定了发射源的大小
snowEmitterlayer.emitterSize = self.view.frame.size;
// 发射源的位置 从屏幕上方往下发射
snowEmitterlayer.emitterPosition = CGPointMake(self.view.frame.size.width*0.5, -10);
// 渲染模式,暂不使用
[seslf.view.layer addSublayer:snowEmitterlayer];
// 创建粒子
CAEmitterCell * snowCell = [CAEmitterCell emitterCell];
// 设置粒子图片
snowCell.contents = (id)[[UIImage imageNamed:@"snow@3x"]CGImage];
// 组1
// 设置粒子产生率
snowCell.birthRate = 10.f;
// 设置粒子生命周期
snowCell.lifetime = 40.f;
// 设置粒子持续时间,持续时间制约粒子生命周期
snowCell.speed = 5.f;
// 组2
// 设置粒子速度
snowCell.velocity = 20.f;
// 设置粒子速度范围
snowCell.velocityRange = 100.f;
// 设置粒子下落加速度 Y轴
snowCell.yAcceleration = 80.f;
// 组3 雪花图片 需要缩放大小 使用缩放范围
// 设置缩放比例
snowCell.scale = 0.2f;
// 设置缩放范围
// snowCell.scaleRange = 0.5f;
// // 设置粒子存在期间缩放变化的速度
// snowCell.scaleSpeed = 0.5f;
// 组4 雨点不需要旋转
// 设置粒子旋转速度
// snowCell.spin = 0.5f;
// // 设置粒子旋转范围
// snowCell.spinRange = M_PI_2;
// 设置粒子颜色 会附和图片修改图片颜色
// snowCell.color = [[UIColor redColor]CGColor];
// 添加到粒子发射器
snowEmitterlayer.emitterCells = @[snowCell];
运行效果如图:

开起来很单调是吧?我们来使用几个属性,让下雪变得好看吧:
①设置粒子缩放范围 snowCell.scaleRange
②设置粒子存在期间缩放变化的速率 snowCell.scaleSpeed
③设置粒子旋转速率 snowCell.spin
④设置粒子旋转范围snowCell.spinRange
如果想修改大雪我们就减少Y轴加速度,图片展现了以下两个修改,运行效果如图:


在上文的学习中,我们发现了CAEmitterCell的特点,即:CAEmitterCell也可以发射CAEmitterCell,现在就来给大家准确展示一下:
// 配置layer
CAEmitterLayer * fireworksLayer = [CAEmitterLayer layer];
[self.view.layer addSublayer:fireworksLayer];
// 发射源大小
fireworksLayer.emitterSize = CGSizeMake(self.view.layer.bounds.size.width * 0.1, 0.f);
// 发射位置 在底部向上发射
fireworksLayer.emitterPosition = CGPointMake(self.view.layer.bounds.size.width * 0.5, self.view.layer.bounds.size.height);
// 以直线发射
fireworksLayer.emitterShape = kCAEmitterLayerLine;
// 在指定位置的表面发射
fireworksLayer.emitterMode = kCAEmitterLayerSurface;
// 渲染效果,叠加高亮
fireworksLayer.renderMode = kCAEmitterLayerAdditive;
// 发射粒子效果
CAEmitterCell * shootCell = [CAEmitterCell emitterCell];
shootCell.name = @"shootCell";
// 粒子产生率 1秒一个
shootCell.birthRate = 2.f;
// 粒子存在时间 1.02 上一个销毁了下一个再发出来
shootCell.lifetime = 1.02f;
// 粒子速度和速度范围 默认是发射模式方向的加速度⭐️
shootCell.velocity = 600.f;
shootCell.velocityRange = 100.f;
// Y方向的加速度 模拟重力影响 发射会感受收到向下的阻碍
shootCell.yAcceleration = 150.f;
// 发射角度范围 看着更像是到处在放烟火
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-120576-2.html
可以么