ios - 如何从 UIViewController 移动到 SKView,反之亦然?

标签 ios swift sprite-kit skview

我的想法是在移动到游戏场景之前显示 map 几秒钟,游戏屏幕层次结构如下:

GameViewController(UIViewController) -> EntryToGameScene (SKView) -> MapController (UIViewController) -> GamePlayGround (SKView)

我在从 MapController 移动到 GamePlayGround 时遇到问题,为了能够从 Controller 移动到场景,首先我将 Controller View 类从 Storyboard 更改为 SKView,然后添加以下代码⬇️.After handleDelay( ) 方法正在运行,游戏场景 didMove() 方法正在工作,但屏幕卡在旧 View (MapController)上!?我确信游戏场景 didMove() 方法可以正常工作,因为背景音乐开始播放。但是为什么屏幕没有改变?

我的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()
    // Wait for three sec. then move to game scene
    self.perform(#selector(handleDelay), with: nil, afterDelay: 3.0)
}

@objc fileprivate func handleDelay() {

    view.layoutIfNeeded()

    if let view = self.view as! SKView? {
        // Load the SKScene
        let scene = GameScene(size: sceneSize)

        // Set the scale mode
        scene.scaleMode = .aspectFill
        scene.delegate = self
        // Present the scene
        view.presentScene(scene)

        view.ignoresSiblingOrder = true
        view.showsFPS = false
        view.showsNodeCount = false
        view.showsPhysics = false
    }
}

所有答案都可以接受。

最佳答案

从 View 中删除所有 subview 然后呈现 SKScene 的解决方案。

注意:我知道这不是最好的解决方案,但目前没有其他选择,所以我像这样更改了代码:

override func viewDidLoad() {
    super.viewDidLoad()

    self.perform(#selector(handleDelay), with: nil, afterDelay: 3.0)

}

@objc fileprivate func handleDelay() {

    self.view.subviews.forEach {$0.removeFromSuperview()}

    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.swift' and should set it's size
        let scene = SecondGameScene(size: self.view.frame.size)
        // Set the scale mode to scale to fit the window
        scene.scaleMode = .aspectFill

        // Present the scene
        view.presentScene(scene)

        view.ignoresSiblingOrder = true

        view.showsFPS = false
        view.showsNodeCount = false
    }

}

更新: 最后我找到了从 SKScene 和 UIView Controller 迁移的正确方法,反之亦然。

例如(从SKScene移动到UIViewController):

fileprivate func moveToUIViewController(storyBoardId: String) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: storyBoardId)
    vc.view.frame = self.frame
    vc.view.layoutIfNeeded()        

    self.view?.window?.rootViewController?.present(vc, animated: true, completion: nil)
}

(从UIViewController移动到SKScene):

fileprivate func returnToSKScene() {

    for element in self.view.subviews {
        element.removeFromSuperview()
    }
    self.dismiss(animated: true) {
        if let view = self.view as! SKView? {
            // Load the SKScene
            var scene: SKScene
            scene = AboutScene(size: sceneSize)

            // Set the scale mode
            scene.scaleMode = .aspectFill
            let transition = SKTransition.moveIn(with: .up, duration: 0.2)

            // Present the scene
            view.presentScene(scene, transition: transition)

            view.ignoresSiblingOrder = true
            view.showsFPS = false
            view.showsNodeCount = false
            view.showsPhysics = false

        }
    }
}

不要忘记用“SKView”更改 UIViewController view 类:

  1. 从 Storyboard -> 身份检查器 -> 自定义类中选择查看。

  2. 2.从类下拉列表中选择SKView

关于ios - 如何从 UIViewController 移动到 SKView,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52260186/

相关文章:

ios - AudioKit - 无法让 AKClipRecorder 工作

ios - 为 UITableViewCell 创建了图像缓存,但只显示一张图像

swift - 无法将类型 'Int' 的值转换为预期参数类型 'Bool'

swift - 使用 Swift 创建平铺的十六进制游戏

ios - NSTimer 不够精确

ios - 使用 block 翻转UIImageView

ios - Swift:从DropBox下载图像

ios - Swift:如何在更改 View 时停止背景音乐

ios - Peek 和 Pop 函数 SpriteKit

ios - SpriteKit : Count of SKSpriteNodes on screen