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);//進行粒子混合(變成火的就是這個)
發射器可以實現的效果:雨,雪,火,爆炸,波紋 ,水波, 聲波 ,海水等。想不到的效果還有很多,需要多想,多記錄,很多效果或許都有人已經調好數值,不需要我們花時間再去調試,但我們需要想到發射器能實現這種效果。
網上的一份代碼,包括了集中效果,雖然因為年代久遠無法運行,但把代碼拷貝出來使用應該還是可以的:http://www.okbase.net/file/item/21207。