1. 程式人生 > >使用OC和Swift兩種語言寫一個發射煙花的小專案

使用OC和Swift兩種語言寫一個發射煙花的小專案

self.view.backgroundColor = [UIColor blackColor];
    
    //載入顆粒狀的火花圖片
    CAEmitterLayer *emitterLa = [CAEmitterLayer layer];
    emitterLa.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height*(.75));//*(0.75)
    emitterLa.renderMode = kCAEmitterLayerAdditive;
    
    //在爆炸前逐漸隱藏發射顆粒
    CAEmitterCell *emitterCeRocket = [CAEmitterCell emitterCell];
    emitterCeRocket.emissionLongitude = -M_PI/2;
    emitterCeRocket.emissionLatitude = 0;
    emitterCeRocket.lifetime = 1.6;
    emitterCeRocket.birthRate = 1;
    emitterCeRocket.velocity = 400;
    emitterCeRocket.velocityRange = 100;
    emitterCeRocket.yAcceleration = 250;
    emitterCeRocket.emissionRange = M_PI/4;
    emitterCeRocket.color = CGColorCreateCopy([UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.5].CGColor);
    emitterCeRocket.redRange = 0.5;
    emitterCeRocket.greenRange = 0.5;
    emitterCeRocket.blueRange = 0.5;
    //設定動畫效果的路徑名稱
    [emitterCeRocket setName:@"rocket"];
    
    //新增路徑狀態
    CAEmitterCell *emitterCeFly = [CAEmitterCell emitterCell];
    emitterCeFly.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeFly.emissionLongitude = (4*M_PI)/2;
    emitterCeFly.scale = 0.4;
    emitterCeFly.velocity = 100;
    emitterCeFly.birthRate = 45;
    emitterCeFly.lifetime = 1.5;
    emitterCeFly.yAcceleration = 350;
    emitterCeFly.emissionRange = M_PI/7;
    emitterCeFly.alphaSpeed = -0.7;
    emitterCeFly.scaleSpeed = -0.1;
    emitterCeFly.scaleRange = 0.1;
    emitterCeFly.beginTime = 0.01;
    emitterCeFly.duration = 0.7;
    
    //設定爆炸
    CAEmitterCell *emitterCeFirework = [CAEmitterCell emitterCell];
    emitterCeFirework.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeFirework.birthRate = 9999;
    emitterCeFirework.scale = 0.6;
    emitterCeFirework.velocity = 130;
    emitterCeFirework.lifetime = 2;
    emitterCeFirework.alphaSpeed = -0.2;
    emitterCeFirework.yAcceleration = 80;
    emitterCeFirework.beginTime = 1.5;
    emitterCeFirework.duration = 0.1;
    emitterCeFirework.emissionRange = 2*M_PI;
    emitterCeFirework.scaleSpeed = -0.1;
    emitterCeFirework.spin = 2;
    //設定爆炸動畫名稱
    [emitterCeFirework setName:@"firework"];
    
    //新增重複過程
    CAEmitterCell *emitterCePreSpark = [CAEmitterCell emitterCell];
    emitterCePreSpark.birthRate = 80;
    emitterCePreSpark.velocity = emitterCeFirework.velocity*0.7;
    emitterCePreSpark.lifetime = 1.7;
    emitterCePreSpark.yAcceleration = emitterCeFirework.yAcceleration*0.85;
    emitterCePreSpark.beginTime = emitterCeFirework.beginTime-0.2;
    emitterCePreSpark.emissionRange = emitterCeFirework.emissionRange;
    emitterCePreSpark.greenSpeed = 100;
    emitterCePreSpark.blueSpeed = 100;
    emitterCePreSpark.redSpeed = 100;
    //設定重複動畫名稱
    [emitterCePreSpark setName:@"preSpark"];
    
    //煙花最後的閃光
    CAEmitterCell *emitterCeSparkle = [CAEmitterCell emitterCell];
    emitterCeSparkle.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeSparkle.lifetime = 0.05;
    emitterCeSparkle.yAcceleration = 250;
    emitterCeSparkle.beginTime = 0.8;
    emitterCeSparkle.scale = 0.4;
    emitterCeSparkle.birthRate = 10;
    
    emitterCePreSpark.emitterCells = [NSArray arrayWithObjects:emitterCeSparkle, nil];
    emitterCeRocket.emitterCells = [NSArray arrayWithObjects:emitterCeFly,emitterCeFirework,emitterCePreSpark, nil];
    emitterLa.emitterCells = [NSArray arrayWithObjects:emitterCeRocket, nil];
    
    [self.view.layer addSublayer:emitterLa];