在 SpriteKit 上暂停游戏场景后尝试显示恢复按钮

Trying to display a resume button after pausing the game scene on SpriteKit

我正在使用 Xcode 8 和 Swift 3,试图在暂停游戏后在我的场景中显示“继续游戏”按钮,但由于一切都停止了,我还没有找到正确地这样做的方法。我关注了 Mike's advice on this page ,但没有帮助。

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

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

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

self.scene?.view?.isPaused = true

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

我想在暂停函数中添加一个布尔值 "true",并在上面的触发和移动中添加一个 IF 语句,但在我看来这让事情有点复杂。

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

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

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

初始化节点

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

现在,如果您想将 child 添加到场景中,请将其添加到您希望其所属的图层中:

向主要层添加 child 个节点

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

}

对于我的下一款游戏,我肯定会尝试 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
    }
}