iOS-粒子系統(tǒng)

iOS的粒子系統(tǒng)是通過CAEmitterCell創(chuàng)建,然后通過CAEmitterLayer發(fā)射層進(jìn)行發(fā)射。 導(dǎo)入框架#import <QuartzCore>

  • 下面介紹CAEmitterCell的基本屬性
 + (instancetype)emitterCell;// UIKit根據(jù)這個(gè)發(fā)射粒子和定義的基礎(chǔ)上創(chuàng)建一個(gè)隨機(jī)粒子。此原型包括一些屬性來控制粒子的圖片,顏色,方向,運(yùn)動(dòng),縮放比例和生命周期。

 @property(nullable) CGColorRef color; //粒子的顏色

 @property float alphaRange;// 一個(gè)粒子的顏色alpha能改變的范圍

 @property float alphaSpeed; //粒子透明度在生命周期內(nèi)的改變速度

 @property float redRange; 
 @property float greenRange; 
 @property float blueRange; ///一個(gè)粒子的顏色blue,green,red能改變的范圍

 @property float redSpeed; 
 @property float greenSpeed; 
 @property float blueSpeed; ///一個(gè)粒子blue,green,red在生命周期內(nèi)改變的速度

 @property(nullable, strong) id contents; //粒子要展現(xiàn)的圖片,CGImageRef類型,否則不顯示

 @property CGRect contentsRect; //渲染的范圍

 @property CGFloat emissionLatitude; //發(fā)射Z軸方向的發(fā)射角度

 @property CGFloat emissionLongitude; //粒子在xy平面的發(fā)射角度

 @property CGFloat emissionRange; //粒子發(fā)射角度的容差

 @property(nullable, copy) NSArray<CAEmitterCell> *emitterCells; //粒子發(fā)射的粒子

 @property(getter=isEnabled) BOOL enabled; //粒子是否允許發(fā)射器渲染

 @property float lifetime;// 粒子生存時(shí)間

 @property float lifetimeRange; //粒子生存時(shí)間范圍,設(shè)置之后 lifetime +/-= lifetimeRange

 @property(copy) NSString *minificationFilter; 
 @property(copy) NSString *magnificationFilter;// 減小,增加自己的大小

 @property float minificationFilterBias;// 減少大小的因子

 @property(nullable, copy) NSString *name; //粒子的名字

 @property CGFloat scale; //粒子縮放大小

 @property CGFloat scaleRange; //粒子縮放范圍

 @property CGFloat scaleSpeed; //粒子縮放速度

 @property CGFloat spin; //旋轉(zhuǎn)角度

 @property CGFloat spinRange; //旋轉(zhuǎn)角度范圍

 @property CGFloat velocity; //粒子的速度

 @property CGFloat velocityRange;// 粒子速度范圍

 @property CGFloat xAcceleration;
 @property CGFloat yAcceleration;
 @property CGFloat zAcceleration; //粒子在x,y,x方向的加速度

