CAEmitterLayer, как повторно излучать в течение короткого времени

Играюсь с CAEmitterLayer и столкнулся с некоторыми проблемами :(

Мне нужен короткий эффект частиц - вроде удара или взрыва - в одном месте например (поэтому у меня в этом месте маленький UIView) Как мне это сделать?

1, у меня была идея - создать эмиттерный слой с его частицами и установить lifeTime в 0. И когда мне это нужно, я устанавливаю Например, lifeTime на 1, а через некоторое время я могу установить его обратно на 0. - НО это ничего не делает :(

2, Вторая идея заключалась в том, чтобы создавать [CAEmitterLayer layer] каждый раз, когда мне это нужно, и добавлять его как подслой слоев. Но я думаю, что произойдет, когда я повторю это, например, десять раз… у меня 10 подслоев с одним активным и 9 «мертвыми»? Как вообще перестать излучать? У меня есть PerformSelector через некоторое время, чтобы установить время жизни на 0, а другой селектор с более длинным интервалом для удаленияFromSuperlayer… Но это не так красиво, как хотелось бы :( есть ли другой «правильный» способ?

Я думаю, что с слишком много подслоев связано моя другая проблема... Я хочу излучать только одну частицу. И когда я это делаю, это работает. Но ИНОГДА испускает три частицы, иногда две... И это меня бесит. Когда я не останавливаю излучатель, это давая каждый раз правильное количество частиц...

Итак, вопросы...

как испускать частицы на короткое время.как с ними работать - типа остановить, удалить из родительского слоя,... как испускать точное количество частиц

РЕДАКТИРОВАТЬ:

emitter = [CAEmitterLayer layer];
emitter.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2);
emitter.emitterMode = kCAEmitterLayerPoints;
emitter.emitterShape    = kCAEmitterLayerPoint;
emitter.renderMode      = kCAEmitterLayerOldestFirst;
emitter.lifetime = 0;


particle = [CAEmitterCell emitterCell];
[particle setName:@"hit"];
particle.birthRate      = 1;
particle.emissionLongitude  = 3*M_PI_2;//270deg
particle.lifetime       = 0.75;
particle.lifetimeRange      = 0;
particle.velocity       = 110;
particle.velocityRange      = 20;
particle.emissionRange      = M_PI_2;//PI/2 = 90degrees
particle.yAcceleration      = 200;
particle.contents       = (id) [[UIImage imageNamed:@"50"] CGImage];
particle.scale          = 1.0;
particle.scaleSpeed     = -0.5;
particle.alphaSpeed     = -1.0;

emitter.emitterCells = [NSArray arrayWithObject:particle];
[(CAEmitterLayer *)self.view.layer addSublayer: emitter];

Затем в методе, связанном с кнопкой, я делаю это:

emitter.lifetime = 1.0;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.9 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
    emitter.lifetime = 0;
});

ОТРЕДАКТИРОВАНО и ОБНОВЛЕНО после изменения отношения @David Rönnqvist

CAEmitterCell *dustCell = [CAEmitterCell emitterCell];
[dustCell setBirthRate:1];
[dustCell setLifetime:1.5];
[dustCell setName:@"dust"];
[dustCell setContents:(id) [[UIImage imageNamed:@"smoke"] CGImage]];
[dustCell setVelocity:50];
[dustCell setEmissionRange:M_PI];
// Various configurations for the appearance...
// This is the only cell with configured scale, 
// color, content, emissionLongitude, etc...

[emitter setEmitterCells:[NSArray arrayWithObject:dustCell]];
[(CAEmitterLayer *)self.view.layer addSublayer:emitter];

// After one burst, change the birth rate of the cloud to 0
// so that there is only one burst per side.
double delayInSeconds = 0.5; // One cloud will have been created by now, but not two
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {

    [emitter setLifetime:0.0];
    [emitter setValue:[NSNumber numberWithFloat:0.0] 
               forKeyPath:@"emitterCells.dust.birthRate"];
});
11
задан D33 9 June 2012 в 16:42
поделиться