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

Ios 这是启动和停止粒子系统的正确方法吗,ios,objective-c,core-animation,Ios,Objective C,Core Animation,我目前正在练习粒子系统,我想知道当点击按钮时,下面的代码是否是停止和启动粒子的正确方法 代码工作正常,我触摸开始按钮,粒子开始,我触摸停止按钮,粒子停止,但我不确定使用removeFromSuperLayer是否正确。正如我所说,代码满足了我的需要,但我只是想确保即使在调用removeFromSuperLayer之后粒子也不会在后台继续运行,并最终浪费资源 - (IBAction)stopAnimation:(id)sender { [emitterLayer removeFromSup

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

代码工作正常,我触摸开始按钮,粒子开始,我触摸停止按钮,粒子停止,但我不确定使用
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]; 
}

非常感谢

您可以使用以下方法:

- (void)stopEmitting
{   
    self.emitterCell.birthRate = 0.0f;
}
使用此功能,您应该能够停止发射,而无需在每次按下“开始”按钮时移除并重新创建层

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

- (void)startEmitting
{
    self.emitterCell.birthRate = <VAlUE HERE (greater than 0)>;
}
-(无效)开始匹配
{
self.emitterCell.birthRate=;
}

希望这能有所帮助。

这很有趣,只是像这样修改出生率
self.emitterCell.birthRate=0.0f不会停止emitterCell,事实上,它看起来像是附加而不是停止它,换句话说,如果我将其更改为
self.emitterCell.birthRate=100它将向现有粒子添加100多个粒子。幸运的是我找到了解决办法

我基本上必须给我的emitterCell起一个名字
emitterCell.name=@“\u myCell”
然后在我的stop方法中修改它,如下所示
[emitterLayer设置值:[NSNumber numberWithInteger:0]forKeyPath:@“emitterCells.\u myCell.birthRate”]成功了

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

#import "SpriteViewController.h"

@implementation SpriteViewController

CAEmitterLayer *emitterLayer;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)stopAnimation:(id)sender
{
    [emitterLayer setValue:[NSNumber numberWithInteger:0] forKeyPath:@"emitterCells._myCell.birthRate"]; // new code
}

- (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.name = @"_myCell";// new code
    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:@"myImage.png"] CGImage];
    emitterLayer.emitterCells = [NSArray arrayWithObject:emitterCell];

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

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

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

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

非常感谢,它比我拥有的东西更有意义。@fs\u tigre:does
self.emitterCell.birthRate=0.0f将隐藏图层?不,不会,请参阅我的最新评论以查看最终解决方案。@Unheilig谢谢您的回答!这很有道理。即使5年后也会这样:)