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

Posted

技术标签:

【中文标题】如何停止粒子效果? (SKEmitterNode)【英文标题】:How do you stop a particle effect? (SKEmitterNode) 【发布时间】:2014-05-18 20:13:39 【问题描述】:

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

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】:

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

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

另见:Particle Emitter Editor Guide

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

【讨论】:

哇,这么简单!谢谢那个人现在感觉有点傻:) 是否:- sparkEmmiter.particleLifetime = 0 值得满? This can be done by creating an action-sequence that waits for a few seconds and removes the emitter-node from its parent [SKAction removeFromParent]. 在创建粒子后等待几秒钟?粒子完成后是否有任何触发器来运行序列? @Raksha 这实际上并不正确,particleLifetime 是每个粒子的生命周期,要将发射的粒子数设置为 50,您必须设置:sparkEmitter.numParticlesToEmit = 50 我知道这有点离题,但是让发射器启动怎么样?您是否将出生率设置为 0,然后在您想让它开始时将其设置为开始发射所需的值?【参考方案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 提供的答案here,只是我不使用选择器。我不确定在以前的版本中是否需要这样做,但在 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];

【讨论】:

【参考方案4】:

SWIFT 4:

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

1) 将出生率设为0:

pEmitter.particleBirthRate = 0

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

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

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

【讨论】:

let waitAction = SKAction.wait(forDuration: pEmitter.particleLifetime + (pEmitter.particleLifetimeRange/2.0))【参考方案5】:

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

emitter.isPaused = true

【讨论】:

【参考方案6】:

当你需要暂停时:

emitter.hidden = true

重启时需要:

emitter.hidden = false
emitter.resetSimulation()

【讨论】:

SKEmitterNode 不支持隐藏属性。 @boehmatron 对不起先生!你确定吗?? SKEmitterNode 从具有隐藏属性的 SKNode 继承。检查和测试!!!请!! 嘿@Tritmm zou 是对的 - 很抱歉。我在另一个单独的项目中再次尝试隐藏属性,它按描述工作,...我会尽快更正您的评级。对此感到抱歉。这不是故意的。 @boehmatron 哈哈。没问题!这是你的小错误,我有时也会犯同样的错误。祝你有美好的一天!

以上是关于如何停止粒子效果? (SKEmitterNode)的主要内容,如果未能解决你的问题,请参考以下文章

当我在屏幕上移动我的 SKEmitterNode 时,如何使 SKEmitter 粒子保持相对于背景?

从 SKEmitterNode 动画粒子

设置 SKEmitterNode 的“targetNode”会导致奇怪的“zPosition”行为

SpriteKit代码动态调整sks文件中粒子的颜色

SKEmitterNode 如何在不同背景下使用混合模式“添加”保持相同的效果

skemitternode 与 skspritenode 碰撞