Играюсь с 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"];
});