【问题标题】:SpriteKit: run action while scene is pausedSpriteKit:在场景暂停时运行动作
【发布时间】:2016-06-02 20:51:05
【问题描述】:

我的代码上有一个暂停游戏的按钮。我想要的是使用该按钮暂停游戏会显示一条消息,显示“已暂停”。但是,由于场景已暂停,因此不会出现该消息。

我现在拥有的是一个 SKLabelNode,一开始的 alpha 为 0.0,当用户暂停游戏时,它会使用 fadeInWithDuration() 更改为 1.0。然后,当用户再次按下按钮时,它会通过 fadeOutWithDuration() 变回 0.0。问题是当场景暂停时,带有 fadeInWithDuration() 的 SKAction 不会运行。

我怎样才能做到这一点?

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    Apple 在“DemoBots”中也使用的一种最佳方法是创建一个您暂停的世界节点,而不是场景。

    创建一个 worldNode 属性

    class GameScene: SKScene {
    
        let worldNode = SKNode()
    }
    

    在 didMoveToView 中将其添加到场景中

    addChild(worldNode)
    

    然后将所有需要暂停的内容添加到 worldNode。这包括通常由场景运行的动作(例如计时器、敌人生成等)

    worldNode.addChild(someNode)
    worldNode.run(someSKAction)
    

    比你说的暂停功能

    worldNode.isPaused = true
    physicsWorld.speed = 0
    

    在简历中

    worldNode.isPaused = false
    physicsWorld.speed = 1
    

    如果您想在暂停时忽略其中的内容,您还可以在更新功能中添加额外的检查。

    override func update(_ currentTime: CFTimeInterval) {
    
        guard !worldNode.isPaused else { return }
    
        // your code
    }
    

    这样在游戏暂停时添加暂停标签或其他 UI 要容易得多,因为您实际上并没有暂停场景。您还可以运行任何您想要的操作,除非该操作已添加到 worldNode 或 worldNode 的子节点。

    希望对你有帮助

    【讨论】:

    • 你救了我,伙计!我很欣赏这个解决方案,因为它解决了我遇到的另一个暂停问题!看起来是因为我从根开始暂停...取消暂停时导致物理滞后..现在使用 SKNode 解决方案一切正常!
    【解决方案2】:

    我会用

    添加标签
    self.addChild(nameOfLabel)
    

    然后用

    暂停游戏
    self.scene?.paused = true
    

    这都应该放在代码的 if pauseButton is touch 部分中。

    【讨论】:

      【解决方案3】:

      您可以像这样对场景中的一些节点进行分层,而不是暂停场景

       SKScene
       |--SKNode 1
       |  |-- ... <--place all scene contents here
       |--SKNode 2
       |  |--  ... <--place all overlay contents here
      

      那么当你想暂停游戏时,你只暂停 SKNode 1。

      这允许节点 SKNode 2 继续运行,因此您可以执行诸如播放动画之类的操作,并拥有一个为您取消暂停场景的按钮,而无需在混合中添加一些非 Sprite Kit 对象。

      【讨论】:

        【解决方案4】:

        一种快速的解决方法是在 SKLabelNode 出现在屏幕上后暂停游戏:

        let action = SKAction.fadeOutWithDuration(duration)
        runAction(action) {
            // Pause your game
        }
        

        另一种选择是混合 UIKit 和 SpriteKit 并通知 ViewController 它需要显示此标签。

        class ViewController: UIViewController {
            var gameScene: GameScene!
        
            override func viewDidLoad() {
                super.viewDidLoad()
                gameScene = GameScene(...)
                gameScene.sceneDelegate = self
            }
        }
        
        extension ViewController: GameSceneDelegate {
            func gameWasPaused() {
                // Show your Label on top of your GameScene
            }
        }
        
        protocol GameSceneDelegate: class {
            func gameWasPaused()
        }
        
        class GameScene: SKScene {
            weak var sceneDelegate: GameSceneDelegate?
        
            func pauseGame() {
                // Pause
                // ...
                sceneDelegate?.gameWasPaused()
            }
        }
        

        【讨论】:

          【解决方案5】:

          所以你想在动作执行完成之后暂停游戏。

          class GameScene: SKScene {
          
              let pauseLabel = SKLabelNode(text: "Paused")
          
              override func didMoveToView(view: SKView) {
                  pauseLabel.alpha = 0
                  pauseLabel.position = CGPoint(x: CGRectGetMaxY(self.frame), y: CGRectGetMidY(self.frame))
                  self.addChild(pauseLabel)
              }
          
          
              func pause(on: Bool) {
                  switch on {
                  case true: pauseLabel.runAction(SKAction.fadeInWithDuration(1)) {
                      self.paused = true
                  }
                  case false:
                      self.paused = false
                      pauseLabel.runAction(SKAction.fadeOutWithDuration(1))
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-04
            • 1970-01-01
            • 2014-08-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多