代码之家  ›  专栏  ›  技术社区  ›  Coder ACJHP

如何从uiviewcontroller移动到skview,反之亦然?

  •  2
  • Coder ACJHP  · 技术社区  · 8 年前

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

    游戏视图控制器( ui视图控制器 )->进入游戏场景( 斯威克 )->地图控制器( ui视图控制器 )->游戏场( 斯威克 )

    我在从mapcontroller移动到gameplayground时遇到了一个问题,为了能够从一个控制器移动到另一个场景,我首先将controllers view类从故事板更改为skview,然后添加了以下代码。 handleDelay() 方法正在运行,游戏场景 didMove() 方法工作,但屏幕在旧视图上死机(MAPController)!?我确定游戏场景 DIDEMOVE() 方法有效,因为背景音乐开始播放。但为什么屏幕没有改变?

    我的代码如下:

    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
        }
    }
    

    所有答案都可以接受。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Coder ACJHP    8 年前

    从视图中删除所有子视图,然后显示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控制器移动的正确方法,反之亦然。

    例如(从 斯科特 到 ui视图控制器 ):

    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)
    }
    

    (从 ui视图控制器 到 斯科特 ):

    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
    
            }
        }
    }
    

    别忘了更改uiviewcontroller 看法 用“skview”分类:

    1. 选择“从情节提要查看”->标识检查器->自定义类。

    2. 2、选择 斯威克 从类下拉列表。

        2
  •  0
  •   E. Huckabee    8 年前

    容易修复。我复制并粘贴了代码到一个测试项目中,我发现了你做错了什么。您没有引用要呈现的场景。您不会传入要显示的特定skview。您正在演示一个通用的skview类。

    此代码:

    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
        }
    }
    

    应该如下所示:

    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()
    
        // Load the view as an SKView to prepare for an SKScene
        if let view = self.view as! SKView? {
            // Load the SKScene from the GameScene file
            let scene = GameScene()
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFill
    
            // Present the scene
            view.presentScene(scene)
    
            view.ignoresSiblingOrder = true
    
            view.showsFPS = true
            view.showsNodeCount = true
        }
    }
    

    测试和工作。

    推荐文章