Я использую SKEmitterNode, чтобы испускать некоторые частицы при кране. Я переживаю эффект, похожий на сердца в Перископе.Как я могу EaseIn/Out SKEmitterNode.particleBirthRate
Я нахожу, что когда я добавляю эмиттер, он не ведет себя так, как будто он просто «включен». То есть частицы появляются с полной альфой вдали от точки появления (как если бы они были живыми на некоторое время). Как будто излучатель работает, это было неожиданно показано.
Что мне нужно - нажмите -> добавить узел-> начать излучать из точки -> испустить какое-то время -> отключить -> удалить узел.
Я пытался регулировать particleBirthRate с помощью НОД:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 0;
[self addChild:self.burstEmitter];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 10;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self removeAllChildren];
});
});
});
}
Тогда я, хотя SKAction может быть правильный инструмент (это, вероятно, ...)
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 10;
[self addChild:self.burstEmitter];
[self.burstEmitter runAction:[SKAction sequence:@[
[SKAction fadeInWithDuration:1],
[SKAction waitForDuration:2],
[SKAction fadeOutWithDuration:1],
[SKAction removeFromParent]
]]];
}
Это, очевидно, затухает эмиттер node out, а не «отключить его»,
Я открыт для использования CAEmitterLayer. Я тоже это пробовал, но столкнулся с той же проблемой.
Обновление: Я нашел одно решение: resetSimulation.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(self.burstEmitter.parent){
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInNode:self];
self.burstEmitter.position = point;
self.burstEmitter.particleBirthRate = 10;
[self.burstEmitter resetSimulation];
[self addChild:self.burstEmitter];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.burstEmitter.particleBirthRate = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self removeAllChildren];
});
});
}
Выполняет то, что было после. Мне все еще интересно использовать SKAction для этого, если это возможно.
Было бы неплохо, если бы свойство 'particleBirthRate' было само анимационным, например CAEmitterCell и CAEmitterLayer; но я не вижу никаких доказательств этого. – matt