关闭 SKScene 返回 UIKit 菜单

2023-11-29

一旦我的 SpriteKit 游戏结束,我想回到我的UIKit MenuViewController。根据我到目前为止所学到的,使用协议/委托是最好的(?)选项,但我无法让它发挥作用。我知道该协议可能会高于类声明GameViewController,看起来像:

protocol GameViewControllerDelegate {
    var gameOver: Bool?
}

但我需要帮助才能访问它GameScene并让它被解雇GameViewController。以下是该应用程序的框架,以防有帮助。

storyboard image

菜单视图控制器

class MenuViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func goToGame(_ sender: UIButton) {
        performSegue(withIdentifier: "toGameSegue", sender: sender.currentTitle)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destinationVC = segue.destination as? GameViewController {
            if let item = sender as? String {
                destinationVC.numberOfPlayers = item
            }
        }
    }
}

游戏视图控制器

class GameViewController: UIViewController {

    var numberOfPlayers: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill

                scene.userData = NSMutableDictionary()
                scene.userData?.setObject(numberOfPlayers!, forKey: "numberOfPlayers" as NSCopying)

                view.presentScene(scene)
            }
        }
    }
...

游戏场景

class GameScene: SKScene {

    var howManyPlayers: String?

    override func didMove(to view: SKView) {

        if let numPlayers = self.userData?.value(forKey: "numberOfPlayers") {
            howManyPlayers = numPlayers as? String
        }

        print(howManyPlayers!)

    }
...

这个 SpriteKit 游戏有一个 MenuViewController、一个 GameViewController 和一个 GameScene。当您从 MenuViewController 按下按钮时,数据将通过 segue 发送到 GameViewController。在 GameViewController 呈现 GameScene 之前,它将数据存储在场景的 userData 变量中,以便 GameScene 可以访问它。在此示例中,它是玩家的数量。


我同意 Whirlwind 的评论:当你只能使用一个 viewController 来完成所有游戏时,为什么要混合两个不同的框架并使你的生活变得复杂?

无论如何,根据你的故事板截图,有 2 个 viewController,你可以转到第二个 viewController (以及GameScene) 仅当您按下按钮时.

有两件事要做:取消分配当前的 SKScene(在您的情况下GameScene)并呈现“初始视图控制器”或您的MenuViewController.

为此,我使用“你好世界”Sprite-kit 模板带有协议/委托方法来扩展SKSceneDelegate class。正如你所看到的,我们能够关闭场景(呈现 nil)并调用外部方法GameViewController呈现MainViewController

为了确保这两个操作都能成功,我还使用了两个print仅用于调试:

游戏视图控制器:

import UIKit
import SpriteKit
class GameViewController: UIViewController,TransitionDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                scene.delegate = self as TransitionDelegate
                view.presentScene(scene)
            }
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    func returnToMainMenu(){
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        guard  let storyboard = appDelegate.window?.rootViewController?.storyboard else { return }
        if let vc = storyboard.instantiateInitialViewController() {
            print("go to main menu")
            self.present(vc, animated: true, completion: nil)
        }
    }
}

游戏场景:

import SpriteKit
protocol TransitionDelegate: SKSceneDelegate {
    func returnToMainMenu()
}
class GameScene: SKScene {
    override func didMove(to view: SKView) {
        self.run(SKAction.wait(forDuration: 2),completion:{[unowned self] in
            guard let delegate = self.delegate else { return }
            self.view?.presentScene(nil)
            (delegate as! TransitionDelegate).returnToMainMenu()
        })
    }
    deinit {
        print("\n THE SCENE \((type(of: self))) WAS REMOVED FROM MEMORY (DEINIT) \n")
    }
}

Output:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭 SKScene 返回 UIKit 菜单 的相关文章

