Objective-c粒子動畫,objective-c粒子
前面貼過幾篇關於SpriteKit的案例文章,其中涉及到的動畫都是材質類的圖片切換或則常規的動畫效果,沒涉及到今天要說的粒子動畫,今天說的粒子動畫就是在遊戲中實現更佳炫酷的效果必須使用的類,OC中粒子動畫主要涉及到兩個類,CAEmitterLayer,CAEmitterCell,第一個是動畫的執行類,第二個是動畫的實作類別,雖只有兩個類,屬性也不多,但是想要理解這兩個類,並且靈活運用它們還是有一定難度的。應為粒子動畫在遊戲開發中算是最難的技術了,當前比較火的遊戲開發架構,大多粒子動畫效果都是用工具製作,比如3dmax這樣的工具,雖然oc把實現粒子動畫的類最佳化得很容易很簡單,但是難度還是有的,不好理解。我接下去的步驟就是先解釋下這兩個類,然後會貼上一個對每句代碼都詳細解釋過的案例。
一、涉及類
1、CAEmitterLayer(粒子動畫執行類,這裡你把它想成是實現粒子動畫的導演類)
/* The array of emitter cells attached to the layer. Each object must
* have the CAEmitterCell class. */
這個數組是這個層的附加發射器層, 每個對象必須至少有一個粒子類,
@property(nullable, copy) NSArray<CAEmitterCell *> *emitterCells;
2、CAEmitterCell(粒子類,這個類可以想成是粒子動畫實作類別,用它來實現粒子動畫後,放入到CAEmitterLayer中去執行)
二、詳細案例
1 @interface SnowViewController () 2 3 @end 4 5 @implementation SnowViewController 6 7 - (void)viewDidLoad 8 { 9 [super viewDidLoad];10 11 flakeLayer = [CAEmitterLayer layer];12 13 14 CGRect bounds = [[UIScreen mainScreen] bounds];15 16 //下面是設定發射器在螢幕上的位置,17 flakeLayer.emitterPosition = CGPointMake(bounds.size.width / 2, bounds.size.height/3);18 19 /*下面是發射器的size,決定了粒子的出生位置範圍。比如下面的設定為0,0那麼所有的粒子出生軌跡起點都將是發射器的中心點,你可以想成是模擬器的中心點 可以把這個範圍與emitterShape屬性結合來想*/20 flakeLayer.emitterSize = CGSizeMake(0,0);21 22 // 發射模型決定出生粒子的運動軌跡顯示的形狀23 flakeLayer.emitterShape =kCAEmitterLayerLine;//kCAEmitterLayerRectangle24 25 //發射模式26 flakeLayer.emitterMode =kCAEmitterLayerSurface;// kCAEmitterLayerOutline27 28 29 //申明一個粒子類30 CAEmitterCell *flakeCell = [CAEmitterCell emitterCell];31 //是個CGImageRef的對象,既粒子要展現的圖片32 flakeCell.contents = (id)[[UIImage imageNamed:@"FFFlake.png"] CGImage];33 //每秒出生的粒子數量34 flakeCell.birthRate = 100;35 //生命週期 1.2秒之後消失36 flakeCell.lifetime = 120.0;37 //生命週期範圍38 flakeCell.lifetimeRange = 0.5;39 //速度//粒子從出生到運動軌跡的終點速的速度,如果這裡指設定很大那麼螢幕的粒子就會增多,出生率就會加快40 flakeCell.velocity = 100;41 //速度範圍42 flakeCell.velocityRange = 10;43 //粒子y方向的加速度分量--向 粒子y軸方向移動44 flakeCell.xAcceleration = 10;45 // upx-y平面的發射方向 ....>> emissionLatitude:發射的z軸方向的角度46 flakeCell.emissionLongitude = -M_PI / 2;47 // 發射器在一個範圍內的隨機發射角度,這裡如果設定為0那麼,發射器的角度就會固定,如果設定為圓周率,那麼出生粒子的發射範圍就會在360度範圍內隨機發射粒子角度48 flakeCell.emissionRange = M_PI ;49 50 //這裡代表粒子出生後完成運動軌跡中帶的效果,如果是0那麼在生命週期內就會以平滑的形式移動,假如這裡我們設定為51 //360那麼 在生命週期內它就會旋轉的形式移動52 flakeCell.spinRange =0;53 54 55 flakeCell.scale = 1.0;//縮放比例:56 flakeCell.scaleSpeed = 0.1;//1.0;//縮放比例速度57 flakeCell.scaleRange = 1.0;//縮放比例範圍;58 59 flakeCell.color = [[UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1.0] CGColor];//粒子的顏色60 flakeCell.redRange = 1.0;//一個粒子的顏色red 能改變的範圍;61 flakeCell.redSpeed = 0.1;//粒子red在生命週期內的改變速度;62 flakeCell.blueRange = 1.0;//一個粒子的顏色blue 能改變的範圍63 flakeCell.blueSpeed = 0.1;//粒子blue在生命週期內的改變速度64 flakeCell.greenRange = 1.0;//個粒子的顏色green 能改變的範圍;65 flakeCell.greenSpeed = 0.1;//粒子green在生命週期內的改變速度;66 flakeCell.alphaSpeed = -0.08;//粒子透明度在生命週期內的改變速度67 68 flakeLayer.emitterCells = [NSArray arrayWithObject:flakeCell];//粒子發射的粒子69 70 [self.view.layer insertSublayer:flakeLayer atIndex:0];71 72 }