2014-04-19 21 views
2

我目前正在使用粒子系統進行練習,我在想如果下面的代碼是正確的方式來停止並啓動一個粒子,當一個按鈕被點擊時?這是開始和停止粒子系統的正確方式

該代碼工作正常,我觸摸開始按鈕和粒子啓動,我觸摸停止按鈕和粒子停止,但我不知道如果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]; 
} 

非常感謝

回答

2

你可以使用你把下面的方法:

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

有了這個,你應該能夠停止發光,無需拆卸和重新 - 每次按下開始按鈕時創建圖層。

要重新開始,只需做:

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

希望這有助於。

+1

非常感謝,它比我想象的要多得多。 –

+0

@fs_tigre:'self.emitterCell.birthRate = 0.0f;'會隱藏圖層嗎? –

+0

不,看不到我的最新評論,看看我的最終解決方案。 –

2

這很有趣,但只是在一個方法中修改birthRate像這樣self.emitterCell.birthRate = 0.0f;並不會停止emitterCell,實際上它看起來像是如果附加它而不是停止它,換句話說,如果我將其更改爲self.emitterCell.birthRate = 100;它會增加100個更多顆粒到現有的顆粒。幸運我找到了解決方案。

我基本上不得不給我的emitterCell一個名字emitterCell.name = @"_myCell";,然後在我的停止方法修改它像這樣[emitterLayer setValue:[NSNumber numberWithInteger:0] forKeyPath:@"emitterCells._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