简介:CAEmitterLayer是发射、和渲染粒子系统的层。 是CALayer的一个常用子类,CALayer的子类有很多,如果能较好的使用它们会受到一些意想不到的效果。CAEmitterLayer就是其中之一ios下雪下雨的,CAEmitterLayer是用于推动基于Core Animation的粒子发生器系统。由CAEmitterCell实例定义的粒子被描绘在层的背景色彩和边框之上。
具体属性清单:
// 常用属性:
NSArray<CAEmitterCell *> *emitterCells; // 用来装粒子的数组
CGPoint emitterPosition; // 决定了粒子发射形状的中心点
CGFloat emitterZPosition;
CGSize emitterSize; // 发射源的尺寸大小
NSString *emitterShape; // 发射源的形状
NSString *emitterMode; // 发射模式
NSString *renderMode; // 渲染模式
// 不常用属性:
float birthRate; // 粒子产生系数,默认1.0 (可以在Cell里面赋值)
float lifetime; // 粒子的生命周期系数, 默认1.0 (可以在Cell里面赋值)
BOOL preservesDepth; // 定义该层是否将其子层压平到其平面。
CGFloat emitterDepth; // 确定发射器形状的深度
float velocity; // 粒子速度系数, 默认1.0 (可以在Cell里面赋值)
float scale; // 粒子的缩放比例系数, 默认1.0 (可以在Cell里面赋值)
float spin; // 粒子的自旋转速度系数, 默认1.0 (可以在Cell里面赋值)
unsigned int seed; // 随机数发生器
CAEmitterLayer的使用方法如下:
// 1.创建CAEmitterLayer
emitterLayer = [CAEmitterLayer layer];
// 2.设置CAEmitterLayer的属性(最主要的是前四个)
// 发射源的形状 是枚举类型
emitterLayer.emitterShape = kCAEmitterLayerLine;
// kCAEmitterLayerCircle
// 粒子从一个以(发射位置)为中心的圆中发射出来。
// kCAEmitterLayerCuboid
// 粒子从一个相反角的长方体(3D矩形)发射。
// kCAEmitterLayerLine
// 粒子从(发射位置)沿直线发射。
// kCAEmitterLayerPoint
// 粒子从一个点(发射位置)发射出来。
// kCAEmitterLayerRectangle
// 粒子从一个有相对角的矩形发射。
// kCAEmitterLayerSphere
// 粒子从一个以(发射位置)为中心的球体中发射出来。
// 发射模式 枚举类型
emitterLayer.emitterMode = kCAEmitterLayerSurface;
// kCAEmitterLayerOutline
// 粒子从粒子发射器的轮廓发射出来。
// kCAEmitterLayerPoints
// 粒子从粒子发射器上的点发射出来。
// kCAEmitterLayerSurface
// 粒子从粒子发射器的表面发射出来。
// kCAEmitterLayerVolume
// 粒子从粒子发射器中的a位置发射。
// 发射源的size 决定了发射源的大小,如果做了倾斜或者便宜屏幕宽度是不够的,那时候就需要自定义
emitterLayer.emitterSize = self.view.frame.size;
// 发射源的位置
emitterLayer.emitterPosition = CGPointMake(self.view.bounds.size.width * 0.5, -10);
// 渲染模式 枚举类型 (⭐️这个渲染模式表达效果会很不好,不常用,kCAEmitterLayerAdditive,可以让重叠的部分高亮)
emitterLayer.renderMode = kCAEmitterLayerAdditive;
// kCAEmitterLayerOldestFirst;
// kCAEmitterLayerOldestLast;
// kCAEmitterLayerBackToFront;
// kCAEmitterLayerAdditive;
// 3.添加到目标视图的layer上
[self.view.layer addSublayer:emitterLayer];
简介:CAEmitterCell类表示CAEmitterLayer对象发出的一个粒子源。 CAEmitterCell定义发射粒子的方向和性质。CAEmitterLayer发射器可以有一系列子粒子,这些子粒子可以让微粒自己发射粒子,也就是CAEmitterCell也可以发射CAEmitterCell
/**
具体属性清单:
// 常用属性清单(以空行来划分使用点):
NSString *name; // 粒子名字, 默认为nil
float birthRate; // 粒子的产生率,默认0
float lifetime; // 粒子的生命周期,以秒为单位。默认0
float lifetimeRange; // 粒子的生命周期的范围,以秒为单位。默认0
CGFloat emissionLatitude;// 指定纬度,纬度角代表了在x-z轴平面坐标系中与x轴之间的夹角,默认0:
CGFloat emissionLongitude; // 指定经度,经度角代表了在x-y轴平面坐标系中与x轴之间的夹角,默认0:
CGFloat emissionRange; //发射角度范围,默认0,以锥形分布开的发射角度。角度用弧度制。粒子均匀分布在这个锥形范围内;
CGFloat velocity; // 速度和速度范围,两者默认0
CGFloat velocityRange;
CGFloat xAcceleration; // x,y,z方向上的加速度分量,三者默认都是0
CGFloat yAcceleration;
CGFloat zAcceleration;
CGFloat scale; // 缩放比例, 默认是1
CGFloat scaleRange; // 缩放比例范围,默认是0
CGFloat scaleSpeed; // 在生命周期内的缩放速度,默认是0
CGFloat spin; // 粒子的平均旋转速度,默认是0
CGFloat spinRange; // 自旋转角度范围,弧度制,默认是0
CGColorRef color; // 粒子的颜色,默认白色
float redRange; // 粒子颜色red,green,blue,alpha能改变的范围,默认0
float greenRange;
float blueRange;
float alphaRange;
float redSpeed; // 粒子颜色red,green,blue,alpha在生命周期内的改变速度,默认都是0
float greenSpeed;
float blueSpeed;
float alphaSpeed;
id contents; // 粒子的内容,为CGImageRef的对象
NSArray<CAEmitterCell *> *emitterCells; // 粒子里面的粒子
// 非常不常用属性:
BOOL enabled;
NSDictionary *style;
CGRect contentsRect;
CGFloat contentsScale;
NSString *minificationFilter;
NSString *magnificationFilter;
float minificationFilterBias;
*/
CAEmitterCell的使用形式如下:
// 1. 配置cell
CAEmitterCell * showCell = [CAEmitterCell emitterCell];
// 2. 设置属性
showCell.contents = (id)[[UIImage imageNamed:@"xxx"] CGImage]; // 粒子的内容 是CGImageRef类型的
// 粒子的产生率
showCell.birthRate = 25.f;
// 粒子的生命周期,以秒为单位。
showCell.lifetime = 100.f;
// 粒子的生命周期的范围,以秒为单位。默认0
showCell.lifetimeRange = 25.f;
// 速度,制约粒子生命周期
// 官方解释为:指定时间如何从父时间空间映射到接收者的时间空间。「必需的」
// 值越大粒子消失的越快
showCell.speed = 2.f;
// 速度
showCell.velocity = 20.f;
// 速度范围
showCell.velocityRange = 80.f;
// 三轴加速度(一般使用Y值)
showCell.yAcceleration = 90.f;
// showCell.xAcceleration = 20.f;
// showCell.zAcceleration = 10.f;
// 缩放比列
showCell.scale = 0.3;
// 缩放范围
showCell.scaleRange = 0.5;
// 在粒子的生命周期内尺度变化的速度。可以做成。
showCell.scaleSpeed = 0.02;
// 设置经纬度(方向)(⭐️⭐️需要在 kCAEmitterLayerPoint 的情况下搭配使用)
// showCell.emissionLongitude = M_PI; // 上(-M_PI_2) 下(M_PI_2) 左(M_PI) 右(M_PI_4) 通常使用这个
// // showCell.emissionLatitude = -M_PI_2; // 前(-M_PI_2) 后(M_PI_2) 左(M_PI) 右(M_PI_4)
// // 设置角度,控制发射范围(受到经纬度的影响)
// showCell.emissionRange = M_PI / 6; // 围绕X轴向左90度
// 设置自转速度
showCell.spin = 0.f;
// 设置自转方向
showCell.spinRange = M_PI;
// 设置颜色(⭐️⭐️直接影响到图片的原有颜色)
// snowCell.color = [[UIColor colorWithRed:0.5 green:0.f blue:0.5 alpha:1.f] CGColor];
// 粒子在三个色相中以及可见度的变化程度
showCell.redRange = 10.f;
showCell.greenRange = 20.f;
showCell.blueRange = 30.f;
showCell.redSpeed = 1.f;
showCell.greenSpeed = 1.f;
showCell.blueSpeed = 1.f;
showCell.alphaRange = 0.8;
showCell.alphaSpeed = -0.1f;
// 3.粒子添加到CAEmitterLayer上
emitterLayer.emitterCells = @[showCell];
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-120576-1.html
我们的飞机相互之间确定位置的技术手段还主要依靠罗盘和地面指示