iOS的粒子系统是通过CAEmitterCell
创建,然后通过CAEmitterLayer
发射层进行发射。
导入框架#import <QuartzCore>
- 下面介绍CAEmitterCell
的基本属性
1.+ (instancetype)emitterCell;
UIKit根据这个发射粒子和定义的基础上创建一个随机粒子。此原型包括一些属性来控制粒子的图片,颜色,方向,运动,缩放比例和生命周期。
2.@property(nullable) CGColorRef color;
粒子的颜色
3.@property float alphaRange;
一个粒子的颜色alpha能改变的范围
4.@property float alphaSpeed;
粒子透明度在生命周期内的改变速度
5.@property float redRange; @property float greenRange; @property float blueRange;
一个粒子的颜色blue,green,red能改变的范围
6.@property float redSpeed; @property float greenSpeed; @property float blueSpeed;
一个粒子blue,green,red在生命周期内改变的速度
7.@property(nullable, strong) id contents;
粒子要展现的图片,CGImageRef类型,否则不显示
8.@property CGRect contentsRect;
渲染的范围
9.@property CGFloat emissionLatitude;
发射Z轴方向的发射角度
10.@property CGFloat emissionLongitude;
粒子在xy平面的发射角度
11.@property CGFloat emissionRange;
粒子发射角度的容差
12.@property(nullable, copy) NSArray<CAEmitterCell> *emitterCells;
粒子发射的粒子
13.@property(getter=isEnabled) BOOL enabled;
粒子是否允许发射器渲染
14.@property float lifetime;
粒子生存时间
15.@property float lifetimeRange;
粒子生存时间范围,设置之后 lifetime +/-= lifetimeRange
16.@property(copy) NSString *minificationFilter; @property(copy) NSString *magnificationFilter;
减小,增加自己的大小
17.@property float minificationFilterBias;
减少大小的因子
18.@property(nullable, copy) NSString *name;
粒子的名字
19.@property CGFloat scale;
粒子缩放大小
20.@property CGFloat scaleRange;
粒子缩放范围
21.@property CGFloat scaleSpeed;
粒子缩放速度
22.@property CGFloat spin;
旋转角度
23.@property CGFloat spinRange;
旋转角度范围
24.@property CGFloat velocity;
粒子的速度
25.@property CGFloat velocityRange;
粒子速度范围
26.@property CGFloat xAcceleration; @property CGFloat yAcceleration; @property CGFloat zAcceleration;
粒子在x,y,x方向的加速度
- 发射层CAEmitterLayer
属性
1.+ (instancetype)layer;
由很多emitterCell组成的发射层,控制粒子的形状,发射位置,提供了一个粒子发射器系统为核心的动画
2.@property(nullable, copy) NSArray<CAEmitterCell> *emitterCells;
装着CAEmitterCell对象的粒子单元数组,被用于把粒子投放到layer上
3.@property CGPoint emitterPosition;
发射器在xy平面的中心位置
4.@property CGFloat emitterZPosition;
发射器的Z平面位置
5.@property CGSize emitterSize;
发射器的尺寸大小
6.@property CGFloat emitterDepth;
发射器的深度,在某些模式下会产生立体效果
7.@property(copy) NSString *emitterMode;
发射模式
kCAEmitterLayerPoints 从发射器中发出 kCAEmitterLayerOutline 从发射器边缘发出 kCAEmitterLayerSurface 从发射器表面发出 kCAEmitterLayerVolume 从发射器中点发出
8.@property(copy) NSString *emitterShape;
发射器的形状
kCAEmitterLayerPoint 点的形状,粒子从一个点出发 kCAEmitterLayerLine 线的形状,粒子从一条线出发 kCAEmitterLayerRectangle 矩形形状,粒子从一个矩形出发 kCAEmitterLayerCuboid 立方体形状,会影响Z平面的效果 kCAEmitterLayerCircle 圆形,粒子会在圆形范围发射 kCAEmitterLayerSphere 球形
9.@property(copy) NSString *renderMode;
渲染模式
kCAEmitterLayerUnordered 这种模式下,粒子是无序出现的,多个发射源将混合 kCAEmitterLayerOldestFirst 这种模式下,生命久的粒子会被渲染在最上层 kCAEmitterLayerOldestLast 这种模式下,年轻的粒子会被渲染在最上层 kCAEmitterLayerBackToFront 这种模式下,粒子的渲染按照Z轴的前后顺序进行 kCAEmitterLayerAdditive 这种模式会进行粒子混合
10.@property BOOL preservesDepth;
是否开启三维空间效果
11.@property float birthRate;
粒子产生速度 默认为1.0
12.@property float lifetime;
粒子存活时间,默认为1s
13.@property float scale;
粒子的缩放大小
14.@property unsigned int seed;
用于初始化随机数产生的粒子
15.@property float spin;
粒子的旋转位置
16.@property float velocity;
粒子的运动速度
写几行代码用起来
CAEmitterLayer *fireEmitter = [CAEmitterLayer layer];
fireEmitter.emitterPosition = CGPointMake(self.view.frame.size.width/2.0, self.view.frame.size.height - 60);
fireEmitter.emitterSize = CGSizeMake( 50, 0);
fireEmitter.emitterShape = kCAEmitterLayerLine;
fireEmitter.renderMode = kCAEmitterLayerAdditive;
//火焰
CAEmitterCell* fire = [CAEmitterCell emitterCell];
[fire setName:@"fire"];
fire.birthRate = 500;
fire.emissionLongitude = M_PI;
fire.velocity = -80;
fire.velocityRange = 30;
fire.emissionRange = 1.1;
fire.yAcceleration = -200;
fire.scaleSpeed = 0.3;
fire.lifetime = 1;
fire.lifetimeRange = 0.35;
fire.color = [[UIColor colorWithRed:0.8 green:0.4 blue:0.2 alpha:0.1] CGColor];
fire.contents = (id) [[UIImage imageNamed:@"DazFire"] CGImage];
//烟雾
CAEmitterCell* smoke = [CAEmitterCell emitterCell];
[smoke setName:@"smoke"];
smoke.birthRate = 11;
smoke.lifetime = 4;
smoke.velocity = -40;
smoke.velocityRange = 20;
smoke.emissionRange = M_PI / 4;
smoke.spinRange = 6;
smoke.yAcceleration = -160;
smoke.scale = 0.1;
smoke.alphaSpeed = -0.12;
smoke.scaleSpeed = 0.7;
smoke.contents = (id) [[UIImage imageNamed:@"DazSmoke"] CGImage];
smoke.color = [[UIColor colorWithWhite:0.5 alpha:0.3]CGColor];
fireEmitter.emitterCells = @[smoke,fire];
[self.view.layer addSublayer:fireEmitter];
产生火焰效果