随机推荐

  • 准备好的sql语句中的Python整数列表

    我的问题有点像Python 字符串到 SQL IN 参数的列表但我有一个整数列表 我使用的Python代码是 ids 1000032 1000048 sql SELECT CompNo CompName CompType FROM Comp
  • 在python matplotlib中将不规则四边形转换为矩形

    我从视频中得到了这些数据 矩形的顶点 动物在矩形内追踪的点 由于图像变形 我的 矩形 不规则 我想转换数据以便将它们在 matplotlib 中绘制为矩形 有简单的方法吗 这是迷宫和追踪 我把它分解成五个四边形 您可以使用skimage t
  • Javascript NoGray 日历如果今天被阻止,则在选择的阻止日期后查找下一个可用日期

    我正在使用NoGray Calendar并有以下代码 my cal1 new ng Calendar input date date1 month month1 year year1 selected date new Date displ
  • 错误:无法打开显示::0 进行 Selenium 测试

    首先我收到以下错误 org openqa selenium firefox NotConnectedException Unable to connect to host 127 0 0 1 on port 7055 after 45000
  • 使用“struct S”或“S”作为类型名的区别

    C 语言中结构化类型的名称S ist struct S 在C 中也可以使用struct S作为类型名而不是S像往常一样 struct S struct S s1 also ok in C S s2 normal way in C 所以 假设
  • 使用 group by 进行条件聚合查询

    我有一个系统 用户从不同的公司登录 我正在尝试运行查询来查看每个公司的活跃用户数与用户总数 Users table userID companyID lastLogin 期望的输出 companyID totalCompanyUsers n
  • 如何在Python中检查数字的“密码”[重复]

    这个问题在这里已经有答案了 我已经设置了一个程序来更改 密码 我让它检查它是否至少有 8 个字符 包含大写字母和数字 如果不满足此条件 它会再次要求输入密码 除了检查号码之外 我一切正常 我想知道是否有人可以提供帮助 npwv 1 whil
  • JSTL 1.0 字符串函数

    我正在尝试使用一些字符串函数 例如修剪或concat使用 JSTL 我尝试了以下方法 我尝试添加但我最终遇到了错误 我认为这适用于其他 JSTL 版本 例如 1 2 或 1 1 我需要知道的是如何在 JSTL 1 0 中使用字符串函数 JS
  • 对嵌套列表进行排序

    给出的是一个嵌套列表 具有以下标记 遗憾的是目前无法更改 我想对此列表进行排序 以及按 a 标签标题排序的所有嵌套列表 第一个 div 未嵌套在 li 中 应该用于对 ul 同级进行排序 性能也很重要 因为这个列表很容易包含超过 100 个
  • Pygame 从全屏切换到正常不起作用

    我目前正在尝试设置从窗口模式和全屏模式切换的设置 但是进入全屏并尝试返回后 游戏错误非常奇怪并且粘在左上角 顺便提一句 显示宽度 1280 显示高度 720 elif Settings Menu True screen fill 0 0 0
  • jQuery:如何动态检测窗口宽度?

    我的页面上有一个滚动元素 使用 jScrollPane jQuery 插件 我想要完成的是一种通过检测浏览器窗口的宽度来关闭滚动窗口的方法 我正在做响应式布局 我希望当浏览器低于一定宽度时关闭此滚动功能 当我刷新页面时 我能够使其工作 但是
  • 在 while 循环内将对象添加到列表中

    我正在尝试循环一个列表 该列表内部有 4 个数组 每个数组有 7 个值 我正在循环列表 然后当我从列表中获取一个数组时 因为我知道有多少个值具有该数组 所以我分配每个数组索引 如下所示 personObject setName String
  • 如何正确编码完整的 http url 字符串?

    我从用户那里获得一个 url 字符串 并希望将其转换为合法的 http url http one two Three four five 应该变成 http one two Three four 20 Five 但是 URLEncoder
  • Sass @import 指令在 Rails 引擎中使用时无法在插件中找到资源

    我正在构建一个使用 zurb foundation 样式表的 Rails 引擎 并且不断遇到相同的 Sass Syntax 错误 这看起来很奇怪 因为我在 Rails 应用程序中遵循了相同的过程 并且第一次尝试就成功了 因此 我决定通过启动
  • SQL:选择其他查询未选择的所有记录

    我正在寻找一个 SQL 查询来选择同一个表上的另一个查询未选择的所有记录 具体来说 我想选择具有特定字段 fieldA 重复项的所有记录 然后删除除其中一条记录之外的所有记录 因此 select 语句可能类似于以下内容 这不起作用 sele
  • javascript 调用函数 10 次,每次间隔 1 秒

    如何调用一个函数 10 次 for x 0 x lt 10 x callfunction 但每次通话之间间隔 1 秒 function callNTimes func num delay if num return func setTime
  • 如何在 SceneKit 中使用着色器添加透明度?

    我想从图像中获得透明效果 现在我只是用圆环进行测试 但着色器似乎不适用于 alpha 据我从这个帖子中了解到的 在 Scenekit 中使用混合函数 以及这个关于透明度的维基链接 http en wikibooks org wiki GLS
  • 如何将dojo工具包与rails 3.1 asset pipeline和coffeescript一起使用?

    我正在尝试在 Rails 3 1 应用程序上使用 dojo toolkit 作为 JS 框架 但我正在努力将 dojo require 结构与 sprockets require 和 Coffeescript 结合起来 看起来dojo需要磁
  • 如何使用 netbeans 在 java 中每次掷骰子后询问用户是否愿意继续游戏?

    我需要帮助解决这个问题 掷骰子游戏是用两个六面骰子进行的 玩游戏的用户将掷两个骰子 并生成两个介于 1 到 6 之间的随机数 两个数字的总和将用于决定下一步 如果总和为 2 3 或 12 则玩家获胜 如果总和是 7 或 11 那么他 她就输
  • 关闭 SKScene 返回 UIKit 菜单

    一旦我的 SpriteKit 游戏结束 我想回到我的UIKit MenuViewController 根据我到目前为止所学到的 使用协议 委托是最好的 选项 但我无法让它发挥作用 我知道该协议可能会高于类声明GameViewControll