如何防止在暂停场景上运行SKAction(取消暂停后),暂停/取消暂停场景后节点的纹理不会改变

暂停和取消暂停场景我有两个问题。 我有按钮:

playPause = SKSpriteNode(imageNamed: "buttPause.png") playPause.name = "pause" playPause.setScale (0.65) playPause.position = CGPoint(x: -self.frame.width / 2.55 , y: self.frame.height / 2.27) playPause.zPosition = 10 self.addChild(playPause) 

我已设置暂停和取消暂停场景的function+更改按钮的纹理:

 func buttonpauseplayTouched() { if isPlaying { playPause.texture = SKTexture(imageNamed: "buttPlay") isPlaying = false self.scene?.view?.isPaused = true } else { playPause.texture = SKTexture(imageNamed: "buttPause") isPlaying = true self.scene?.view?.isPaused = false } } 

我已设置触摸按钮:

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { for touch in touches { location = touch.location(in: self) node = self.atPoint(location) if node.name == "pause" { buttonpauseplayTouched() } else {print ("Blank space")} } } 

现在,当我触摸暂停按钮时,我可以暂停和取消暂停场景,但纹理不会改变? 哪里不对? 或者如果我想在暂停时将其他spritekitnode添加到场景中,我不能。

第二个问题是,我在场景中有一些其他的SKSpriteNodes,当我触摸它们时我已经设置了动作。 如果我在场景暂停时触摸它们,则不会发生任何事情,但是当我取消暂停场景时,对象上的动作就会运行。 当场景暂停时,如何防止我无法对对象执行操作。 我试试:

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { for touch in touches { location = touch.location(in: self) node = self.atPoint(location) if node.name == "pause" { buttonpauseplayTouched() } else if scene?.view?.isPaused == true && node.name == "object" {print ("Nothing!!")} } else {print ("Blank space")} } } 

没有成功。 谢谢你的提示。

更新:

再次感谢你们两位! 层的解决方案更好,我尝试它,它工作正常! 一个小问题是移动背景:

 override func didMove(to view: SKView) { createBackground() } func createBackground(){ for i in 0...3 { background = SKSpriteNode(imageNamed: "background1.png") background.name = "background" background.setScale(0.694) background.position = CGPoint(x: 0, y: CGFloat(i) * background.size.height) background.zPosition = 1 gameLayer.addChild(background) } } func moveBackground(){ gameLayer.enumerateChildNodes(withName: "background", using: ({ (node, error) in node.position.y -= 7 if node.position.y < -((self.background.size.height)) { node.position.y += (self.background.size.height) * 3 } })) } override func update(_ currentTime: TimeInterval) { moveBackground() } 

当我暂停gameLayer时,背景仍在移动。 如何在gameLayer暂停时编辑代码以停止移动bacground? 我希望只有很少的代码更改才能解决这个问题。 谢谢!

我把我的控件放在他们自己的图层(SKNode)controlsLayer.addChild(pauseButton)和他们自己的图层上的游戏对象“gameLayer”然后当我想暂停游戏时,我只是暂停gameLayer(gameLayer.isPaused = true)。 这会阻止游戏对象移动,给出暂停的外观,但仍允许我执行操作,添加对象等操作。

 override func update(_ currentTime: TimeInterval) { if !gameLayer.isPaused { moveBackground() } } 

我本人就是罗恩所说的粉丝,但只是想告诉你如何在几行内做到这一点:

 func buttonpauseplayTouched() { playPause.texture = SKTexture(imageNamed: isPaused ? "buttonPlay" : "buttonPause") //pausing the scene rather than a view self.isPaused = !self.isPaused } 

所以,基本上,根据场景的isPaused属性,你可以选择一个纹理。 然后,您切换场景的暂停属性。 在这种情况下,您不需要isPlaying变量。