这是启动和停止粒子系统的正确方法吗?

时间:2014-04-19 13:11:56

标签: ios objective-c core-animation

我目前正在练习使用粒子系统,我想知道以下代码是否是在点击按钮时停止和启动粒子的正确方法?

代码工作正常,我触摸开始按钮,粒子开始,我触摸停止按钮,粒子停止,但我不确定removeFromSuperLayer是否是正确的使用方法。正如我所说,代码完成了我的需要,但我只是想确保即使在调用removeFromSuperLayer并最终浪费资源之后粒子也不会在后台继续运行。

- (IBAction)stopAnimation:(id)sender
{
    [emitterLayer removeFromSuperlayer];
}

- (IBAction)startAnimation:(id)sender
{
    [self particle];
}

-(void) particle
{
    emitterLayer = [CAEmitterLayer layer]; 
    emitterLayer.emitterPosition = CGPointMake(50 ,50); 
    emitterLayer.emitterZPosition = 10; 
    emitterLayer.emitterSize = CGSizeMake(10,10); 
    emitterLayer.emitterShape = kCAEmitterLayerSphere; 

    CAEmitterCell *emitterCell = [CAEmitterCell emitterCell]; 
    emitterCell.scale = 0.1; 
    emitterCell.scaleRange = 0.2; 
    emitterCell.emissionRange = (CGFloat)M_PI_2; 
    emitterCell.lifetime = 10; 
    emitterCell.birthRate = 5; 
    emitterCell.velocity = 20; 
    emitterCell.velocityRange = 50; 
    emitterCell.yAcceleration = 0; 

    emitterCell.contents = (id)[[UIImage imageNamed:@"particleImage.png"] CGImage]; 
    emitterLayer.emitterCells = [NSArray arrayWithObject:emitterCell]; 

    [self.view.layer addSublayer:emitterLayer]; 
}

非常感谢

3 个答案:

答案 0 :(得分:4)

这很有趣,但只是在方法中修改birthRate就像这个self.emitterCell.birthRate = 0.0f;一样不会停止发射器内部,实际上看起来它是否会附加而不是停止它,换句话说,如果我将其更改为{{ 1}}它为现有粒子增加了100个粒子。幸运的是我找到了解决方案。

我基本上必须给我的emitterCell一个名字self.emitterCell.birthRate = 100;,然后在我的stop方法中修改它,就像这个emitterCell.name = @"_myCell";一样有效。

这就是我的工作。假设您的项目中已有一个名为myImage的图像。

[emitterLayer setValue:[NSNumber numberWithInteger:0] forKeyPath:@"emitterCells._myCell.birthRate"];

答案 1 :(得分:3)

您可以使用以下方法:

- (void)stopEmitting
{   
    self.emitterCell.birthRate = 0.0f;
}

使用此功能,您应该能够停止发光,而无需在每次按下开始按钮时移除并重新创建图层。

要重新开始,只需执行以下操作:

- (void)startEmitting
{
    self.emitterCell.birthRate = <VAlUE HERE (greater than 0)>;
}

希望这有帮助。

答案 2 :(得分:0)

您可以更改发射器层本身的出生率,而不是更改每个发射器单元的birthRate。

- (void)stopEmitting
{   
    self.emitterLayer.birthRate = 0;
}

- (void)startEmitting
{
    self.emitterLayer.birthRate = 1;
}