21

我目前在碰撞语句中有这段代码,如果与对象碰撞,那么这个粒子就会发生,但我该如何阻止它呢?因为它会永远持续下去,而我只想每次接触发生几次等

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

6 回答 6

21

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

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

另请参阅:粒子发射器编辑器指南

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

于 2014-04-06T18:27:34.423 回答
13

使用 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];
}
于 2014-12-08T20:11:47.777 回答
3

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

emitter.isPaused = true
于 2019-08-06T11:17:11.827 回答
3

这类似于Tapir在此处提供的答案,但我不使用选择器。我不确定在以前的版本中是否需要这样做,但在 ios 10 中我没有看到我的节点数量增加并且它确实有效。IE。添加发射器,弹出指定数量的粒子,然后移除发射器。在本例中,我对其进行了修改以添加单个粒子。

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

}

于 2016-12-18T18:33:38.260 回答
3

斯威夫特 4:

我想我有一个更好的方法来关闭它:

1) 将出生率设为 0:

pEmitter.particleBirthRate = 0

2)在生命周期内运行延迟动作:

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

注意:如果您有一定范围的 partilcelifetime,则可能不是 100% 准确。

于 2017-11-24T23:45:13.847 回答
1

当你需要暂停时:

emitter.hidden = true

重新启动时,您需要:

emitter.hidden = false
emitter.resetSimulation()
于 2016-07-12T10:52:09.503 回答