2016-10-16 89 views
1

我正在嘗試使用SpriteKit製作小遊戲。 (適用於iOS 10的Xcode 8和Swift 3)無法使用Swift 3在按鈕上更新SKLabel節點按

我想讓用戶在觸摸暫停文本標籤時暫停遊戲。當他這樣做時,我想暫停遊戲並將標籤文本更改爲「取消暫停」。

以下是我對該部分的代碼。

if (pauseTextLabel.contains(touchLocation!)){ 
      gameLoopPaused = !gameLoopPaused; 
      if (pauseTextLabel.text == "Pause"){ 
//    pauseTextLabel.text = "Unpause"; 
       pauseTextLabel = SKLabelNode(fontNamed: gameData.fontName); 
       initLabel(label: pauseTextLabel, gameData: gameData, text: "Unpause", pos: CGPoint(x: 3 * self.size.width/4 , y: self.size.height - 50)); 
       self.addChild(pauseTextLabel); 
       runPauseAction(); 
      } else { 
       pauseTextLabel.text = "Pause"; 
       runUnpauseAction(); 
      } 
     } 

我試過這樣做,它沒有工作。

if (pauseTextLabel.contains(touchLocation!)){ 
      gameLoopPaused = !gameLoopPaused; 
      if (pauseTextLabel.text == "Pause"){ 
       pauseTextLabel.text = "Unpause"; 
       runPauseAction(); 
      } else { 
       pauseTextLabel.text = "Pause"; 
       runUnpauseAction(); 
      } 
     } 

我在該塊之前添加了一個斷點,並且此塊在控制檯中未顯示任何消息。遊戲正在暫停,我可以恢復。然而唯一不起作用的是顯示文本更新。我試圖將其刪除並將其添加到視圖中。它沒有工作。

真的很感激任何幫助或提示出了什麼問題。

編輯: 我修改了touchesBegan建議。我包括我的runPauseAction()以提供更多信息以防萬一。

private func runPauseAction(){ 
     print(#function); 

     //self.pauseTextLabel.text = "Resume"; 
     self.view?.isPaused = true; 
     self.physicsWorld.speed = 0.0; 

    } 

回答

2

你是否暫停整個場景/ skView在

runPauseAction() 

嘗試使用帶有延遲的SKAction在更改文本標籤後調用暫停代碼,如0.1秒。

還要在文本標籤更改之前添加取消暫停方法。

runUnpauseAction() 
pauseTextLabel.text = "Pause"    

我會推薦你​​在你的gameScene中創建一個worldNode用於暫停。

let worldNode = SKNode() 

比它添加到場景

addChild(worldNode) 

,比添加你需要的一切停下來,那worldNode

worldNode.addChild(SOMENODE) 
worldNode.addChild(SOMENODE2) 

當你停下你調用這個

worldNode.isPaused = true 
physicsWorld.speed = 0 

以及何時恢復你稱這個爲

worldNode.isPaused = false 
physicsWorld.speed = 1 

這是一個更好的方式來暫停你的遊戲,蘋果也在DemoBots中這樣做。當遊戲暫停時,它還爲您提供更多的靈活性,例如覆蓋菜單節點。

我也會寫這樣的觸摸方法。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     let node = atPoint(location) 

     if node == pauseTextLabel { 
      if !gameLoopPaused { 
       gameLoopPaused = true 
       pauseTextLabel.text = "Unpause" 
       runPauseAction() 
      } else { 
       runUnpauseAction() 
       gameLoopPaused = false 
       pauseTextLabel.text = "Pause" 
      } 
     } 
    } 
} 

希望這有助於

+0

我改變了功能的touchesBegan像你這樣的建議。我仍然無法獲得標籤更新。我在問題中包含了pauseFunction,因爲它可能是導致問題的原因之一。我看着DemoBot,並希望按照這種格式來進行下一個項目。但我想知道是什麼造成這個問題。 – Quicksillver

+0

標籤是不是正在更新或者只是當您想要恢復? – crashoverride777

+0

我認爲這是兩個。我剛發現他們實際上在變化。我評論了第二部分,我將其從「簡歷」改回爲「暫停」,以取消暫停遊戲。我可以看到文本從「暫停」變爲「恢復」,但是隻有在我沒有休息過遊戲之後。對不起,如果這是令人困惑。這不是我想要的行爲.. – Quicksillver