Как остановить эффект частиц? (SKEmitterNode)

В настоящее время у меня есть этот код в операторе столкновения, где при столкновении с объектом возникает эта частица, но как мне ее остановить? Поскольку это продолжается вечно, тогда как я хочу, чтобы это произошло всего пару раз за контакт и т. Д.

SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle]     pathForResource:@"ff" ofType:@"sks"]];
emitter.zPosition = 0;
emitter.particlePositionRange = CGVectorMake(0, self.size.height);
emitter.position = CGPointMake(self.size.width, self.size.height/2);
[self addChild:emitter];

person John B    schedule 06.04.2014    source источник


Ответы (6)


Когда вы используете редактор частиц, вы можете установить максимальное количество создаваемых частиц. Это поле под «Текстурой частиц». Официальное описание:

«Максимальное количество частиц, которые эмиттер создает за время жизни эмиттера. После достижения этого числа эмиттер больше не создает частиц. Введите 0, чтобы удалить ограничения на частицы».

См. также: Руководство по редактору Particle Emitter

Конечно, вы должны удалить узел-эмиттер из его родителя после того, как он создал максимальное количество частиц. Это можно сделать, создав последовательность действий, которая ждет несколько секунд и удаляет узел-эмиттер из его родителя [SKAction removeFromParent].

person Nino    schedule 06.04.2014
comment
Вау, как обманчиво ПРОСТО! спасибо за этого человека чувствую себя немного глупо сейчас :) - person John B; 07.04.2014
comment
Является ли: - sparkEmmiter.particleLifetime = 0 полным для этого? - person Raksha Saini; 29.03.2016
comment
This can be done by creating an action-sequence that waits for a few seconds and removes the emitter-node from its parent [SKAction removeFromParent]. ждет несколько секунд после создания частицы? Есть ли какой-либо триггер для запуска последовательности после того, как частицы закончились? - person SSH This; 02.09.2016
comment
@Raksha, это на самом деле неверно, частицаLifetime - это время жизни каждой частицы, чтобы установить количество испускаемых частиц равным 50, вы должны установить: sparkEmitter.numParticlesToEmit = 50 - person SSH This; 02.09.2016
comment
Я знаю, что это немного не по теме, но как насчет запуска эмиттера? Вы устанавливаете уровень рождаемости на 0, а затем, когда вы хотите, чтобы он начал излучать, установите его на то, что должно быть, чтобы начать излучать? - person Lee Probert; 16.06.2017
comment
@SSHЭто вы узнали, есть ли триггер или обратный вызов, когда частицы заканчивают испускание? - person Crashalot; 22.06.2017

Используйте setParticleBirthRate:0, чтобы остановить испускание частиц. Это самый реальный способ выключить излучатель.

Если вы хотите, чтобы он немедленно исчез, используйте removeFromParent.

При использовании setParticleBirthRate запомните исходное значение, чтобы включить его позже. например.

@implementation GameScene
{    
    SKEmitterNode *rocketfire;
    float rocketfire_birthrate;
}

// ...
-(void)init {
    // ... 
    rocketfire_birthrate = rocketfire.particleBirthRate;
}

// turn on the emitter (thrust rocket) when the screen is touched
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [rocketfire setParticleBirthRate:rocketfire_birthrate];

}

// turn off the emitter on touches ended    
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [rocketfire setParticleBirthRate:0];
}
person Patrick Collins    schedule 08.12.2014

Это похоже на ответ здесь, предоставленный Tapir, за исключением того, что я не использую селектор. Я не уверен, требуется ли это в предыдущих версиях, но в iOS 10 я не вижу увеличения количества узлов, и это работает. т.е. добавить эмиттер, вытолкнуть указанное количество частиц, а затем удалить эмиттер. В данном случае я изменил его, добавив одну частицу.

-(void) gainPoints:(int)x  y:(int)y {


NSString *pPlus1Path = [[NSBundle mainBundle] pathForResource:@"PlusEmitter" ofType:@"sks"];
SKEmitterNode *pEmitter = [NSKeyedUnarchiver unarchiveObjectWithFile:pPlus1Path];


// Place the emitter at the specified position
pEmitter.position = CGPointMake(x,y);
pEmitter.name = @"plus1";
pEmitter.particleLifetime = 1;
pEmitter.particleBirthRate = 1;
pEmitter.numParticlesToEmit = 1;
// Send the particles to the scene.
pEmitter.targetNode = self.scene;

[self addChild:pEmitter];

SKAction *pRemoveNode = [SKAction removeFromParent];
SKAction *pWaitForSecsN = [SKAction waitForDuration:1];
SKAction *pSequence = [SKAction sequence:@[pWaitForSecsN,pRemoveNode]];
[pEmitter runAction:pSequence];

}

person netskink    schedule 18.12.2016

SWIFT 4:

Я думаю, что у меня есть немного лучший подход для его отключения:

1) Ставим коэффициент рождаемости на 0:

pEmitter.particleBirthRate = 0

2) Запустите действие задержки на всю жизнь:

let waitAction = SKAction.wait(forDuration: pEmitter.particleLifetime)
pEmitter.run(waitAction, completion: {
    pEmitter.removeFromParent()
})

ПРИМЕЧАНИЕ. Может быть неточным на 100 %, если у вас есть диапазон времени жизни частей.

person Rodrigo Guimarães    schedule 24.11.2017

Для тех, кто хочет заморозить эмиттер частиц на определенной части анимации, вместо того, чтобы удалять его с экрана, вы можете приостановить эмиттер:

emitter.isPaused = true
person jvarela    schedule 06.08.2019

при паузе вам нужно:

emitter.hidden = true

при перезагрузке нужно:

emitter.hidden = false
emitter.resetSimulation()
person Tritmm    schedule 12.07.2016
comment
SKEmitterNode не поддерживает скрытое свойство. - person boehmatron; 17.04.2017
comment
@boehmatron извините, сэр! ты уверен в этом?? Наследование SKEmitterNode от SKNode со скрытым свойством. проверяй и тестируй!!! пожалуйста!! - person Tritmm; 18.04.2017
comment
эй @Tritmm Zou прав - извините за это. Я снова попробовал скрытое свойство в другом отдельном проекте, и оно сработало, как описано,... Я исправлю вашу оценку как можно скорее. Простите за это. Это не было задумано. - person boehmatron; 18.04.2017
comment
@boehmatron ха-ха. нет проблем! это твоя маленькая ошибка, и я иногда получаю ту же ошибку. хороший день для тебя! - person Tritmm; 19.04.2017