如何防止在暂停场景上运行SKAction(取消暂停后),暂停/取消暂停场景后节点纹理不会改变

时间:2017-03-21 18:08:43

标签: ios swift if-statement sprite-kit

暂停和取消暂停场景有两个问题。我有按钮:

    playPause = SKSpriteNode(imageNamed: "buttPause.png")
    playPause.name = "pause"
    playPause.setScale (0.65)
    playPause.position = CGPoint(x: -self.frame.width / 2.55 , y: self.frame.height / 2.27)
    playPause.zPosition = 10

    self.addChild(playPause)

我设置了暂停和取消暂停场景+更改按钮纹理的功能:

func buttonpauseplayTouched() {

    if isPlaying {
        playPause.texture = SKTexture(imageNamed: "buttPlay")
        isPlaying = false
        self.scene?.view?.isPaused = true
    }

    else {
        playPause.texture = SKTexture(imageNamed: "buttPause")
        isPlaying = true
        self.scene?.view?.isPaused = false
    }

}

我已设置触摸按钮:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        location = touch.location(in: self)
        node = self.atPoint(location)
        if node.name == "pause" {

            buttonpauseplayTouched()



        }
        else {print ("Blank space")}
    }

}

现在当我触摸暂停按钮时,我可以暂停和取消暂停场景,但纹理不会改变?怎么了?或者如果我想在暂停时将其他spritekitnode添加到场景中,我不能。

第二个问题是,我在场景中有其他一些SKSpriteNodes,当我触摸它们时我已经设置了动作。如果我在场景暂停时触摸它们,则不会发生任何事情,但是当我取消暂停场景时,对象的动作就会运行。当场景暂停时,如何防止我无法对对象执行操作。我试试:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
    location = touch.location(in: self)
    node = self.atPoint(location)
    if node.name == "pause" {

        buttonpauseplayTouched()



    }
    else if scene?.view?.isPaused == true && node.name == "object" {print ("Nothing!!")}
    }
    else {print ("Blank space")}
}

}

没有成功。谢谢你的任何提示。

更新:

再次感谢你们两位! 层的解决方案更好,我尝试它,它工作正常!一个小问题是移动背景:

override func didMove(to view: SKView) {
   createBackground()
  }
 func createBackground(){
    for i in 0...3 {
        background = SKSpriteNode(imageNamed: "background1.png")
        background.name = "background"
        background.setScale(0.694)
        background.position = CGPoint(x: 0, y: CGFloat(i) * background.size.height)
        background.zPosition = 1


        gameLayer.addChild(background)
    }
}
func moveBackground(){

    gameLayer.enumerateChildNodes(withName: "background", using: ({
        (node, error) in

        node.position.y -= 7

        if node.position.y < -((self.background.size.height)) {
            node.position.y += (self.background.size.height) * 3

        }

    }))

}
override func update(_ currentTime: TimeInterval) {
    moveBackground()
}

当我暂停gameLayer时,背景仍在移动。如何在gameLayer暂停时编辑代码以停止移动bacground?我希望只有很少的代码更改才能解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:3)

我把我的控件放在他们自己的图层(SKNode)controlsLayer.addChild(pauseButton)和他们自己的图层上的游戏对象&#34; gameLayer&#34;然后,当我想暂停游戏时,我只是暂停游戏层(gameLayer.isPaused = true)。这会阻止游戏对象移动,给出暂停的外观,但仍允许我执行操作,添加对象等操作。

override func update(_ currentTime: TimeInterval) {

    if !gameLayer.isPaused {
        moveBackground()
    }
}

答案 1 :(得分:1)

我个人是罗恩所说的粉丝,但只想告诉你如何能够做到这一点:

addLayoutComponent

因此,基本上,基于场景的func buttonpauseplayTouched() { playPause.texture = SKTexture(imageNamed: isPaused ? "buttonPlay" : "buttonPause") //pausing the scene rather than a view self.isPaused = !self.isPaused } 属性,您可以选择纹理。之后,您切换场景的暂停属性。在这种情况下,您不需要isPaused变量。