Sprite kit 如何停止粒子效果?(SKEmitterNode)

Sprite kit 如何停止粒子效果?(SKEmitterNode),sprite-kit,particles,skemitternode,Sprite Kit,Particles,Skemitternode,我现在在一个collide语句中有这个代码,如果与对象发生碰撞,那么这个粒子就会发生,但我如何阻止它呢?因为它会一直持续下去,而我只想每次发生几次,等等 SKEmitterNode *emitter = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"ff" ofType:@"sks"]]; emitter.zPosition = 0; emitter.particl

我现在在一个collide语句中有这个代码,如果与对象发生碰撞,那么这个粒子就会发生,但我如何阻止它呢?因为它会一直持续下去,而我只想每次发生几次,等等

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

使用“粒子编辑器”时,可以设置要创建的最大粒子数。这是“粒子纹理”下面的字段。官方描述为:

发射器在其生命周期内创建的最大粒子数。达到此数后,发射器将不再创建粒子。输入0可删除粒子限制

另见:


当然,在发射器节点创建了最大数量的粒子后,应该将其从其父节点中移除。这可以通过创建一个动作序列来完成,该动作序列将等待几秒钟并从其父节点中删除发射器节点[SKAction removeFromParent]。

使用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];
}
当您需要暂停时:

emitter.hidden = true
emitter.hidden = false
emitter.resetSimulation()
需要重新启动时:

emitter.hidden = true
emitter.hidden = false
emitter.resetSimulation()

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

}SWIFT 4:

我想我有一个稍微好一点的方法来关闭它:

1) 将出生率设置为0:

pEmitter.particleBirthRate = 0
2) 在生存期内运行延迟操作:

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

注意:如果您有partilcelifetime的范围,则可能无法100%准确。

对于那些希望在动画的特定部分冻结粒子发射器的人,您可以暂停发射器,而不是将其从屏幕上移除:

emitter.isPaused = true

哇,太简单了!感谢那个现在觉得有点愚蠢的人:)是:-sparkEmmiter.particleLifetime=0值得吗?
这可以通过创建一个动作序列来完成,该动作序列等待几秒钟,并从其父节点[SKAction removeFromParent]移除发射器节点。
在粒子创建后等待几秒钟?粒子完成后是否会触发运行序列?@Raksha这实际上是不正确的,particleLifetime是每个粒子的寿命,要将发射的粒子数设置为50,必须设置:
sparkEmitter.numParticlesToEmit=50
我知道这有点离题,但是让发射器启动怎么样?您是否将出生率设置为0,然后在想要启动时将其设置为开始发射所需的值?SKEmitterNode不支持隐藏属性。@boehmatron抱歉,先生!你确定吗??来自具有隐藏属性的SKNode的SKMitterNode继承。检查和测试!!!请嘿@Tritmm zou是对的-很抱歉。我在另一个单独的项目中再次尝试隐藏的属性,它按照描述工作,。。。我会尽快更正您的评级。对不起。这不是故意的。@boehmatron哈哈。没问题!这是你的小错误,我有时也会犯同样的错误。你好<代码>让waitAction=SKAction.wait(持续时间:pEmitter.particleLifetime+(pEmitter.particleLifetimeRange/2.0))