isPaused在SKNode()中无法正常工作

时间:2018-04-30 12:10:56

标签: sprite-kit sknode

我正在使用Swift 4和SpriteKit进行纸牌游戏。我创建了一个SKScene的自定义子类,在这个类中是一个SKNode,我将其用作一个层(gameLayer),我将所有节点附加到其上,这些节点将被停止。

我也做了一个按钮,它调用了一个函数(pauseGame)来切换gameLayer的isPaused,它运行得很好。

问题是:我希望当游戏移动到场景时,它开始已经停止,用户将按下按钮开始游戏。但是当我在didMove函数中调用pauseGame函数时,它不起作用,gameLayer仍然有效。

我做了一些观察,在更新功能中加入'print(gameLayer.isPaused)'和帧数。它表明,实际上场景开始时,gameMay中的gameLayer.isPaused设置为true,但是在第二帧之后它被设置为false。我真的不知道它会发生在哪里,因为我不会在游戏中吸引gameLayer.isPaused。

当然解决方法是在第二帧之后调用pauseGame,但我认为它不是一个干净的方式。

class BMScene: SKScene {
      let gameLayer = SKNode() 

    func pauseGame(){
      if gameLayer.isPaused {
        gameLayer.isPaused = false
      } else {
        gameLayer.isPaused = true
          }
    }

    override func didMove(to view: SKView) {
    self.pauseGame()
    }

1 个答案:

答案 0 :(得分:1)

isPaused是SpriteKit世界的混乱局面。我真的和苹果公司的开发人员讨论过它的破碎本质,并且他们声称这是打算如何工作的,我们必须处理它。我所知道的最新的暴行是isPaused默认为新场景为真,然后发出一条消息以取消它。最重要的是,当您取消暂停父节点时,它也会取消暂停所有子节点。

因此,在此处的代码中,覆盖场景的isPaused,以便能够捕获暂停事件以阻止其转到其子代

class BMScene: SKScene {
    let gameLayer = SKNode() 
    private var _paused : Boolean = false
    override var isPaused : Boolean
    {
        get
        {
            return _paused
        }
        set
        {
           _paused = newValue
        }
    }
    func pauseGame(_ state: Boolean? = null){
        gameLayer.isPaused = state ?? !gameLayer.isPaused
    }

    override func didMove(to view: SKView) {
        self.pauseGame(true)
    }
}

这将阻止您的节点更改其子暂停状态。在这一刻之后,你应该完全控制你的gameLayer暂停状态,它应该按照你认为的流动方式流动。

我还修改了你的功能,允许你强制暂停状态,以及在想要交换状态时切换。

E.g。

Pause:
pauseGame(true)
'gameLayer.isPaused is now true
Unpause:
pauseGame(true)
'gameLayer.isPaused is now false
Toggle:
pauseGame()
'gameLayer goes from false to true, or true to false

??表示COALESCE,因此如果state为空,它将沿着链移动到下一个值,即!gameLayer.isPaused