sprite-kit particles skemitternode

sprite kit - ¿Cómo se detiene un efecto de partículas?(SKEmitterNode)



sprite-kit particles (5)

Cuando utiliza el editor de partículas, puede establecer la cantidad máxima de partículas para crear. Es el campo debajo de "Textura de Partícula". La descripción oficial es:

"La cantidad máxima de partículas que crea el emisor a lo largo de la vida del emisor. Después de alcanzar este número, el emisor no crea más partículas. Ingrese 0 para eliminar los límites de las partículas".

Ver también: Guía del Editor de Partículas Emisoras

Por supuesto, debe eliminar el nodo emisor de su elemento primario después de crear la cantidad máxima de partículas. Esto se puede hacer creando una secuencia de acción que espere unos segundos y elimine el nodo emisor de su elemento primario [SKAction removeFromParent].

Actualmente tengo este código en una declaración de colisión en la que si colisiona con un objeto, esta partícula ocurre, pero ¿cómo la detengo? Como continúa para siempre, solo quiero pasar un par de veces por 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];


Esto es similar a la respuesta aquí proporcionada por Tapir, con la excepción de que no uso el selector. No estoy seguro de si eso es necesario en versiones anteriores, pero en ios 10 no veo que mi número de nodos aumente y funciona. es decir. agregue un emisor, haga estallar una cantidad específica de partículas y luego elimine el emisor. En este caso, lo he modificado para agregar una sola partícula.

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

}


Use setParticleBirthRate: 0 para dejar de emitir partículas. Esta es la forma más realista de apagar un emisor.

Si desea que desaparezca inmediatamente, utilice removeFromParent.

Si usa setParticleBirthRate, recuerde el valor original para volver a activarlo más tarde. por ejemplo.

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


cuando pausa necesitas:

emitter.hidden = true

cuando reinicie necesita:

emitter.hidden = false emitter.resetSimulation()


SWIFT 4:

Creo que tengo un enfoque un poco mejor para apagarlo:

1) Pon la tasa de natalidad a 0:

pEmitter.particleBirthRate = 0

2) Ejecute una acción de demora durante toda la vida:

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

NOTA : Puede que no sea 100% exacto si tiene un rango de tiempo compartido.