【问题标题】:How To Present a SKScene from a UIViewController如何从 UIViewController 呈现 SKScene
【发布时间】:2020-02-12 03:58:51
【问题描述】:

我正在 SpriteKit 中创建这个游戏。 在第一次启动时,GameViewController 会呈现另一个名为 MenuViewController 的 ViewController,并与情节提要相关联。 在MenuViewController 中有一个播放按钮,它将显示一个名为GameScene 的SKScene。

我想出了如何从GameViewController 呈现MenuViewController,但是当点击播放按钮时我找不到呈现GameScene 的方法。 在我的代码中,当点击按钮时,实际上什么也没发生。

GameViewController:

import UIKit
import SpriteKit

class GameViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {

        let storyBoard: UIStoryboard = UIStoryboard(name: "MenuViewController", bundle: nil)
        let vc = storyBoard.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController
        self.present(vc, animated: true, completion: nil)

    }

} 

MenuViewController:

import UIKit
import SpriteKit

class MenuViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func playButtonTapped(_ sender: Any) {

         if let view = self.view as! SKView? {
            let scene = GameScene(size: view.bounds.size)
            scene.scaleMode = .aspectFill 
            view.presentScene(scene)
            view.ignoresSiblingOrder = true
            view.showsFPS = false
            view.showsNodeCount = false
            view.showsPhysics = false

         }
    }

}

另外,我在控制台中打印了这个警告:

SKView: ignoreRenderSyncInLayoutSubviews is NO. Call _renderSynchronouslyForTime without handler

我不知道这是否相关......

我确实将MenuViewController 的故事板的视图设置为等于SKView。 我找不到任何方法让GameScene 出现。什么都没有发生。

谢谢!

【问题讨论】:

    标签: ios swift uiviewcontroller skscene


    【解决方案1】:

    根据 Apple 开发文档,“场景”需要为“视图”呈现。 试试这个。 :)

    @IBAction func playButtonTapped(_ sender: Any) {
    
         if let view = self.view as? SKView {
            let scene = GameScene(size: view.bounds.size)
            scene.scaleMode = .aspectFill
            view.ignoresSiblingOrder = true
            view.showsFPS = false
            view.showsNodeCount = false
            view.showsPhysics = false
    
            // Add this code
            view.presentScene(scene)
         }
    }
    

    https://developer.apple.com/documentation/spritekit/skview/1519705-presentscene

    【讨论】:

    • 但是当我这样做时,控制台打印:SKView: ignoreRenderSyncInLayoutSubviews is NO. Call _renderSynchronouslyForTime without handler
    • 我认为您需要检查所有图像或颜色名称是否正确(+大写/小写)。
    • 例如,let map = SKSpriteNode(imageNamed: "map") 代码会在您的图像文件名为 ["M"ap] 时发出警告消息。
    • 嗨,我实际上发现它呈现了场景(或在场景中做了东西),但它没有出现在显示器上,因为我在 GameScene 中添加了一个打印语句和当我单击播放按钮时,它打印了语句。但由于某种原因,实际上什么也没出现。
    【解决方案2】:

    我想我可能已经找到了解决方案——我没有直接从MenuViewController 呈现GameScene,而是当按下playButton 时,我转换到GameViewController,然后呈现@ 987654325@ 从那里。

    我不知道为什么它在MenuViewController 中不起作用,但是这种方法有效。

    【讨论】:

      【解决方案3】:

      在您的 GameViewController 类更改

      if let scene = SKScene(fileNamed: "GameScene")

      if let scene = GameScene(fileNamed: "GameScene")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 2013-10-26
        相关资源
        最近更新 更多