2014-04-19 9 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

재밌지 만,이 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 
관련 문제