Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法使用按钮按下时的Swift 3更新SKLabel节点_Ios_Swift_Swift3 - Fatal编程技术网

Ios 无法使用按钮按下时的Swift 3更新SKLabel节点

Ios 无法使用按钮按下时的Swift 3更新SKLabel节点,ios,swift,swift3,Ios,Swift,Swift3,我想用SpriteKit做一个小游戏。(iOS 10的Xcode 8和Swift 3) 我想让用户在触摸暂停文本标签时暂停游戏。当他这样做时,我想暂停游戏,并将标签文本更改为Unpause 下面是我对该部分的代码 if ( pauseTextLabel.contains(touchLocation!)){ gameLoopPaused = !gameLoopPaused; if ( pauseTextLabel.text == "Pause" ){

我想用SpriteKit做一个小游戏。(iOS 10的Xcode 8和Swift 3)

我想让用户在触摸暂停文本标签时暂停游戏。当他这样做时,我想暂停游戏,并将标签文本更改为Unpause

下面是我对该部分的代码

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();
            }
        }
我在该块之前添加了一个断点,该块在控制台中不显示任何消息。游戏正在暂停,我可以继续。但是,唯一不起作用的是显示文本更新。我试图删除它并将其添加到视图中。它不起作用

if ( pauseTextLabel.contains(touchLocation!)){
            gameLoopPaused = !gameLoopPaused;
            if ( pauseTextLabel.text == "Pause" ){
                pauseTextLabel.text = "Unpause";
                runPauseAction();
            } else {
                pauseTextLabel.text = "Pause";
                runUnpauseAction();
            }
        }
非常感谢您提供的任何帮助或提示

编辑: 我按照建议修改了触摸屏。我将包含runPauseAction()以提供更多信息,以备不时之需

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

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

    }

您是否暂停了整个场景/skView

runPauseAction()
?

尝试使用带延迟的SKAction调用暂停代码,如更改文本标签后的0.1秒

还可以在文本标签更改之前添加unpause方法

runUnpauseAction()
pauseTextLabel.text = "Pause"               
我建议您在游戏场景中创建一个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
当你恢复时,你称之为

 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"
            }
        }
    }
}
override func touchsbegind(touch:Set,带有事件:UIEvent?){
接触{
让位置=触摸。位置(in:self)
让节点=点(位置)
如果节点==pauseTextLabel{
如果!游戏暂停{
gameLoopPaused=true
pauseTextLabel.text=“取消暂停”
runPauseAction()
}否则{
runUnpauseAction()
gamelooppause=false
pauseTextLabel.text=“暂停”
}
}
}
}

希望这有帮助

我按照您的建议更改了ToucheSBegind功能。我仍然无法更新标签。我在问题中包含了pauseFunction,因为它可能是导致问题的原因。我查看了Demobot,并希望在下一个项目中采用这种格式。但我想知道是什么导致了这个问题。是标签没有同时更新还是只是在你想恢复的时候更新?我想两者都有。我刚刚发现他们实际上正在改变。我注释掉了第二部分,在取消暂停游戏时,我将其从“恢复”改回“暂停”。我可以看到文字从“暂停”变为“恢复”,虽然只是在我取消游戏暂停后。对不起,这让人困惑。这不是我想要的行为……看起来它正在改变。但这不仅仅是在我暂停之前在屏幕上反映出来的。有没有想过为什么会发生这种情况,以及我如何克服这种情况?是的,当场景暂停时,你不能更改文本。当视图暂停时,诸如SKActions等的SpriteKit API中的任何一个都将工作。尝试将文本标签更改为“恢复”,然后暂停场景。然后继续游戏并将其更改回“暂停”。这就是为什么世界节点方法更好,最多需要30-60分钟。只需创建世界节点并添加所有需要暂停的内容(玩家、敌人、动作等)。