如何防止在暂停场景上运行 SKAction(取消暂停后),节点纹理在暂停/取消暂停场景后不改变
Posted
技术标签:
【中文标题】如何防止在暂停场景上运行 SKAction(取消暂停后),节点纹理在暂停/取消暂停场景后不改变【英文标题】:How to prevent run SKAction on paused scene (after unpaused), texture of node not change after pause/unpause scene 【发布时间】:2017-03-21 18:08:43 【问题描述】:我在暂停和取消暂停场景时遇到了两个问题。我有按钮:
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)
我已经设置了暂停和取消暂停场景+更改按钮纹理的功能:
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<UITouch>, 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 添加到场景中,我不能。
第二个问题是,我在现场还有一些其他的 SKSpriteNode,当我触摸它们时我已经设置了动作。如果我在场景暂停时触摸它们,则不会发生任何事情,但是当我取消暂停场景时,对象会运行。如何防止在场景暂停时我无法对对象执行操作。我试试:
override func touchesBegan(_ touches: Set<UITouch>, 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暂停时如何编辑代码以停止移动免费?我希望只有很少的代码更改可以解决这个问题。谢谢!
【问题讨论】:
【参考方案1】:我把我的控件放在他们自己的层 (SKNode) controlsLayer.addChild(pauseButton) 和游戏对象放在他们自己的层 "gameLayer" 然后当我想暂停游戏时,我只是暂停游戏层 (gameLayer.isPaused = true )。这会阻止游戏对象移动,给人一种暂停的感觉,但仍然允许我执行操作、添加对象等操作。
override func update(_ currentTime: TimeInterval)
if !gameLayer.isPaused
moveBackground()
【讨论】:
谢谢!分层的解决方案正是我所寻找的。我更新了我的问题,因为我有移动背景的问题。感谢您的任何提示。 我编辑了我的答案,向您展示如何暂停背景【参考方案2】:我个人很喜欢 Ron 所说的话,但我只想用几句话告诉你如何做到这一点:
func buttonpauseplayTouched()
playPause.texture = SKTexture(imageNamed: isPaused ? "buttonPlay" : "buttonPause")
//pausing the scene rather than a view
self.isPaused = !self.isPaused
所以,基本上,根据场景的isPaused
属性,您可以选择纹理。之后,您切换场景的 paused 属性。在这种情况下,您不需要 isPlaying
变量。
【讨论】:
谢谢!我尝试了两种解决方案并且效果很好!但是就像你说的那样,分层的解决方案更好。由于移动免费,我已经更新了我的问题。感谢任何提示。以上是关于如何防止在暂停场景上运行 SKAction(取消暂停后),节点纹理在暂停/取消暂停场景后不改变的主要内容,如果未能解决你的问题,请参考以下文章
使用 swift 和 spritekit,你如何阻止场景在变得活跃/移动到前台后取消暂停?