2016-09-17 60 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

非常感謝!我認爲我應該遵循,但是發射器(1)出生率和(2)最大值和生命期(1)開始和(2)範圍是什麼類型的值是爲了給出一個短暫的陣雨效果,然後停止? – GarySabo

+0

我看到你已經知道哪些屬性是相關的,但是如何下雨,那是你的工作,你必須玩弄它。 :) – Whirlwind

回答

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語句的順序(否則它將不起作用)。

+0

謝謝!我在想這個解決方案會使用bool,但我無法完全理解它。 – GarySabo

相關問題