Ios 无法使用按钮按下时的Swift 3更新SKLabel节点
我想用SpriteKit做一个小游戏。(iOS 10的Xcode 8和Swift 3) 我想让用户在触摸暂停文本标签时暂停游戏。当他这样做时,我想暂停游戏,并将标签文本更改为Unpause 下面是我对该部分的代码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" ){
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分钟。只需创建世界节点并添加所有需要暂停的内容(玩家、敌人、动作等)。