2016-09-17 8 views
3

スコアに基づいて自分のSKEmitterNode(雨粒)をオンとオフに切り替えることができます。しかし、私の更新関数は絶えず呼び出されています。つまり、私は現在のコードでスクリーン上に何百万もの粒子が残っています...スコアを達成したときに雨粒が一度しか呼び出されないようにするにはどうすればいいですか?SpriteKitを使用してスコアをオンにしてSKEmitterNodeを作成するにはどうすればよいですか?

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() 
      } 
     } 
+0

エミッタが一定数の粒子を放出するように設定します。エミッタを追加し、発光が終了するのを待って、親からそれを削除する 'SKAction'シーケンスを作ります...このようなもの:http://stackoverflow.com/a/31731439/3402095 'SKEmitterNode'はこれをセットアップするのに関係しています、私に教えてください。 – Whirlwind

+0

ありがとう!簡単なレインシャワーの効果を出すためにEmitter(1)Birthrateと(2)Max and Lifetime(1)startと(2)Rangeをどのような値にするべきなのでしょうか? – GarySabo

+0

私はあなたがすでにどのような特性が関連しているか知っているのを見ていますが、雨を降らす方法はあなたの仕事であり、あなたはそれを遊ばなければなりません。 :) – Whirlwind

答えて

2

あり、あなたがこれを行うことができますいくつかの方法がありますが、これらの最も簡単なものは唯一のトグルごとに一度makeItRain()またはstopRaining()を呼び出すことです。これは、makeItRainが呼び出されると、stopRainingが呼び出されるまでそれを再度呼び出すことができないということです。これは、そのようなブール値で行うことができます:あなたは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; 

       } 
      } 

これはわずかに非効率的である、しかし、それは仕事を取得し、理解しやすいです。また、if文が来る順序を逆にしなければならないことにも注意してください(それ以外の場合は動作しません)。

+0

ありがとう!私は解決策がブールを使用していると思っていたが、私はそれを得ることができなかった。 – GarySabo

関連する問題