如何关闭 SKScene?

Posted

技术标签:

【中文标题】如何关闭 SKScene?【英文标题】:How to dismiss SKScene? 【发布时间】:2014-03-22 03:12:59 【问题描述】:

当我完成我的 SKScene 后,有没有办法从我的 SKScene 课程中解除 SKScene?

如果没有回到我展示我的 SKScene [skView presentScene:theScene]; 的 Viewcontroller 中,有没有办法重新启动场景或从我的 SKView 中删除?

SKScene Class Reference 和 SKView Class Reference 无济于事。

更新:

以下代码从我的 SKView [yourSKView presentScene:nil]; 中删除了我的场景,但是当我回到我的视图控制器时,场景仍在后台运行。游戏结束后我总是可以暂停它,然后我会被送回我的视图控制器(菜单),但我想知道除了像完全删除它一样暂停它之外还有其他方法吗?

-(void)endTheGame 
    [highscoreLabel removeFromSuperview];
    NSLog(@"Game Over");
   //would like to end here before calling the below method in my view controller
    [self.delegate mySceneDidFinish:self];

【问题讨论】:

关闭视图控制器?毕竟,如果您不想再呈现一个场景,您可以(并且应该)完全取消 SKView。 你解决了吗?我有同样的问题.. 无法从场景返回到视图控制器 您不能从场景中“返回视图控制器”。场景是一个视图,视图控制器控制和显示视图。使用视图控制器更改视图。请记住,视图控制器本身不是视图。 【参考方案1】:

我更喜欢在 UIViewController 制作 SkScene 的地方为 SKViewNotification Center 使用额外的 UIViewController

回调函数是

@objc func cb_dismissingVC(_ notificaiton: Notification) 
    self.dismiss(animated: true, completion: nil)

【讨论】:

【参考方案2】:

也许我的变种会有所帮助:

[[self.scene childNodeWithName:@"YourChildNodeName"] removeFromParent];

【讨论】:

OP 询问如何删除场景,而不是节点【参考方案3】:

遇到了类似的问题,我偶然发现了你的问题,由于没有人给出一个体面的答案,这就是我解决它的方法:

    在我的场景中,我调用了两条线
[self removeFromParent];
[self.view presentScene:nil];
    在我的 controller(显示 SKScene 的控制器)中,我更改了 Apple 的模板代码,该代码从 viewDidLoad 创建和呈现我的场景,以便在 viewWillAppear 中创建和呈现我的场景,仅如果视图的场景为零

这是我的 Swift 代码,即使您使用的是 Objective C,您也会明白它的作用;关键是“if skView.scene == nil”测试:

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    let skView = self.view as SKView
    if skView.scene == nil 
        let scene = GameScene(size:skView.bounds.size)
        scene.controller = self
        skView.ignoresSiblingOrder = true
        scene.scaleMode = .AspectFill
        skView.presentScene(scene)
    

【讨论】:

如果您的答案不那么令人困惑,它会有所帮助。你有一个快速和客观的组合 c。我不确定您的代码片段是否与您的文字一致。您提到了视图控制器,但显示了游戏场景中的例程?在我的例子中,我在视图控制器中设置了两个断点,一个在 viewdidload 中,另一个在 viewwillappear 中。启动时都命中,但在步骤 1 中游戏场景中使用的方法之后均未命中。【参考方案4】:

“你不能从一个场景中“回到视图控制器”。场景是一个视图,视图控制器控制并显示视图。使用视图控制器来改变视图。记住视图控制器本身不是一个看法。” -Wharbio

这里最好的解决方案是创建另一个视图控制器。这个视图控制器将是我的菜单。然后另一个视图控制器将充当 skscene 的主机。

在我的情况下,然后我使用我的菜单视图控制器来关闭在 skview 中显示的视图控制器。

【讨论】:

有没有别的办法。如果我这样做,我会收到很多内存警告,并且我的游戏有时会崩溃?【参考方案5】:

我通过在我的视图控制器中使用这个块来完全删除场景: 显然,您需要声明您的尺寸和“newSKview”

SKView * skView = (SKView *)self.view;

SKScene *newScene = [[newSKView alloc]initWithSize:size];
newScene.scaleMode = SKSceneScaleModeAspectFill;
SKScene *oldScene=(skView.scene);
[oldScene removeFromParent];
[skView presentScene:newScene];

这对我来说很好。我的所有场景都没有保留或增强。

【讨论】:

【参考方案6】:

你可以使用:

 [yourSKView presentScene:nil];

删除场景。

【讨论】:

真棒是的,它从我的 skview 中删除了场景,但是当我重定向到菜单时,场景仍在后台运行?除了在游戏结束时暂停场景还有其他方法吗? 菜单在父视图控制器中吗?你能贴出你用来进入菜单的代码吗? 是的,菜单是父视图控制器 如果你把它设置为nil,它怎么还在运行?您是否考虑过将菜单放在单独的视图控制器中?所以VC1有菜单可以调用承载SKScene的VC2。游戏结束后,让 VC1 关闭 VC2 我更喜欢使用两个 VC,提供更好的控制,并保证您的 SKScene 连同其内存使用情况一起被删除。您仍然可以使用 VC2 暂停游戏,但如果要删除它,请使用 VC1。另外,我通常会在 SKScene 本身中放置一个菜单,其中包含暂停重启等功能。【参考方案7】:

在您的SKScene 中,您可以简单地执行[self.view presentScene:aNewScene] 来呈现另一个场景

【讨论】:

这似乎是我寻找这个答案的每个人的解决方案。但这不是我想要的。我想回到我的视图控制器中的菜单(我已经成功地做到了)。可能是当我回到我的菜单中,然后你点击按钮重新开始游戏并在它离开的完全相同的位置呈现场景。这就是我需要以某种方式关闭或重新启动场景的原因。 你确定你正在呈现一个新场景,即通过执行alloc / init,而不是保存在 ivar 中的现有场景?

以上是关于如何关闭 SKScene?的主要内容,如果未能解决你的问题,请参考以下文章

从 SKScene 呈现后无法关闭视图控制器

关闭 SKScene 后,内存仍然很高

如何释放未使用的 SKScene

如何将SKScene添加到SCNNode平面?

如何从 SKScene 呈现 UIAlertController

如何在 SpriteKit 中的 SKScene 上显示 AdMob 横幅广告?