Как перестать бесконечно играть в эмиттер SpriteKit?

Я пытаюсь остановить бесконечное воспроизведение эмиттера в моем проекте Sprite Kit. Для параметра Lifetime установлено значение Start=1 и End=0, и он показывает правильный результат, который мне нужен (выдается только один раз).

Проблема возникает, когда я вызываю его в методе обновления, он продолжает излучать бесконечно, я пытался использовать removeFromParent и removeAllAction, но безуспешно. Не могли бы вы помочь мне с решением здесь?

-(void)update:(NSTimeInterval)currentTime {

    [self updateheartPositionFromMotionManager];
    [self matchIt];

    if ( _heart.position.x == 512 && _heart.position.y == 484 ){
        SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:
                  [[NSBundle mainBundle] pathForResource:@"sparkly" ofType:@"sks"]];

        emitter.position = CGPointMake(self.frame.size.width/2,               
                                       CGRectGetMidY(self.frame)+100);;
        emitter.name = @"exhaust";
        emitter.targetNode =_heart;
        [self addChild:emitter];

    }else{

        [self removeFromParent];
    }
}

person user2892522    schedule 07.06.2014    source источник
comment
Удалите его из метода обновления.   -  person ZeMoon    schedule 09.06.2014
comment
Итак, если позиция _heart совпадает, вы создаете эмиттер. Мне кажется уродливым, есть реальный шанс, что вы создаете 60 излучателей в секунду. Как говорит @akashg, удалите создание из метода обновления. Я рекомендую вам взглянуть на свойство SKEmitterNode numParticlesToEmit.   -  person CloakedEddy    schedule 10.06.2014
comment
Я знал, что делаю что-то другое. Позвольте мне попробовать сегодня и обновить мои результаты   -  person user2892522    schedule 11.06.2014


Ответы (1)


//шаг 1 берем глобальную переменную @property BOOL sparklyAdded; в вашем .h файле

внутри метода инициализации или экземпляра вашего файла .m

спарклиаддед = ЛОЖЬ;

-(void)particleAdded {

}

-(void)обновление:(NSTimeInterval)currentTime {

  [self updateheartPositionFromMotionManager];
  [self matchIt];

 if (( _heart.position.x>= 512 && _heart.position.y=< 484 ) && !sparklyAdded){
     SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:
              [[NSBundle mainBundle] pathForResource:@"sparkly" ofType:@"sks"]];

     emitter.position = CGPointMake(self.frame.size.width/2,               
                                   CGRectGetMidY(self.frame)+100);;
     emitter.name = @"exhaust";
     emitter.targetNode =_heart;
     [self addChild:emitter];
     sparklyAdded=TRUE;

  }else{

    [self removeEffect];
 }

}

-(void) removeEffect

{ [self enumerateChildNodesWithName:@"exhaust" usingBlock:^(SKNode *node, BOOL *stop) {

    [node removeAllActions];
    [node removeFromParent];
     sparklyAdded=FALSE;
}];

}

// помните о нескольких бедрах при добавлении частицы 1) они являются дорогостоящим вызовом процессора, поэтому добавляйте и удаляйте их только один раз из цикла обновления

person dragoneye    schedule 09.06.2014
comment
Большое спасибо за ваши экспертные комментарии, я попробую это сегодня вечером и опубликую свои результаты. - person user2892522; 11.06.2014