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

Sprite kit 在SpriteKit上暂停游戏场景后尝试显示恢复按钮,sprite-kit,swift3,xcode8,resume,pause,Sprite Kit,Swift3,Xcode8,Resume,Pause,我正在使用Xcode 8和Swift 3,试图在暂停游戏后在场景中显示“恢复游戏”按钮,但由于一切都停止了,我还没有找到正确的方法。我在这一页上听从了他的建议,但那没有帮助 当点击“我的暂停”按钮时,它运行暂停功能,代码如下: func pauseGame() { self.isPaused = true self.physicsWorld.speed = 0 self.speed = 0.0 self.scene?.view?.isPaused = true }

我正在使用Xcode 8和Swift 3,试图在暂停游戏后在场景中显示“恢复游戏”按钮,但由于一切都停止了,我还没有找到正确的方法。我在这一页上听从了他的建议,但那没有帮助

当点击“我的暂停”按钮时,它运行暂停功能,代码如下:

func pauseGame() {
    self.isPaused = true
    self.physicsWorld.speed = 0
    self.speed = 0.0
    self.scene?.view?.isPaused = true
}
这似乎有点过分,但这是有效的。如果我删除

self.scene?.view?.isPaused = true
通过我的暂停功能,我可以显示点击恢复按钮,但我仍然可以与场景中的某些SpriteKit节点进行交互。我正在制作一个太空射击游戏,这样用户仍然可以移动间谍飞船并点击开火,尽管子弹在我恢复场景之前不会移动

我曾想过在pause函数中添加一个布尔“true”,并在firing和moving上面添加一个IF语句,但在我看来,这似乎有点让事情复杂化了


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

您无法与场景中的任何节点进行交互,因为您已完全暂停了该场景,这将暂停其所有子节点,这就是场景中的所有节点。要避免这种情况,请仅暂停某些
SKNode
s(层)

将某些节点添加到不同的
SKNode
s,因此,您不能暂停整个场景,只能暂停要暂停的层(SKNode)(gameLayer)。它看起来像这样:

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

}
初始化节点

let gameLayer = SKNode() 
let pauseLayer = SKNode()
gameLayer.addChild(gameSceneNode)
pauseLayer.addChild(resumeButton)
现在,如果要将子对象添加到场景中,请将其添加到希望其成为其一部分的层中:

将子节点添加到主层

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

}

您无法与场景中的任何节点进行交互,因为您已完全暂停该节点,这将暂停其所有子节点,这就是场景中的所有节点。要避免这种情况,请仅暂停某些
SKNode
s(层)

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

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

}
初始化节点

let gameLayer = SKNode() 
let pauseLayer = SKNode()
gameLayer.addChild(gameSceneNode)
pauseLayer.addChild(resumeButton)
现在,如果要将子对象添加到场景中,请将其添加到希望其成为其一部分的层中:

将子节点添加到主层

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

}

在下一场比赛中,我肯定会尝试一下尼克的建议。至于我上面的问题,它通过使用下面显示的代码工作。另外一个代码是关闭暂停按钮。现在,这项工作,我可以添加一个fadeIn和fadeOut行动的两个按钮

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
    }
}
override func touchesend(touch:Set,带有事件:UIEvent?){
用于触摸:触摸中的任何对象{
let pointOfTouch=触摸位置(in:self)
让nodeUserTapped=atPoint(触点)
如果nodeUserTapped.name==“PauseButton”{
如果(self.isPaused==false){
pauseGame()
}
}
如果nodeUserTapped.name==“ResumeButton”{
如果(self.isPaused==true){
恢复游戏()
}
}
}
}
//马克:波塞加姆
func pauseGame(){
self.isPaused=true
currentGameState=gameState.pauseGame
self.physicsWorld.speed=0
自身速度=0.0
如果(背景音乐==真){
backingAudio.stop()
}
如果resumeButton.ishiden==true{
resumeButton.ishiden=false
}
如果pauseButton.ishiden==false{
pauseButton.ishiden=true
}
}
//马克:继续比赛
func游戏(){
self.isPaused=false
currentGameState=gameState.inGame
self.physicsWorld.speed=1
自身速度=1.0
如果(背景音乐==真){
backingAudio.play()
}
如果resumeButton.ishiden==false{
resumeButton.ishiden=true
}
如果pauseButton.ishiden==true{
pauseButton.ishiden=false
}
}

对于我的下一场比赛,我肯定会尝试一下尼克的建议。至于我上面的问题,它通过使用下面显示的代码工作。另外一个代码是关闭暂停按钮。现在,这项工作,我可以添加一个fadeIn和fadeOut行动的两个按钮

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
    }
}
override func touchesend(touch:Set,带有事件:UIEvent?){
用于触摸:触摸中的任何对象{
let pointOfTouch=触摸位置(in:self)
让nodeUserTapped=atPoint(触点)
如果nodeUserTapped.name==“PauseButton”{
如果(self.isPaused==false){
pauseGame()
}
}
如果nodeUserTapped.name==“ResumeButton”{
如果(self.isPaused==true){
恢复游戏()
}
}
}
}
//马克:波塞加姆
func pauseGame(){
self.isPaused=true
currentGameState=gameState.pauseGame
self.physicsWorld.speed=0
自身速度=0.0
如果(背景音乐==真){
backingAudio.stop()
}
如果resumeButton.ishiden==true{
resumeButton.ishiden=false
}
如果pauseButton.ishiden==false{
pauseButton.ishiden=true
}
}
//马克:继续比赛
func游戏(){
self.isPaused=false
currentGameState=gameState.inGame
self.physicsWorld.speed=1
自己