如何在SpriteKit中打开分数以创建SKEmitterNode?

3

我希望能够根据分数来开启和关闭我的SKEmitterNode(雨粒子)。但是我的update函数会被不断地调用,即使我当前的代码如下,屏幕上也会出现数百万个粒子...我该如何构造我的代码,以便在达到分数时只调用一次雨粒子?

class GameScene: SKScene, SKPhysicsContactDelegate {

         func setUpRain() {
                if let rainParticle = SKEmitterNode(fileNamed: "Rain") {
                    rainParticle.position = CGPointMake(frame.size.width, frame.size.height)
                    rainParticle.name = "rainParticle"
                    rainParticle.zPosition = Layer.Flash.rawValue
                    worldNode.addChild(rainParticle)
                }
            }

            func makeItRain() {
                let startRaining = SKAction.runBlock { 
                    self.setUpRain()
                }
                runAction(startRaining, withKey: "Rain")
            }

            func stopRaining() {
                removeActionForKey("Rain")
                worldNode.enumerateChildNodesWithName("rainParticle", usingBlock: { node, stop in
                    node.removeFromParent()
                })

            }

  }

    class PlayingState: GKState {


        unowned let scene: GameScene  //used to gain access to our scene

        override func updateWithDeltaTime(seconds: NSTimeInterval) {
            scene.updateForegroundAndBackground()
            scene.updateScore()

            if scene.score > 2 {
                scene.makeItRain()

            }

            if scene.score > 4 {
                scene.stopRaining()
            }
        }

设置您的发射器以发射明确数量的粒子。创建一个 SKAction 序列,它添加一个发射器,等待它完成发射,然后将其从父级中移除...类似于这样:https://dev59.com/ZI3da4cB1Zd3GeqP15XN#31731439 如果您想知道哪些 SKEmitterNode 的属性与设置所有这些相关,请告诉我。 - Whirlwind
非常感谢!我想我明白了,但为了使其产生短暂的雨淋效果,发射器(1)的出生率和(2)最大寿命应该从哪些值开始,以及(1)范围是多少?然后停止? - GarySabo
我看到你已经知道哪些属性是相关的,但如何制造雨,那就是你的工作,你必须自己琢磨。 :) - Whirlwind
好的,谢谢! :) - GarySabo
1个回答

2

有几种方法可以做到这一点,但其中最简单的方法是每次切换时只调用一次makeItRain()或stopRaining()。我的意思是,一旦调用了makeItRain,直到调用stopRaining之前,就不能再次调用它。可以使用布尔值来实现这一点,如下所示:

   var rainToggle: Bool = false; //True = Raining
override func updateWithDeltaTime(seconds: NSTimeInterval) {
                scene.updateForegroundAndBackground()
                scene.updateScore()

                if (scene.score > 4){
                    scene.stopRaining()
                    rainToggle = false;
                }
                else if (scene.score > 2 && !rainToggle) {
                    scene.makeItRain()
                    rainToggle = true;

                }
            }

这只是稍微低效的,因为你每一帧都在无谓地调用stopRaining()函数,但它能完成任务并且易于理解。请注意,我不得不改变你的if语句的顺序(否则它就不能正常工作)。


谢谢!我一直在想解决方案,可能需要使用布尔值,但是我还没有完全理解。 - GarySabo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接