2015-05-28 2 views
0

Я использую 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 для этого, если это возможно.

ответ

1

Вы можете использовать блок SKAction. Есть несколько способов выполнить то, что вы просите. Вот простой:

SKAction *wait0 = [SKAction waitForDuration:0.5]; // time in secs 
SKAction *block0 = [SKAction runBlock:^{ 
    self.burstEmitter.particleBirthRate = 9; 
}]; 
SKAction *block1 = [SKAction runBlock:^{ 
    self.burstEmitter.particleBirthRate = 8; 
}]; 
SKAction *block2 = [SKAction runBlock:^{ 
    self.burstEmitter.particleBirthRate = 7; 
}]; 

// and so on... 

[self runAction:[SKAction sequence:@[block0, wait0, block1, wait0, block2]]]; 
1

Используйте SKKeyframeSequence. Вот для чего это.

См. Обсуждение «Использование последовательностей ключевого кадра для настройки пользовательских рампов для свойства частиц» на SKEmitterNode docs page.

+0

Было бы неплохо, если бы свойство 'particleBirthRate' было само анимационным, например CAEmitterCell и CAEmitterLayer; но я не вижу никаких доказательств этого. – matt

Смежные вопросы