gpt4 book ai didi

ios - 在 SpriteKit 和 Swift 中关闭 SKScene

转载 作者:可可西里 更新时间:2023-11-01 00:53:32 25 4
gpt4 key购买 nike

当我的游戏暂停时,我设法打开另一个信息/积分/设置 View

let block = SKAction.runBlock {
let myScene = CreditsScene(size: self.size)
myScene.scaleMode = self.scaleMode
self.view?.presentScene(myScene)
}
self.runAction(block)

CreditsScene 打开时,我可以点击场景返回暂停的游戏。但是无论我如何尝试我都回不去:(

目前我做的最好的就是

let block = SKAction.runBlock {
let myScene = GameScene(size: self.size)
myScene.scaleMode = self.scaleMode
self.view?.presentScene(myScene)
}
self.runAction(block)

在我看来,这会打开一个新的 GameScene,而不是之前的。我还尝试了 removeFromParentpresentScene(nil),但它们都不起作用。

您还有其他更好的想法吗?谢谢

最佳答案

您正在呈现一个新的 GameScene,因为您正在创建一个新的 GameScene。如果您想保留您正在使用的 GameScene 实例并返回到它,则需要显示它。要么,要么您的 GameScene 类需要一种方法来保存和恢复其状态,以便可以恢复它的新实例以复制旧实例中发生的任何事情。


对于第一个选项,您可以这样做:

// in GameScene
let block = SKAction.runBlock {
let credits = CreditsScene(size: self.size)
credits.returnToScene = self // add this property to CreditsScene
credits.scaleMode = self.scaleMode
self.view?.presentScene(credits)
}
self.runAction(block)

// in CreditsScene
let block = SKAction.runBlock {
self.view?.presentScene(self.returnToScene)
}
self.runAction(block)

在这里,您将对当前 GameScene 的引用传递给您的 CreditsScene,以便 CreditsScene 知道 GameScene 完成后返回。或者,您可以将对当前 GameScene 的引用存储在某个全局位置(至少相对于场景而言),例如 View Controller 。


对于另一个选项,您需要确保可以保存和恢复 GameScene 类中的所有状态(或至少对玩家有意义的所有状态):current分数,当前玩家位置,敌人在哪里以及他们在做什么等等......无论你的游戏做什么。 SpriteKit 类已经支持 NSCoding,所以这是处理保存/恢复的好方法——只需确保您的任何自定义子类(如 GameScene)编码它们所具有的任何状态.

然后,您可以在离开时存档您的 GameScene,并在您准备好返回时从该存档中恢复。看起来像这样:

// in GameScene
let block = SKAction.runBlock {
let credits = CreditsScene(size: self.size)
credits.returnToScene = self // add this property to CreditsScene
credits.scaleMode = self.scaleMode

let sceneData = NSKeyedArchiver.archivedDataWithRootObject(self)
sceneData.writeToFile(savedGamePath, atomically: true)

self.view?.presentScene(credits)
}
self.runAction(block)

// in CreditsScene
let block = SKAction.runBlock {
if let game = NSKeyedUnarchiver.unarchiveObjectWithFile(savedGamePath) {
self.view?.presentScene(game)
}
}
self.runAction(block)

(假设 savedGamePath 是两个类都可以访问的常量。)


顺便说一句,如果您在此处使用 SKAction.runBlock 反射(reflect)了您游戏中的实际内容(而不是为了这个 SO 问题而简化您的代码),那么它是多余的。您无需为要立即运行的代码创建 runBlock 操作。因此,除非您实际上需要隐藏该操作以便稍后运行,否则您可以将我上面的第一个解决方案简化为如下所示:

// in GameScene
let credits = CreditsScene(size: self.size)
credits.returnToScene = self // add this property to CreditsScene
credits.scaleMode = self.scaleMode
self.view?.presentScene(credits)

// in CreditsScene
self.view?.presentScene(self.returnToScene)

关于ios - 在 SpriteKit 和 Swift 中关闭 SKScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27605612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com