在iOS 5中,苹果引入了一个新的CALayer
子类叫做CAEmitterLayer
。CAEmitterLayer
是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。
CAEmitterLayer
看上去像是许多CAEmitterCell
的容器,这些CAEmitierCell
定义了一个例子效果。你将会为不同的例子效果定义一个或多个CAEmitterCell
作为模版,同时CAEmitterLayer
负责基于这些模版实例化一个粒子流。一个CAEmitterCell
类似于一个CALayer
:它有一个contents
属性可以定义为一个CGImage
,另外还有一些可设置属性控制着表现和行为。我们不会对这些属性逐一进行详细的描述,你们可以在CAEmitterCell
类的头文件中找到。
一、用CAEmitterLayer产生粒子效果
- (void)emitterLayer {
// 1.创建出Layer
CAEmitterLayer *emitterLayer = [CAEmitterLayer layer];
// 显示边框
emitterLayer.borderWidth = 1.f;
// 给定尺寸
emitterLayer.frame = CGRectMake(100, 100, 100, 100);
//emitterLayer.mask = YES;不超过范围
// 发射点
emitterLayer.emitterPosition = CGPointMake(0, 0);
// 发射模式
emitterLayer.emitterMode =kCAEmitterLayerSurface;
// 发射形状
emitterLayer.emitterShape =kCAEmitterLayerLine;
// 添加layer
[self.view.layeraddSublayer:emitterLayer];
// 2.创建粒子
CAEmitterCell *cell = [CAEmitterCell emitterCell];
// 粒子产生率
cell.birthRate = 10.f;
// 粒子生命周期
cell.lifetime = 10.f;
// 速度值
cell.velocity = 10;
// 速度值的微调值
cell.velocityRange = 3.f;
// y轴加速度
cell.yAcceleration = 2.f;
// 发射角度
cell.emissionRange = 4.f * M_1_PI;
// 设置粒子颜色
cell.color = [UIColorblackColor].CGColor;
// 设置图片
cell.contents = (__bridgeid)([UIImage imageNamed:@snow].CGImage);
// 让CAEmitterCell与CAEmitterLayer产生关联
emitterLayer.emitterCells = @[cell];
}
四。火焰效果
- (void) viewDidLoad
{
[super viewDidLoad];
CGRect viewBounds = self.view.layer.bounds;
// Create the emitter layers
self.fireEmitter = [CAEmitterLayer layer];
self.smokeEmitter = [CAEmitterLayer layer];
// Place layers just above the tab bar
self.fireEmitter.emitterPosition = CGPointMake(viewBounds.size.width/2.0, viewBounds.size.height - 60);
self.fireEmitter.emitterSize = CGSizeMake(viewBounds.size.width/2.0, 0);
self.fireEmitter.emitterMode = kCAEmitterLayerOutline;
self.fireEmitter.emitterShape = kCAEmitterLayerLine;
// with additive rendering the dense cell distribution will create "hot" areas
self.fireEmitter.renderMode = kCAEmitterLayerAdditive;
self.smokeEmitter.emitterPosition = CGPointMake(viewBounds.size.width/2.0, viewBounds.size.height - 60);
self.smokeEmitter.emitterMode = kCAEmitterLayerPoints;
// Create the fire emitter cell
CAEmitterCell* fire = [CAEmitterCell emitterCell];
[fire setName:@"fire"];
fire.birthRate = 100;
fire.emissionLongitude = M_PI;
fire.velocity = -80;
fire.velocityRange = 30;
fire.emissionRange = 1.1;
fire.yAcceleration = -200;
fire.scaleSpeed = 0.3;
fire.lifetime = 50;
fire.lifetimeRange = (50.0 * 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];
// Create the smoke emitter cell
CAEmitterCell* smoke = [CAEmitterCell emitterCell];
[smoke setName:@"smoke"];
smoke.birthRate = 11;
smoke.emissionLongitude = -M_PI / 2;
smoke.lifetime = 10;
smoke.velocity = -40;
smoke.velocityRange = 20;
smoke.emissionRange = M_PI / 4;
smoke.spin = 1;
smoke.spinRange = 6;
smoke.yAcceleration = -160;
smoke.contents = (id) [[UIImage imageNamed:@"DazSmoke"] CGImage];
smoke.scale = 0.1;
smoke.alphaSpeed = -0.12;
smoke.scaleSpeed = 0.7;
// Add the smoke emitter cell to the smoke emitter layer
self.smokeEmitter.emitterCells = [NSArray arrayWithObject:smoke];
self.fireEmitter.emitterCells = [NSArray arrayWithObject:fire];
[self.view.layer addSublayer:self.smokeEmitter];
[self.view.layer addSublayer:self.fireEmitter];
[self setFireAmount:0.9];
}
- (void) viewWillUnload
{
[super viewWillUnload];
[self.fireEmitter removeFromSuperlayer];
self.fireEmitter = nil;
[self.smokeEmitter removeFromSuperlayer];
self.smokeEmitter = nil;
}
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIDeviceOrientationPortrait);
}
// ---------------------------------------------------------------------------------------------------------------
#pragma mark -
#pragma mark Interaction
// ---------------------------------------------------------------------------------------------------------------
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self controlFireHeight:event];
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[self controlFireHeight:event];
}
- (void) controlFireHeight:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPoint = [touch locationInView:self.view];
float distanceToBottom = self.view.bounds.size.height - touchPoint.y;
float percentage = distanceToBottom / self.view.bounds.size.height;
percentage = MAX(MIN(percentage, 1.0), 0.1);
[self setFireAmount:2 *percentage];
}
- (void) setFireAmount:(float)zeroToOne
{
// Update the fire properties
[self.fireEmitter setValue:[NSNumber numberWithInt:(zeroToOne * 500)]
forKeyPath:@"emitterCells.fire.birthRate"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:zeroToOne]
forKeyPath:@"emitterCells.fire.lifetime"];
[self.fireEmitter setValue:[NSNumber numberWithFloat:(zeroToOne * 0.35)]
forKeyPath:@"emitterCells.fire.lifetimeRange"];
self.fireEmitter.emitterSize = CGSizeMake(50 * zeroToOne, 0);
[self.smokeEmitter setValue:[NSNumber numberWithInt:zeroToOne * 4]
forKeyPath:@"emitterCells.smoke.lifetime"];
[self.smokeEmitter setValue:(id)[[UIColor colorWithRed:1 green:1 blue:1 alpha:zeroToOne * 0.3] CGColor]
forKeyPath:@"emitterCells.smoke.color"];
}
火焰效果图如下: