iOS-粒子發射器

QQ和微信里面有個紅包雨,蘋果提供了一個非常方便的方法來實現:粒子發射器。

粒子發射器包括兩個部分:發射器(CAEmitterLayer)和粒子(CAEmitterCell)。

這里以雪花效果為例:

snow.gif

代碼如下所示:

    CAEmitterCell *cell = [[CAEmitterCell alloc] init];
    //展示的圖片
    cell.contents = (__bridge id _Nullable)([UIImage imageNamed:@"snow"].CGImage);
    //每秒粒子產生個數的乘數因子,會和layer的birthRate相乘,然后確定每秒產生的粒子個數
    cell.birthRate = 10;
    //每個粒子存活時長
    cell.lifetime = 10.0;
    //粒子生命周期范圍
    cell.lifetimeRange = 0.3;
    //粒子透明度變化,設置為-0.4,就是每過一秒透明度就減少0.4,這樣就有消失的效果,一般設置為負數。
    cell.alphaSpeed = -0.1;
    cell.alphaRange = 0.01;
    //粒子的速度
    cell.velocity = 40;
    //粒子的速度范圍
    cell.velocityRange = 20;
    
    //粒子內容的顏色
    cell.color = [[UIColor whiteColor] CGColor];
    
    //設置了顏色變化范圍后每次產生的粒子的顏色都是隨機的
    //cell.redRange = 0.5;
    //cell.blueRange = 0.5;
    //cell.greenRange = 0.5;
    
    //縮放比例
    cell.scale = 0.4;
    //縮放比例范圍
    cell.scaleRange = 0.05;
    cell.scaleSpeed = -0.01;//scale每秒變化率,負數縮小,正數放大
    
    //粒子的初始發射方向
    //emissionLongitude:拋灑的角度,x-y平面的發射方向;順時針方向角度變化為0~PI/2~PI,逆時針變化是負的
    cell.emissionLongitude =  M_PI;
    //cell.emissionLatitude = M_PI_4;
    
    //emissionRange: 拋灑角度的浮動角度,這個角度指定了拋灑出的對象能夠在多大角度范圍內擴散。
    //cell.emissionRange = M_PI_2;
    
    //Y方向的加速度
    cell.yAcceleration = 9.8;

    
   _emitterLayer = [CAEmitterLayer layer];
    _emitterLayer.backgroundColor = [UIColor redColor].CGColor;
    //發射位置
    _emitterLayer.emitterPosition = CGPointMake(SCREEN_WIDTH/2, 200);
    //粒子產生系數,默認為1
    _emitterLayer.birthRate = 1;
    //發射器的尺寸
    _emitterLayer.emitterSize = CGSizeMake(SCREEN_WIDTH, 0);
    //發射的形狀
    _emitterLayer.emitterShape = kCAEmitterLayerLine;
    //發射的模式
    _emitterLayer.emitterMode = kCAEmitterLayerSurface;
    //渲染模式
    _emitterLayer.renderMode = kCAEmitterLayerOldestFirst;
    _emitterLayer.masksToBounds = NO;
    //_emitterLayer.zPosition = -1;
    _emitterLayer.emitterCells = @[cell];
    [self.view.layer addSublayer:_emitterLayer];
CAEmitterCell粒子單元
  • contents : 一般放一張圖片,是粒子要展示的內容 ;
  • birthRate : 每秒粒子產生個數的乘數因子,會和layer的* birthRate相乘, 然后確定每秒產生的粒子個數;
  • lifetimeRange : 所有的range屬性都是你設置的屬性值加減它后得到一個范圍,例如cell.lifetime=5.0, cell.lifetimeRange = 1.0; 那么粒子的存活時間就是[4.0,6.0](也就是說lifetimeRange是和lifetime組合使用的);
  • color : 粒子內容的顏色,更改后粒子會變色 ,默認不透明白色;
  • redRange,blueRange,greenRange : 設置了顏色變化范圍后會產生隨機的顏色,這樣粒子就會是五顏六色的了 ;
  • scale : 粒子縮放比例,我們看到的煙花粒子就是縮放比例很小得到的,你可以用任意圖,然后縮放比例設置很小,就可以得到很小的粒子;
  • scaleRange : 縮放比例范圍(類似lifetimeRange);
  • scaleSpeed : scale每秒變化率,負數縮小,正數放大;
  • emissionLongitude:拋灑的角度,x-y平面的發射方向;順時針方向角度變化為0PI/2PI,逆時針變化是負的;
  • emissionLatitude:發射的z軸方向的角度;
  • emissionRange : 拋灑角度的浮動角度,這個角度指定了拋灑出的對象能夠在多大角度范圍內擴散;
  • yAcceleration : Y方向的加速度
