動畫(四) CAEmitterLayer 粒子動畫

CAEmitterLayer簡介:

CAEmitterLayer(粒子發(fā)射器)繼承自CALayer,提供了一個基于Core Animation的粒子發(fā)射系統(tǒng),粒子用CAEmitterCell來初始化,一個單獨的CAEmitterLayer可同時支持多個CAEmitterCell。

簡單來說CAEmitterLayer就是發(fā)射器,可以設(shè)置位置、大小、形狀等屬性;CAEmitterCell就是發(fā)射出來的粒子,可以設(shè)置粒子圖片,速度,旋轉(zhuǎn)等屬性。一個CAEmitterLayer可以同時發(fā)射多種不同的CAEmitterCell。

一、CAEmitterLayer本身沒有什么難度,主要在于兩點:

1、屬性較多

2、調(diào)參數(shù)比較費時(想要有好的動畫效果還得慢慢的去調(diào)整各項參數(shù),不過沒有難度就是有點費時間)

下面先認(rèn)識一下CAEmitterLayer的屬性

// 常用屬性:

NSArray<CAEmitterCell *> *emitterCells; // 用來裝粒子的數(shù)組

CGPoint emitterPosition; // 決定了粒子發(fā)射形狀的中心點

CGFloat emitterZPosition;// 決定了粒子發(fā)射形狀的Z軸位置

CGSize emitterSize; // 發(fā)射源的尺寸大小

NSString *emitterShape; // 發(fā)射源的形狀,有6種值,分別是點、線、矩形、立方體、圓形、球形,具體的實現(xiàn)效果自己可以體驗下。

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

NSString *renderMode; // 渲染模式

// 不常用屬性:

float birthRate; // 粒子產(chǎn)生系數(shù),默認(rèn)1.0 (可以在Cell里面賦值)

float lifetime; // 粒子的生命周期系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值)

BOOL preservesDepth; // 定義該層是否將其子層壓平到其平面。

CGFloat emitterDepth; // 確定發(fā)射器形狀的深度

float velocity; // 粒子速度系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值)

float scale; // 粒子的縮放比例系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值)

float spin; // 粒子的自旋轉(zhuǎn)速度系數(shù), 默認(rèn)1.0 (可以在Cell里面賦值)

unsigned int seed; // 隨機數(shù)發(fā)生器

二、另外給出部分參數(shù)取值詳解。

1、emitterShape參數(shù)取值:

NSString * const kCAEmitterLayerPoint;//點的形狀,粒子從一個點發(fā)出

NSString * const kCAEmitterLayerLine;//線的形狀,粒子從一條線發(fā)出

NSString * const kCAEmitterLayerRectangle;//矩形形狀,粒子從一個矩形中發(fā)出

NSString * const kCAEmitterLayerCuboid;//立方體形狀,會影響Z平面的效果

NSString * const kCAEmitterLayerCircle;//圓形,粒子會在圓形范圍發(fā)射

NSString * const kCAEmitterLayerSphere;//球型

2、emitterMode參數(shù)取值:

NSString * const kCAEmitterLayerPoints;//從發(fā)射器中發(fā)出

NSString * const kCAEmitterLayerOutline;//從發(fā)射器邊緣發(fā)出

NSString * const kCAEmitterLayerSurface;//從發(fā)射器表面發(fā)出

NSString * const kCAEmitterLayerVolume;//從發(fā)射器中點發(fā)出

3、renderMode參數(shù)取值:

NSString * const kCAEmitterLayerUnordered;//粒子無序出現(xiàn)

NSString * const kCAEmitterLayerOldestFirst;//聲明久的粒子會被渲染在最上層

NSString * const kCAEmitterLayerOldestLast;//年輕的粒子會被渲染在最上層

NSString * const kCAEmitterLayerBackToFront;//粒子的渲染按照Z軸的前后順序進行

NSString * const kCAEmitterLayerAdditive;//粒子混合

三、CAEmitterCell的屬性

其實CAEmitterCell的名字叫粒子,下面詳細的介紹了CAEmitterCell的屬性,只要求大家屬性一下,以后用到了可以再來查閱。

emitterCell:初始化方法。

name: //用于構(gòu)建key paths。這也是后面手動控制動畫開始和結(jié)束的關(guān)鍵。

color:粒子的顏色。

