Как я могу использовать EaseIn/Out SKEmitterNode.particleBirthRate

Я использую SKEmitterNode для испускания частиц при касании. Мне нужен эффект, похожий на сердечки в Periscope.

Я обнаружил, что когда я добавляю эмиттер, он не ведет себя так, как будто он был просто «включен». То есть частицы появляются с полной альфой далеко от точки спавна (как будто они какое-то время были живыми). Это как если бы излучатель работал, это было внезапно показано.

Что мне нужно, так это нажать -> добавить узел-> начать излучать из точки -> излучать на некоторое время -> отключить -> удалить узел.

Я попытался настроить частицу BirthRate с помощью GCD:

-(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]
                                                      ]]];
}

Это, очевидно, затухает узел эмиттера, а не «выключает его»,

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


person VaporwareWolf    schedule 28.05.2015    source источник


Ответы (2)


Вы можете использовать блок 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]]];
person sangony    schedule 28.05.2015

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

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

person matt    schedule 28.05.2015
comment
Было бы неплохо, если бы свойство particleBirthRate само могло быть анимируемым, как свойства CAEmitterCell и CAEmitterLayer; но я не вижу никаких подтверждений этому. - person matt; 28.05.2015