- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我的游戏暂停时,我设法打开另一个信息/积分/设置 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,而不是之前的。我还尝试了 removeFromParent
、presentScene(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/
是否可以在我们使用 SpriteKit 时获得的标准全屏场景中正确呈现一个小场景?由于 SKScene 本质上是一个 UIView,应该可以吗? 最佳答案 没有。你不能在一个场景中有两个场景。场景类似
我试图让这个 SKScene 在游戏结束时出现在场景的中间,这样之前的场景在背景中仍然可见(类似于 flappy bird 的结局)。这是我希望它如何显示的图像: 到目前为止,这是我编写的代码: 在游
我目前正在暂停一个包含游戏玩法的 SKScene,并使用 self.view?.presentScene() 呈现另一个包含其上方菜单的 SKScene。 菜单场景的背景是透明的,在过渡过程中,我可以
在我的主 UIViewController 中,我定义了两个 SKScenes。我只想首先呈现 gameScene,然后在 gameScene 中的 Action 触发(按下暂停按钮)后呈现 uiSc
是的,我知道你在想什么......但这不是重复...... 我有 2 个场景,gameScene 和 menuScene。我想将 menuScene 覆盖在 gameScene 上。我知道你不能一次呈
如果你们有任何问题(也许我没有提供足够的信息),我很乐意展示更多我所拥有的内容,非常感谢 所以我的游戏场景中有条件来检查 x 或 y 是否获胜,并且它应该使用这段代码将您带到另一个场景: let ga
我试图让玩家在游戏结束时通过短信分享他们的分数。 我已将框架导入到我的项目中。在我的 viewController.h 文件中导入。 这是我的 viewController.h 文件 #import
我有一个非常具体的问题。我曾经使用默认代码从 View Controller 呈现我的游戏场景。但是,我添加了另一个 SKScene,现在使用以下代码展示我的游戏场景: //In an SKScene
我有一个 View Controller ,它有三个 skscenes 作为 child 。 当我从一个转换到另一个时,旧的 skscene 不会被释放。 我希望它被释放,就好像它从未存在过一样。 例
在 SKScene 上运行 SKTransition 会破坏原始 SKScene 吗? 例如: SKTransition *reveal = [SKTransition revealWithDire
所以我在游戏中加入了 3 个不同的场景:MenuScene、GameScene 和 GameOverScene。 我想知道如何从 GameOverScene 中获取位于 GameScene 中的 sc
我想在我的主要 GameScene 中添加一个 SKScene。 SKReferenceNode 似乎是一个很好的解决方案。 我有:- GameScene.sks(主场景)- Countdown.sk
我已经为此苦苦挣扎了好几天,由于某种原因,我的 SKScene 没有正确释放,这会导致有限的内存增长,因为每次我退出并进入一个场景时,内存都会跳起来。这意味着在说 10 轮游戏后,应用程序崩溃。据我所
为什么我在 SKScene 中看不到文字?这是在 SKScene 中使用 UIScrollView 的正确方法吗? -(id)initWithSize:(CGSize)size { if (s
我正在尝试传递 SKTexture 的预加载数组s 来自我的 SpriteKit 场景的 UIViewController当它初始化时进入场景。 但是,我似乎无法自定义 SKScene 的初始化方法。
我如何获得场景的边界? 我正在测试演示,并以这种方式初始化场景: GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"]; scen
有没有办法让 SKScene 有圆角?我知道您可以使用 SKCropNode 制作圆角矩形,但我不确定如何在 SKScene 中执行此操作。我的 ViewController 像 Apple 默认模板
似乎在 SKScene 中制作圆形的唯一方法是上传圆形图像或使用 SKShapeNodes。 如果我们想让用户从地址簿或照片库导入图片并将这些图片变成圆形(而不是矩形)以添加到 SKScene,该怎么
我有一个粒子,通过 SKScene 添加到 UIViewController 中。以下是我的 SKScene 代码: class MyScene : SKScene { private var
我正在 Xcode 中使用 Swift3 编写程序。我在我的程序中使用 SpriteKit 和 SKScene。如您所知,gamescene.sks 中有一个始终运行的预定义更新函数(即使 View
我是一名优秀的程序员,十分优秀!