enabled:粒子是否渲染。

contents:渲染粒子,是個CGImageRef的對象,即粒子要展示的圖片。

contentsRect:渲染范圍。

birthRate://每秒生成多少個粒子

lifetime://粒子存活的時間,以秒為單位

lifetimeRange://可以為這個粒子存活的時間再指定一個范圍。

上面兩個屬性如果只用了lifetime那么粒子的存活時間就是固定的,比如lifetime=10,那么粒子10s秒后就消失了。

如果使用了lifetimeRange,比如lifetimeRange=5,那么粒子的存活時間就是在5s~15s這個范圍內(nèi)消失。

velocity://粒子平均初始速度。正數(shù)表示豎直向上,負數(shù)豎直向下。

velocityRange://可以再指定一個范圍。

上面兩個屬性同lifetime和lifetimeRange

spin:粒子旋轉(zhuǎn)速度。

spinrange:粒子旋轉(zhuǎn)速度范圍,同lifetime和lifetimeRange

scale:縮放比例

scaleRange:縮放比例范圍,同lifetime和lifetimeRange

scaleSpeed:縮放比例速度。

alphaRange::一個粒子的顏色alpha能改變的范圍。

alphaSpeed::粒子透明度在生命周期內(nèi)的改變速度。

redRange:一個粒子的顏色red能改變的范圍。

redSpeed:粒子red在生命周期內(nèi)的改變速度。

blueRange:一個粒子的顏色blue能改變的范圍。

blueSpeed:粒子blue在生命周期內(nèi)的改變速度。

greenRange:一個粒子的顏色green能改變的范圍。

greenSpeed:粒子green在生命周期內(nèi)的改變速度。

xAcceleration:粒子x方向的加速度分量。

yAcceleration:粒子y方向的加速度分量。

zAcceleration:粒子z方向的加速度分量。

emissionRange:粒子發(fā)射角度范圍。

emissionLongitude:粒子在xy平面的發(fā)射角度。

emissionLatitude:發(fā)射的z軸方向的發(fā)射角度。


四、CAEmitterLayer及CAEmitterCell屬性介紹完了,我們下邊看一下代碼示例:雪花飄落

self.emitterLayer.emitterPosition = CGPointMake(self.view.width/2, 0);//發(fā)射器中心點
self.emitterLayer.emitterSize = CGSizeMake(self.view.width, 0);//發(fā)射器大小,因為emitterShape設(shè)置成線性所以高度可以設(shè)置成0,
self.emitterLayer.emitterShape = kCAEmitterLayerLine;//發(fā)射器形狀為線性
self.emitterLayer.emitterMode = kCAEmitterLayerOutline;//從發(fā)射器邊緣發(fā)出
NSMutableArray *array = [NSMutableArray array];//CAEmitterCell數(shù)組,存放不同的CAEmitterCell,我這里準(zhǔn)備了四張不同形態(tài)的葉子圖片。
for (int i = 0; i<4; i++) {
     NSString *imageName = [NSString stringWithFormat:@"雪花%d",i%2];
     CAEmitterCell *snowCell = [CAEmitterCell emitterCell];
     snowCell.birthRate = 2;//粒子產(chǎn)生速度
     snowCell.lifetime = 20;//粒子存活時間
     snowCell.velocity = 10;//初始速度
     snowCell.velocityRange = 5;//初始速度的差值區(qū)間,所以初始速度為5~15,后面屬性range算法相同
     snowCell.yAcceleration = 7;//y軸方向的加速度,落葉下飄只需要y軸正向加速度。
     snowCell.spin = 1.0;//粒子旋轉(zhuǎn)速度
     snowCell.spinRange = 2.0;//粒子旋轉(zhuǎn)速度范圍
     snowCell.emissionRange = M_PI;//粒子發(fā)射角度范圍
     snowCell.contents = (id)[[UIImage imageNamed:imageName] CGImage];//粒子圖片
     snowCell.scale = 0.3;//縮放比例
     snowCell.scaleRange = 0.2;//縮放比例
     snowCell.alphaSpeed = -0.05;//透明度速度
     [array addObject:snowCell];
}
self.emitterLayer.emitterCells = array;//設(shè)置粒子組

關(guān)于粒子動及屬性及示例,就寫到這里了,更多動畫請參照[demo]。

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

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