CAEmitterLayer简介:
CAEmitterLayer(粒子发射器)继承自CALayer,提供了一个基于Core Animation的粒子发射系统,粒子用CAEmitterCell来初始化,一个单独的CAEmitterLayer可同时支持多个CAEmitterCell。
CAEmitterLayer属性:
emitterCells:CAEmitterCell对象的数组,用于把粒子投放到layer上。
birthRate:粒子产生速度,默认1个每秒。
lifetime:粒子纯在时间,默认1秒。
emitterPosition:发射器在xy平面的中心位置。
emitterZPosition:发射器在z平面的位置。
preservesDepth:是否开启三维效果。
velocity:粒子运动速度。
scale:粒子的缩放比例。
spin:自旋转速度。
seed:用于初始化随机数产生的种子。
emitterSize:发射器的尺寸。
emitterDepth:发射器的深度。
emitterShape:发射器的形状
NSString * const kCAEmitterLayerPoint;//点的形状,粒子从一个点发出
NSString * const kCAEmitterLayerLine;//线的形状,粒子从一条线发出
NSString * const kCAEmitterLayerRectangle;//矩形形状,粒子从一个矩形中发出
NSString * const kCAEmitterLayerCuboid;//立方体形状,会影响Z平面的效果
NSString * const kCAEmitterLayerCircle;//圆形,粒子会在圆形范围发射
NSString * const kCAEmitterLayerSphere;//球型
emitterMode:发射器发射模式
NSString * const kCAEmitterLayerPoints;//从发射器中发出
NSString * const kCAEmitterLayerOutline;//从发射器边缘发出
NSString * const kCAEmitterLayerSurface;//从发射器表面发出
NSString * const kCAEmitterLayerVolume;//从发射器中点发出
renderMode:发射器渲染模式
NSString * const kCAEmitterLayerUnordered;//粒子无序出现
NSString * const kCAEmitterLayerOldestFirst;//声明久的粒子会被渲染在最上层
NSString * const kCAEmitterLayerOldestLast;//年轻的粒子会被渲染在最上层
NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z轴的前后顺序进行
NSString * const kCAEmitterLayerAdditive;//粒子混合
CAEmitterCell属性:
emitterCell:初始化方法。
name:粒子的名字。
color:粒子的颜色。
enabled:粒子是否渲染。
contents:渲染粒子,是个CGImageRef的对象,即粒子要展示的图片。
contentsRect:渲染范围。
birthRate:粒子产生速度。
lifetime:生命周期。
lifetimeRange:生命周期增减范围。
velocity:粒子运动速度。
velocityRange:速度范围。
spin:粒子旋转角度。
spinrange:粒子旋转角度范围。
scale:缩放比例。
scaleRange:缩放比例范围。
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轴方向的发射角度。
做了一个小Demo,效果图如下:
下面贴上代码:
[objc]view plaincopy
#import "ViewController.h"
//获得屏幕的宽高
#define mainW [UIScreen mainScreen].bounds.size.width
#define mainH [UIScreen mainScreen].bounds.size.height
@interfaceViewController ()
@property(nonatomic,strong)CAEmitterLayer*noteEmitter;
@property(nonatomic,strong)CAEmitterLayer*petalEmitter;
@property(nonatomic,strong)CAEmitterLayer*sunEmitter;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor= [UIColorwhiteColor];
//创建控件
[selfcreatControl];
}
- (void)creatControl
{
//唱歌小人背景
UIImageView*imageView = [[UIImageViewalloc]initWithFrame:CGRectMake((mainW -170) *0.5, mainH -350,170,230)];
imageView.image= [UIImageimageNamed:@"bj.jpg"];
[self.viewaddSubview:imageView];
//按钮标题数组
NSArray*titleArray = @[@"唱歌",@"花瓣",@"太阳",@"停止"];
//按钮宽度
CGFloat btnWidth =70;
//按钮间距
CGFloat padding = (mainW -btnWidth* titleArray.count) / (titleArray.count+1);
//创建按钮
for(inti =0; i < titleArray.count; i++) {
UIButton*btn = [[UIButtonalloc]initWithFrame:CGRectMake(padding + (padding + btnWidth) * i, CGRectGetMaxY(imageView.frame) +20, btnWidth,30)];
[btnsetTitle:titleArray[i]forState:UIControlStateNormal];
[btnsetBackgroundColor:[UIColororangeColor]];
btn.tag= i;
[btnaddTarget:selfaction:@selector(btnOnClick:)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:btn];
}
}
- (void)btnOnClick:(UIButton*)btn
{
//唱歌按钮点击事件
if(btn.tag==0) {
//重复点击先清空发射器
[_noteEmitterremoveFromSuperlayer];
_noteEmitter =nil;
//初始化发射器
_noteEmitter = [[CAEmitterLayeralloc]init];
//粒子发射位置
_noteEmitter.emitterPosition= CGPointMake(mainW*0.5+15,390);
//发射源的尺寸大小
_noteEmitter.emitterSize= CGSizeMake(10,10);
//发射模式
_noteEmitter.renderMode= kCAEmitterLayerUnordered;
//发射源的形状
_noteEmitter.emitterMode= kCAEmitterLayerSurface;
//发射单元
NSMutableArray*cellArray = [NSMutableArrayarray];
for(inti =0; i <3; i++) {
CAEmitterCell*note = [CAEmitterCellemitterCell];
//粒子产生速度
note.birthRate=0.7+0.5* i;
note.speed=0.5;
//粒子移动速度
note.velocity=100;
//在原属性上增减的范围,现在粒子速度范围是100 - 30 ~ 100 + 30(70 ~ 130),其他属性后加Range同理
note.velocityRange=30;
//粒子生命周期
note.lifetime=0.8;
note.lifetimeRange=0.1;
//粒子旋转速度
note.spin=1;
//粒子缩放比例
note.scale=0.1;
note.scaleSpeed=1;
//粒子透明度变化速度
// note.alphaSpeed = -0.8;
//粒子发射角度
note.emissionLongitude= M_PI + M_PI_2;
note.emissionRange= M_PI_2;
//随机生成图片名字
NSString*str = [NSStringstringWithFormat:@"note%d", arc4random_uniform(4)];
note.contents= (__bridgeid)[[UIImageimageNamed:str]CGImage];
//粒子展示的图片
NSString*name = [NSStringstringWithFormat:@"note%d",i];
//粒子的名字
note.name= name;
[cellArrayaddObject:note];
}
_noteEmitter.emitterCells= cellArray;
//添加到layer层
[self.view.layeraddSublayer:_noteEmitter];
//花瓣按钮点击事件
}elseif(btn.tag==1) {
[_petalEmitterremoveFromSuperlayer];
_petalEmitter =nil;
_petalEmitter = [[CAEmitterLayeralloc]init];
_petalEmitter.emitterPosition= CGPointMake(0,0);
_petalEmitter.emitterSize= CGSizeMake(mainW,1);
_petalEmitter.renderMode= kCAEmitterLayerOldestLast;
_petalEmitter.emitterMode= kCAEmitterLayerPoints;
_petalEmitter.emitterShape= kCAEmitterLayerRectangle;
NSMutableArray*cellArray = [NSMutableArrayarray];
for(inti =0; i <5; i++) {
CAEmitterCell*petal = [CAEmitterCellemitterCell];
petal.birthRate=0.5+0.2* i;
petal.velocity=100;
petal.velocityRange=100;
petal.lifetime=10;
petal.spin=0.5;
petal.emissionLongitude= -M_PI - M_PI_2;
petal.emissionRange= M_PI_2;
NSString*str = [NSStringstringWithFormat:@"petal%d", arc4random_uniform(5)];
petal.contents= (__bridgeid)[[UIImageimageNamed:str]CGImage];
NSString*name = [NSStringstringWithFormat:@"petal%d",i];
petal.name= name;
[cellArrayaddObject:petal];
}
_petalEmitter.emitterCells= cellArray;
[self.view.layeraddSublayer:_petalEmitter];
//太阳按钮点击事件
}elseif(btn.tag==2) {
[_sunEmitterremoveFromSuperlayer];
_sunEmitter =nil;
_sunEmitter = [CAEmitterLayerlayer];
_sunEmitter.frame=self.view.bounds;
_sunEmitter.emitterPosition= CGPointMake(0,0);
_sunEmitter.renderMode= kCAEmitterLayerAdditive;
CAEmitterCell*sun = [[CAEmitterCellalloc]init];
sun.contents= (__bridgeid)[UIImageimageNamed:@"petal4"].CGImage;
sun.birthRate=800;
sun.lifetime=2.0;
sun.color= [UIColorcolorWithRed:1green:0.5blue:0.1alpha:1.0].CGColor;
sun.alphaSpeed= -0.4;
sun.velocity=50;
sun.velocityRange=10;
sun.emissionRange=M_PI*2.0;
_sunEmitter.emitterCells= @[sun];
[self.view.layeraddSublayer:_sunEmitter];
//停止按钮点击事件
}elseif(btn.tag==3) {
[_noteEmitterremoveFromSuperlayer];
_noteEmitter =nil;
[_petalEmitterremoveFromSuperlayer];
_petalEmitter =nil;
[_sunEmitterremoveFromSuperlayer];
_sunEmitter =nil;
}
}
@end