动画(四) CAEmitterLayer 粒子动画

CAEmitterLayer简介:

CAEmitterLayer(粒子发射器)继承自CALayer,提供了一个基于Core Animation的粒子发射系统,粒子用CAEmitterCell来初始化,一个单独的CAEmitterLayer可同时支持多个CAEmitterCell。

简单来说CAEmitterLayer就是发射器,可以设置位置、大小、形状等属性;CAEmitterCell就是发射出来的粒子,可以设置粒子图片,速度,旋转等属性。一个CAEmitterLayer可以同时发射多种不同的CAEmitterCell。

一、CAEmitterLayer本身没有什么难度,主要在于两点:

1、属性较多

2、调参数比较费时(想要有好的动画效果还得慢慢的去调整各项参数,不过没有难度就是有点费时间)

下面先认识一下CAEmitterLayer的属性

// 常用属性:

NSArray *emitterCells; // 用来装粒子的数组

CGPoint emitterPosition; // 决定了粒子发射形状的中心点

CGFloat emitterZPosition;// 决定了粒子发射形状的Z轴位置

CGSize emitterSize; // 发射源的尺寸大小

NSString *emitterShape; // 发射源的形状,有6种值,分别是点、线、矩形、立方体、圆形、球形,具体的实现效果自己可以体验下。

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; // 随机数发生器

二、另外给出部分参数取值详解。

1、emitterShape参数取值:

NSString * const kCAEmitterLayerPoint;//点的形状,粒子从一个点发出

NSString * const kCAEmitterLayerLine;//线的形状,粒子从一条线发出

NSString * const kCAEmitterLayerRectangle;//矩形形状,粒子从一个矩形中发出

NSString * const kCAEmitterLayerCuboid;//立方体形状,会影响Z平面的效果

NSString * const kCAEmitterLayerCircle;//圆形,粒子会在圆形范围发射

NSString * const kCAEmitterLayerSphere;//球型

2、emitterMode参数取值:

NSString * const kCAEmitterLayerPoints;//从发射器中发出

NSString * const kCAEmitterLayerOutline;//从发射器边缘发出

NSString * const kCAEmitterLayerSurface;//从发射器表面发出

NSString * const kCAEmitterLayerVolume;//从发射器中点发出

3、renderMode参数取值:

NSString * const kCAEmitterLayerUnordered;//粒子无序出现

NSString * const kCAEmitterLayerOldestFirst;//声明久的粒子会被渲染在最上层

NSString * const kCAEmitterLayerOldestLast;//年轻的粒子会被渲染在最上层

NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z轴的前后顺序进行

NSString * const kCAEmitterLayerAdditive;//粒子混合

三、CAEmitterCell的属性

其实CAEmitterCell的名字叫粒子,下面详细的介绍了CAEmitterCell的属性,只要求大家属性一下,以后用到了可以再来查阅。

emitterCell:初始化方法。

name: //用于构建key paths。这也是后面手动控制动画开始和结束的关键。

color:粒子的颜色。

enabled:粒子是否渲染。

contents:渲染粒子,是个CGImageRef的对象,即粒子要展示的图片。

contentsRect:渲染范围。

birthRate://每秒生成多少个粒子

lifetime://粒子存活的时间,以秒为单位

lifetimeRange://可以为这个粒子存活的时间再指定一个范围。

上面两个属性如果只用了lifetime那么粒子的存活时间就是固定的,比如lifetime=10,那么粒子10s秒后就消失了。

如果使用了lifetimeRange,比如lifetimeRange=5,那么粒子的存活时间就是在5s~15s这个范围内消失。

velocity://粒子平均初始速度。正数表示竖直向上,负数竖直向下。

velocityRange://可以再指定一个范围。

上面两个属性同lifetime和lifetimeRange

spin:粒子旋转速度。

spinrange:粒子旋转速度范围,同lifetime和lifetimeRange

scale:缩放比例

scaleRange:缩放比例范围,同lifetime和lifetimeRange

scaleSpeed:缩放比例速度。

alphaRange::一个粒子的颜色alpha能改变的范围。

alphaSpeed::粒子透明度在生命周期内的改变速度。

redRange:一个粒子的颜色red能改变的范围。

redSpeed:粒子red在生命周期内的改变速度。

blueRange:一个粒子的颜色blue能改变的范围。

blueSpeed:粒子blue在生命周期内的改变速度。

greenRange:一个粒子的颜色green能改变的范围。

greenSpeed:粒子green在生命周期内的改变速度。

xAcceleration:粒子x方向的加速度分量。

yAcceleration:粒子y方向的加速度分量。

zAcceleration:粒子z方向的加速度分量。

emissionRange:粒子发射角度范围。

emissionLongitude:粒子在xy平面的发射角度。

emissionLatitude:发射的z轴方向的发射角度。


四、CAEmitterLayer及CAEmitterCell属性介绍完了,我们下边看一下代码示例:雪花飘落

self.emitterLayer.emitterPosition = CGPointMake(self.view.width/2, 0);//发射器中心点
self.emitterLayer.emitterSize = CGSizeMake(self.view.width, 0);//发射器大小,因为emitterShape设置成线性所以高度可以设置成0,
self.emitterLayer.emitterShape = kCAEmitterLayerLine;//发射器形状为线性
self.emitterLayer.emitterMode = kCAEmitterLayerOutline;//从发射器边缘发出
NSMutableArray *array = [NSMutableArray array];//CAEmitterCell数组,存放不同的CAEmitterCell,我这里准备了四张不同形态的叶子图片。
for (int i = 0; i<4; i++) {
     NSString *imageName = [NSString stringWithFormat:@"雪花%d",i%2];
     CAEmitterCell *snowCell = [CAEmitterCell emitterCell];
     snowCell.birthRate = 2;//粒子产生速度
     snowCell.lifetime = 20;//粒子存活时间
     snowCell.velocity = 10;//初始速度
     snowCell.velocityRange = 5;//初始速度的差值区间,所以初始速度为5~15,后面属性range算法相同
     snowCell.yAcceleration = 7;//y轴方向的加速度,落叶下飘只需要y轴正向加速度。
     snowCell.spin = 1.0;//粒子旋转速度
     snowCell.spinRange = 2.0;//粒子旋转速度范围
     snowCell.emissionRange = M_PI;//粒子发射角度范围
     snowCell.contents = (id)[[UIImage imageNamed:imageName] CGImage];//粒子图片
     snowCell.scale = 0.3;//缩放比例
     snowCell.scaleRange = 0.2;//缩放比例
     snowCell.alphaSpeed = -0.05;//透明度速度
     [array addObject:snowCell];
}
self.emitterLayer.emitterCells = array;//设置粒子组

关于粒子动及属性及示例,就写到这里了,更多动画请参照[demo]。

你可能感兴趣的:(动画(四) CAEmitterLayer 粒子动画)