Как остановить эффект частицы? (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()