IOS 使用 CAEmitterLayer实现粒子效果

在iOS 5中,苹果引入了一个新的CALayer子类叫做CAEmitterLayerCAEmitterLayer是一个高性能的粒子引擎,被用来创建实时例子动画如:烟雾,火,雨等等这些效果。

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"];
}
火焰效果图如下:

猜你喜欢

转载自blog.csdn.net/u011646339/article/details/51859641
今日推荐