2016-10-16 46 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