【问题标题】:How to pass scene type to a function in a generic manner?如何以通用方式将场景类型传递给函数?
【发布时间】:2020-04-19 04:34:11
【问题描述】:

在创建 SpriteKit + GameplayKit 项目时,我有以下由 Xcode 生成的样板代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // Load 'GameScene.sks' as a GKScene. This provides gameplay related content
    // including entities and graphs.
    if let scene = GKScene(fileNamed: "GameScene") {

        // Get the SKScene from the loaded GKScene
        if let sceneNode = scene.rootNode as! GameScene? {

            // Copy gameplay related content over to the scene

            // Set the scale mode to scale to fit the window
            sceneNode.scaleMode = .aspectFill

            // Present the scene
            if let view = self.view as! SKView? {
                view.presentScene(sceneNode)

                view.ignoresSiblingOrder = true

                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    }
}

为了测试不同的场景,我宁愿把 super.viewDidLoad() 之后的所有代码都移到一个函数中,这样我就可以很容易地测试不同的场景,而不必编辑很多代码。

我遇到的问题是:

if let sceneNode = scene.rootNode as! GameScene? 

我不确定如何以通用方式将类类型传递给函数,因此我可以传递正确的场景类型,而不是 GameScene?

我该怎么做?

【问题讨论】:

    标签: swift sprite-kit gameplay-kit


    【解决方案1】:

    您可以使用更通用的代码,例如实际的样板代码:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameScene") {
                scene.scaleMode = .aspectFill
                view.presentScene(scene)
            }
            view.ignoresSiblingOrder = true
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    

    如果你所有的场景都继承自 SKScene,你就不会有麻烦了。

    但是如果你真的需要在函数上传递 Type 类来加载,你可以做这样的事情:

    func loadScene<T>(named name: String, classType: T.Type) -> T? {
        return SKScene(fileNamed: name) as? T
    }
    

    并使用:

    let newScene = loadScene(named: "some", classType: GameScene.self)
    // newScene is Optional(GameScene) type.
    

    当然,您可以删除可选替换 T? 并控制负载为零。

    【讨论】:

    • 问题是 GKScenes 只能从文件中加载,并且文件中必须提到类类型......我完全不使用 GKScenes 来解决它,但我仍然出于纯粹的学术原因对我最初的问题感兴趣 - 如何将类类型作为参数传递给 swift 中的函数......
    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2018-08-12
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多