發(fā)射層CAEmitterLayer屬性

  + (instancetype)layer;
  // 由很多emitterCell組成的發(fā)射層,控制粒子的形狀,發(fā)射位置,提供了一個(gè)粒子發(fā)射器系統(tǒng)為核心的動(dòng)畫

  @property(nullable, copy) NSArray<CAEmitterCell> *emitterCells; 
  //裝著   CAEmitterCell對(duì)象的粒子單元數(shù)組,被用于把粒子投放到layer上

  @property CGPoint emitterPosition; //發(fā)射器在xy平面的中心位置

  @property CGFloat emitterZPosition;// 發(fā)射器的Z平面位置

  @property CGSize emitterSize; //發(fā)射器的尺寸大小

  @property CGFloat emitterDepth; //發(fā)射器的深度,在某些模式下會(huì)產(chǎn)生立體效果

  @property(copy) NSString *emitterMode; //發(fā)射模式

  kCAEmitterLayerPoints //從發(fā)射器中發(fā)出 
  kCAEmitterLayerOutline //從發(fā)射器邊緣發(fā)出
  kCAEmitterLayerSurface //從發(fā)射器表面發(fā)出 
  kCAEmitterLayerVolume //從發(fā)射器中點(diǎn)發(fā)出

  @property(copy) NSString *emitterShape; //發(fā)射器的形狀

  kCAEmitterLayerPoint //點(diǎn)的形狀,粒子從一個(gè)點(diǎn)出發(fā) 
  kCAEmitterLayerLine //線的形狀,粒子從一條線出發(fā) 
  kCAEmitterLayerRectangle //矩形形狀,粒子從一個(gè)矩形出發(fā) 
  kCAEmitterLayerCuboid //立方體形狀,會(huì)影響Z平面的效果 
  kCAEmitterLayerCircle //圓形,粒子會(huì)在圓形范圍發(fā)射 kCAEmitterLayerSphere 球形
 
  @property(copy) NSString *renderMode;// 渲染模式

  kCAEmitterLayerUnordered //這種模式下,粒子是無序出現(xiàn)的,多個(gè)發(fā)射源將混合        
  kCAEmitterLayerOldestFirst //這種模式下,生命久的粒子會(huì)被渲染在最上層       
  kCAEmitterLayerOldestLast// 這種模式下,年輕的粒子會(huì)被渲染在最上層   
  kCAEmitterLayerBackToFront //這種模式下,粒子的渲染按照Z軸的前后順序進(jìn)行          
  kCAEmitterLayerAdditive //這種模式會(huì)進(jìn)行粒子混合
  @property BOOL preservesDepth; //是否開啟三維空間效果

  @property float birthRate; //粒子產(chǎn)生速度 默認(rèn)為1.0

  @property float lifetime; //粒子存活時(shí)間,默認(rèn)為1s

  @property float scale; //粒子的縮放大小

  @property unsigned int seed; //用于初始化隨機(jī)數(shù)產(chǎn)生的粒子

  @property float spin; //粒子的旋轉(zhuǎn)位置

  @property float velocity;// 粒子的運(yùn)動(dòng)速度

寫幾行代碼用起來

 CAEmitterLayer *fireEmitter = [CAEmitterLayer layer];
 fireEmitter.emitterPosition = CGPointMake(self.view.frame.size.width/2.0,    
 self.view.frame.size.height - 60);
 fireEmitter.emitterSize = CGSizeMake( 50, 0);
 fireEmitter.emitterShape = kCAEmitterLayerLine;
 fireEmitter.renderMode  = kCAEmitterLayerAdditive;
 //火焰
 CAEmitterCell* fire = [CAEmitterCell emitterCell];
 [fire setName:@"fire"];

 fire.birthRate   = 500;
 fire.emissionLongitude  = M_PI;
 fire.velocity   = -80;
 fire.velocityRange  = 30;
 fire.emissionRange  = 1.1;
 fire.yAcceleration  = -200;
 fire.scaleSpeed   = 0.3;
 fire.lifetime   = 1;
 fire.lifetimeRange  = 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];

 //煙霧
 CAEmitterCell* smoke = [CAEmitterCell emitterCell];
 [smoke setName:@"smoke"];

 smoke.birthRate   = 11;
 smoke.lifetime   = 4;
 smoke.velocity   = -40;
 smoke.velocityRange  = 20;
 smoke.emissionRange  = M_PI / 4;
 smoke.spinRange   = 6;
 smoke.yAcceleration  = -160;
 smoke.scale    = 0.1;
 smoke.alphaSpeed  = -0.12;
 smoke.scaleSpeed  = 0.7;

 smoke.contents   = (id) [[UIImage imageNamed:@"DazSmoke"] CGImage];
 smoke.color = [[UIColor colorWithWhite:0.5 alpha:0.3]CGColor];

 fireEmitter.emitterCells = @[smoke,fire];
 [self.view.layer addSublayer:fireEmitter];

產(chǎn)生火焰效果,抄錄一下,哪天要用的時(shí)候就不用到處找了,謝謝大神的分享!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容