在 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,即场景中的所有内容。为避免这种情况,请仅暂停某些 SKNode
s(层)。
将某些节点添加到不同的 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
}
}
我正在使用 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,即场景中的所有内容。为避免这种情况,请仅暂停某些 SKNode
s(层)。
将某些节点添加到不同的 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
}
}