CAEmitterLayer發射器
  • emitterCells : 粒子單元數組,你可以創建兩個單元,負責不同的效果。
  • emitterPosition : 在xy平面的發射位置
  • emitterZPosition: z軸上的位置
  • birthRate : 粒子產生系數,默認為1,想停下就設為0,這樣就沒有粒子產生了 (控制發射器開始與停止的開關)
  • emitterSize : 發射器的尺寸
  • emitterShape : 發射的形狀,有6種值,分別是點、線、矩形、立方體、圓形、球形,如下代碼所示。
/** `emitterShape' values. **/

CA_EXTERN NSString * const kCAEmitterLayerPoint
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//點
CA_EXTERN NSString * const kCAEmitterLayerLine
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//線
CA_EXTERN NSString * const kCAEmitterLayerRectangle
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//矩形
CA_EXTERN NSString * const kCAEmitterLayerCuboid
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//立方體
CA_EXTERN NSString * const kCAEmitterLayerCircle
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//圓形
CA_EXTERN NSString * const kCAEmitterLayerSphere
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//球體
  • renderMode: 發射模式,如下所示:
/** `emitterMode' values. **/

CA_EXTERN NSString * const kCAEmitterLayerPoints
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//從發射器中
CA_EXTERN NSString * const kCAEmitterLayerOutline
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//邊緣
CA_EXTERN NSString * const kCAEmitterLayerSurface
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//表面
CA_EXTERN NSString * const kCAEmitterLayerVolume
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//中點
  • renderMode : 渲染模式,值如下所示:
/** `renderMode' values. **/

CA_EXTERN NSString * const kCAEmitterLayerUnordered
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//粒子是無序出現的
CA_EXTERN NSString * const kCAEmitterLayerOldestFirst
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//聲明久的粒子會被渲染在最上層
CA_EXTERN NSString * const kCAEmitterLayerOldestLast
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//年輕的粒子會被渲染在最上層
CA_EXTERN NSString * const kCAEmitterLayerBackToFront
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//粒子的渲染按照Z軸的前后順序進行
CA_EXTERN NSString * const kCAEmitterLayerAdditive
    CA_AVAILABLE_STARTING (10.6, 5.0, 9.0, 2.0);//進行粒子混合(變成火的就是這個)

發射器可以實現的效果:雨,雪,火,爆炸,波紋 ,水波, 聲波 ,海水等。想不到的效果還有很多,需要多想,多記錄,很多效果或許都有人已經調好數值,不需要我們花時間再去調試,但我們需要想到發射器能實現這種效果。

參考:
iOS CAEmitterLayer 粒子發射器的使用詳解
iOS進階之CAEmitterLayer

網上的一份代碼,包括了集中效果,雖然因為年代久遠無法運行,但把代碼拷貝出來使用應該還是可以的:http://www.okbase.net/file/item/21207

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.粒子發送器圖層 CAEmitterLayer:發送器 每秒發送粒子數量:birthRate 發送形狀的樣式:e...
    磊CC閱讀 631評論 0 0
  • 開始iOS的動效學習,一開始只對普通的CALayer有所了解,偶然的機會想到做一些全局的飄灑的效果。當時采用最笨的...
    清蘂翅膀的技術閱讀 3,146評論 0 11
  • 轉載:http://blog.csdn.net/wang631106979/article/details/512...
    F麥子閱讀 232評論 0 0
  • 在上一篇中我們大致了解了粒子系統,在這篇中我們再深入解析一下。在粒子系統中,CAEmitterLayer負責發射粒...
    Fendouzhe閱讀 687評論 0 4
  • 公元600多年,意志力超強的唐朝高僧玄奘,在穿越樓蘭古城附近的沙漠時有過這樣的記載: “曾經有很多人在此迷失方向,...
    騎驢漫游閱讀 825評論 0 3