【粒子动画】iOS流星雨效果如何实现

基于CAEmitterLayer实现从右上方到左下方滑过的流星雨效果
请添加图片描述

- (void)startRainEmitterAnimations {
    // 从右向左 斜下流星雨
    CAEmitterLayer *rainEmitter = [CAEmitterLayer layer];
    _rainEmitter = rainEmitter;
    [rainEmitter setEmitterPosition:CGPointMake(-300, 0)];
    [rainEmitter setEmitterSize:CGSizeMake(400, 0)];
    rainEmitter.birthRate = 1;
    [rainEmitter setEmitterMode:kCAEmitterLayerLine];
    [rainEmitter setEmitterShape:kCAEmitterLayerCuboid];
    [rainEmitter setRenderMode:kCAEmitterLayerAdditive];
    
    CAEmitterCell *rainFlake = [CAEmitterCell emitterCell];
    [rainFlake setBirthRate:10];
    [rainFlake setVelocity:500.0];
    [rainFlake setVelocityRange:300.0];
    [rainFlake setYAcceleration:0.0];
    [rainFlake setScale:0.3];
    [rainFlake setScaleSpeed:0.1];
    [rainFlake setLifetime:1.8];
    
    [rainFlake setEmissionLongitude:0.750 * M_PI];
    [rainFlake setContents:(id)[[UIImage imageNamed:@"starline"] CGImage]];
    
    [rainFlake setColor:[[UIColor colorWithRed:1 green:1 blue:1 alpha:0.600] CGColor]];
    [rainEmitter setEmitterDepth:10.0f];
    rainEmitter.shadowOpacity = 0.0;
    rainEmitter.shadowRadius = 0.0;
    rainEmitter.emitterCells = [NSArray arrayWithObject:rainFlake];
    [self.layer addSublayer:rainEmitter];
}

其他类似功能:
请添加图片描述

/*
CAEmitterLayer是继承自CALayer的layer类,拥有很多属性,其中此demo用到的属性有: 
       emitterCells:是用来与CAEmitterLayer关联显示粒子效果的,是CAEmitterCell的实例化对象,必须有值; 
       emitterPosition:粒子排放位置,默认值是(0, 0); 
       emitterShape:粒子排放形状,默认值是kCAEmitterLayerPoint; 
       emitterSize:粒子排放的大小,取决于emitterShape,可忽略; 
       emitterMode:粒子排放模式,默认值是kCAEmitterLayerVolume; 
       renderMode:粒子渲染模式,默认值是kCAEmitterLayerUnordered.
*/ 

/*
CAEmitterCell继承自NSObject且遵循一定协议的类,拥有很多属性,其中此demo用到的属性有: 
      birthRate:粒子每秒产生个数; 
      lifetime:粒子的生命周期; 
      emissionRange:粒子排放的范围; 
      velocity:粒子的速度; 
      velocityRange:粒子速度变化值; 
      alphaSpeed:粒子生命周期内颜色变化速度; 
      contents:CAEmitterCell的内容,是CGImageRef类型。
*/


//核心代码

// 下雨、下雪 
/** 
 *  设置emitterLayer的属性 
 */ 
- (void)initEmitterLayerProperties { 
     
    self.emitterLayer.emitterSize     = self.frame.size; 
    self.emitterLayer.emitterPosition = CGPointMake(self.frame.origin.x, self.frame.origin.y); 
} 


/** 
 *  设置emitterCell的属性并与emitterLayer关联显示动画效果 
 * 
 *  @param weather 天气名称 
 */ 
- (void)showWeather:(NSString *)weather { 
     
    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell]; 
    emitterCell.birthRate      = 20.f; 
    emitterCell.lifetime       = 100.f; 
    emitterCell.velocity       = 10.f; 
    emitterCell.velocityRange  = 3.f; 
    emitterCell.yAcceleration  = 5.f; 
    emitterCell.emissionRange  = 6 * M_2_PI; 
    emitterCell.contents       = (__bridge id _Nullable)([UIImage imageNamed:weather].CGImage); 
     
    self.emitterLayer.emitterCells = @[emitterCell]; 
} 
// 火焰 
/** 
 *  设置emitterLayer的属性 
 */ 
- (void)initEmitterLayerProperties { 
     
    self.emitterLayer.emitterSize     = self.frame.size; 
    self.emitterLayer.emitterPosition = CGPointMake(self.frame.origin.x, self.frame.origin.y); 
    self.emitterLayer.emitterMode     = kCAEmitterLayerPoints; 
    self.emitterLayer.renderMode      = kCAEmitterLayerBackToFront; 
} 


/** 
 *  设置emitterCell的属性并与emitterLayer关联显示动画效果 
 */ 
- (void)show { 
     
    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell]; 
    emitterCell.birthRate      = 200.f; 
    emitterCell.lifetime       = 10.f; 
    emitterCell.velocity       = 10.f; 
    emitterCell.velocityRange  = 15.f; 
    emitterCell.emissionRange  = 2 * M_PI; 
    emitterCell.alphaSpeed    -= 0.5f; 
    emitterCell.contents       = (__bridge id _Nullable)([UIImage imageNamed:@"fire_selected"].CGImage); 
     
    self.emitterLayer.emitterCells = @[emitterCell]; 
} 
// 烟花 
/** 
 *  设置emitterLayer的属性 
 */ 
- (void)initEmitterLayerProperties { 
     
    self.emitterLayer.emitterSize     = self.frame.size; 
    self.emitterLayer.emitterPosition = CGPointMake(self.frame.origin.x, self.frame.origin.y); 
    self.emitterLayer.emitterMode     = kCAEmitterLayerPoints; 
    self.emitterLayer.renderMode      = kCAEmitterLayerBackToFront; 
} 


/** 
 *  设置emitterCell的属性并与emitterLayer关联显示动画效果 
 */ 
- (void)show { 
     
    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell]; 
    emitterCell.birthRate      = 50.f; 
    emitterCell.lifetime       = 6.f; 
    emitterCell.velocity       = 50.f; 
    emitterCell.velocityRange  = 100.f; 
    emitterCell.emissionRange  = 2 * M_PI; 
    emitterCell.alphaSpeed    -= 0.5f; 
    emitterCell.contents       = (__bridge id _Nullable)([UIImage imageNamed:@"fireworks_selected"].CGImage); 
     
    self.emitterLayer.emitterCells = @[emitterCell]; 
} 

参考:
https://github.com/CoderXLL/Benyue
https://blog.csdn.net/JoyceZhaoQian/article/details/79899219
https://github.com/zhaoqianJoyce/ZQCAEmitterLayer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值