使用 SKTransition 调用 PresentScene 后屏幕冻结

问题描述 投票:0回答:1

我是 swift 和 Spritekit 的初学者,目前我有两个 UIViewController:LevelSelectViewController 和 GameViewController。后者应该根据我在 LevelSelectViewController 场景中单击的按钮来启动不同的 SKScene。

LevelSelectViewController 内有一个 UI 按钮,单击该按钮将显示 GameViewController,然后该按钮将启动 AdditionScene。

AdditionScene 内部有一个 SKSpriteNode,单击时会引用 GameViewController 并调用其 backToLevel 方法以转到 LevelSelectViewController。当满足某些条件时,场景也会加载一个新的 AdditionScene。

通常,视图控制器和场景之间的转换按预期进行。

我的问题是,当我从 GameViewController 从 LevelSelectViewController 返回然后重新进入 GameViewController 时,GameScene 在满足条件时不会加载新场景,并且屏幕会冻结在当前场景。

我检查了一下,发现新场景已初始化并加载,但屏幕只是卡住了。

此外,如果我在presentScene方法调用中省略SKTransition,屏幕冻结问题就可以解决,尽管它没有过渡动画。

现在我不知道是什么导致了这个错误以及如何解决它,除了废弃 SKTransition 这是不希望的。

以下是转换到 GameViewController 并告诉其加载 AdditionScene 的方法:

@IBAction func toAdditionLevel(_ sender: UIButton) {
    let viewController:GameViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "GameViewController1") as! GameViewController
    viewController.gameType = "addition"
    self.present(viewController, animated: true, completion: nil)
}

这里是跳回levelSelectController的方法:

func backToLevel() {
    let viewController:LevelSelectController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "levelSelectController") as! LevelSelectController
    self.present(viewController, animated: true, completion: nil)
}

这是我在 GameViewController 中加载 AdditionScene 的方法:

            let scene = AdditionScene(size: skView.frame.size)
            scene.game_delegate = self
            scene.winningStreak = 0
            scene.scaleMode = .aspectFill
            skView.presentScene(scene)

这是 AdditionScene 之间的过渡:

        let newScene = AdditionScene(size: self.size)
        newScene.game_delegate = self.game_delegate
        newScene.winningStreak = self.winningStreak!+1
        newScene.scaleMode = .aspectFill
        print("before presenting scene")
        let transition = SKTransition.moveIn(with: .right, duration: 1)
        transition.pausesOutgoingScene = true
        self.scene?.view?.presentScene(newScene, transition: transition)

如果你这样做 self.scene?.view?.presentScene(newScene)

卡屏没有问题,但是没有加载场景的动画。

ios swift sprite-kit
1个回答
0
投票

这是我发现成功的代码=

    func presentScene(_ theScene: SKScene) {
        
        theScene.scaleMode = .resizeFill

        if let skView = self.view as? SKView {
            skView.ignoresSiblingOrder = true
            skView.showsFPS = true
            skView.showsNodeCount = true
            
#if os(iOS)
            let theTransition = SKTransition.doorway(withDuration: 2.0)
            skView.presentScene(theScene, transition: theTransition)
#elseif os(tvOS)
            skView.presentScene(theScene)
#endif
        }

    }   // presentScene

FWIW,#if 子句的原因是因为我在 3

SKScenes
之间切换。对于
os(tvOS)
,我依靠全局
var
来保留其在多个
SKScenes
之间的值。我发现,除非我放弃
SKTransition
而选择
os(tvOS)
,否则当用户快速按下 GamePad Controller 上的相应按钮时,不会发生这种保留。
    

© www.soinside.com 2019 - 2024. All rights reserved.