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

isPaused not working properly in SKNode()

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

我还做了一个按钮,它调用了一个函数(pauseGame)来切换gameLayer的isPaused,效果很好。

问题是:我希望当游戏移动到场景时,它开始已经停止,用户应该通过按下按钮开始游戏。但是当我在 didMove 函数中调用 pauseGame 函数时,它不起作用,gameLayer 仍然处于活动状态。

我做了一些观察,将“print (gameLayer.isPaused)”和帧计数放在更新函数中。它显示实际上场景以 gameLayer.isPaused 开始,在 didMove 中设置为 true,但在第 2 帧之后它被设置为 false。我真的不知道它会在哪里发生,因为我不会在代码的其他任何地方使用 gameLayer.isPaused。

当然,一个解决方案是在第 2 帧之后调用 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()
    }

isPaused 是 SpriteKit 世界中的一团糟。我确实与 Apple 的开发人员争论过它的损坏性质,他们声称这就是它的工作方式,我们必须处理它。我所知道的最新暴行是 isPaused 对于新场景默认为 true,然后发送一条消息以取消暂停。最重要的是,当您取消暂停父节点时,它也会取消暂停所有子节点。

因此,在此处的代码中,重写场景的 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 暂停状态,它应该按照您认为的方式流动。

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

例如

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