【问题标题】:isPaused not working properly in SKNode()isPaused 在 SKNode() 中无法正常工作
【发布时间】:2018-04-30 12:10:56
【问题描述】:

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

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

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

我做了一些观察,将“print (gameLayer.isPaused)”和帧数放在更新函数中。它表明,实际上场景开始时在 didMove 中将 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()
    }

【问题讨论】:

    标签: sprite-kit sknode


    【解决方案1】:

    isPaused 在 SpriteKit 的世界里是一团糟。我已经与苹果的开发人员就它的破碎性质进行了激烈的争论,他们声称这就是它的工作方式,我们必须处理它。我知道的最新暴行是 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

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2021-04-08
      • 2018-07-14
      相关资源
      最近更新 更多