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

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

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

Ответ 1

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

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

Также см.: Редактор редактора эмиттеров частиц

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

Ответ 2

Используйте 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];
}

Ответ 3

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

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

}

Ответ 4

SWIFT 4:

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

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

pEmitter.particleBirthRate = 0

2) Запустите действие задержки для времени жизни:

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

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

Ответ 5

когда вам потребуется пауза:

emitter.hidden = true

при повторном перезапуске:

emitter.hidden = false
emitter.resetSimulation()