如何防止在暂停场景上运行 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(取消暂停后),节点纹理在暂停/取消暂停场景后不改变的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 SKAction 序列在解码后重新启动?

如何停止或暂停 SKAction 播放音乐? - 斯威夫特

SKAction 仅在睡眠后或运行调试器时运行

使用 swift 和 spritekit,你如何阻止场景在变得活跃/移动到前台后取消暂停?

Spritekit - 在 didBecomeActive 时保持游戏暂停

SpriteKit 自动恢复和自动暂停 iOS8