【问题标题】:Trying to display a resume button after pausing the game scene on SpriteKit在 SpriteKit 上暂停游戏场景后尝试显示恢复按钮
【发布时间】:2017-05-31 17:27:00
【问题描述】:

我正在使用 Xcode 8 和 Swift 3,尝试在暂停游戏后在我的场景中显示“恢复游戏”按钮,但由于一切都停止了,我还没有找到正确的方法。我在此页面 “Tap To Resume” Pause text SpriteKit 上遵循了 Mike 的建议,但这并没有帮助。

当我的暂停按钮被点击时,它会使用以下代码运行暂停功能:

func pauseGame() {
    self.isPaused = true
    self.physicsWorld.speed = 0
    self.speed = 0.0
    self.scene?.view?.isPaused = true
}

这似乎有点矫枉过正,但确实有效。如果我删除

self.scene?.view?.isPaused = true

通过我的暂停功能,我能够显示对恢复按钮的点击,但我仍然可以与场景中的一些 SpriteKit 节点进行交互。我正在开发一款太空射击游戏,因此用户仍然可以移动飞船并点击开火,尽管在我恢复场景之前子弹不会移动。

我曾考虑在暂停函数中添加一个布尔值“true”,并在触发和移动上方添加一个 IF 语句,但在我看来这会让事情变得有点复杂。

关于如何在暂停场景时显示“恢复”按钮有什么建议吗?

【问题讨论】:

  • 为什么不直接显示恢复按钮作为暂停功能的第一行?
  • 我已经尝试过了,但是在显示恢复按钮之前一切都停止了。事实上,虽然上面没有显示。代码调用在 pauseGame 函数之前显示按钮。
  • 这可能就是你要找的stackoverflow.com/questions/25824984/…

标签: sprite-kit swift3 xcode8 resume pause


【解决方案1】:

您无法与场景中的任何节点进行交互,因为您已将其完全暂停,这会暂停其所有子节点,即场景中的所有内容。为避免这种情况,请仅暂停某些 SKNodes(层)。

将某些节点添加到不同的SKNodes,这样您就可以只暂停您希望暂停的层(SKNode)(gameLayer),而不是暂停整个场景。它看起来像这样:

初始化节点

let gameLayer = SKNode() 
let pauseLayer = SKNode()

现在,当您想要将子元素添加到场景中时,请将其添加到您希望它成为其中一部分的图层中:

将子节点添加到主层

gameLayer.addChild(gameSceneNode)
pauseLayer.addChild(resumeButton)

别忘了将图层也添加到场景中

将图层添加到场景中

addChild(gameLayer)
addChild(pauseLayer)

要暂停一个图层,请这样写:

gameLayer.isPaused = true

请注意,在此示例中,gameLayer 上的所有节点都将暂停,但 pauseLayer 上的所有节点都不会。

您的完整示例可能如下所示:

func pauseGame() {

    gameLayer.isPaused = true
    pauseLayer.isHidden = false
    gameLayer.physicsWorld.speed = 0
    gameLayer.speed = 0.0

}

func unpauseGame() {

    gameLayer.isPaused = false
    pauseLayer.isHidden = true
    // Whatever else you need to undo

}

【讨论】:

    【解决方案2】:

    对于我的下一场比赛,我肯定会尝试 Nik 的建议。至于我上面的问题,它通过使用下面显示的代码来工作。附加代码也是关闭暂停按钮。现在这工作了,我也许可以为两个按钮添加一个淡入淡出动作。

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch: AnyObject in touches {
    
            let pointOfTouch = touch.location(in: self)
    
            let nodeUserTapped = atPoint(pointOfTouch)
    
            if nodeUserTapped.name == "PauseButton" {
                if (self.isPaused == false) {
                    pauseGame()
                }
            }
    
            if nodeUserTapped.name == "ResumeButton" {
                if (self.isPaused == true) {
                    resumeGame()
                }
    
            }
        }
    }
    
    
    // MARK: - pauseGame
    func pauseGame() {
        self.isPaused = true
        currentGameState = gameState.pauseGame
        self.physicsWorld.speed = 0
        self.speed = 0.0
        if (backgroundMusicIsOn == true) {
            backingAudio.stop()
        }
        if resumeButton.isHidden == true {
            resumeButton.isHidden = false
        }
        if pauseButton.isHidden == false {
            pauseButton.isHidden = true
        }
    }
    
    
    // MARK: - resumeGame
    func resumeGame() {
        self.isPaused = false
        currentGameState = gameState.inGame
        self.physicsWorld.speed = 1
        self.speed = 1.0
        if (backgroundMusicIsOn == true) {
            backingAudio.play()
        }
        if resumeButton.isHidden == false {
            resumeButton.isHidden = true
        }
        if pauseButton.isHidden == true {
            pauseButton.isHidden = false
        }
    }
    

    【讨论】:

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