【问题标题】:iPhone Swift Changing your initial SceneiPhone Swift 改变你的初始场景
【发布时间】:2015-09-14 16:59:46
【问题描述】:

现在,我知道如何在 SpriteKit 游戏中转换场景了。我无法解决的棘手问题是更改加载的初始值。我创建的游戏直接跳转到游戏中。该初始场景称为 GameScene.swift。我创建了一个 MainMenuScene.swift 并尝试将其更改为首先加载它。然后单击后,我将对下一个场景进行 SKTransition,就像我在游戏中稍后的工作一样。

这是我的视图控制器代码:

override func viewDidLoad() {
    super.viewDidLoad()

    if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
        // Configure the view.
        let skView = self.view as SKView
        //skView.showsFPS = true
        //skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)
    }
}

我认为将“GameScene”更改为“MainMenuScene”可以解决问题,但根本没有加载任何内容。然后我想也许是大小,但所有设置都与另一个场景相同。即使尝试添加节点数,也没有任何显示。所以我假设根本没有加载任何内容。也许我又瞎又傻,但我就是看不见。

提前致谢。

【问题讨论】:

    标签: iphone swift ios8 sprite-kit


    【解决方案1】:

    让你的 viewController 像这样:

    class GameViewController: UIViewController {
    
               override func viewDidLoad() {
                    super.viewDidLoad()
                    let scene = MainMenuScene(size: view.bounds.size) //This can be any scene you want the game to load first
                    let skView = self.view as! SKView
                    skView.showsFPS = false
                    skView.showsNodeCount = false
                    skView.ignoresSiblingOrder = true
                    scene.scaleMode = .ResizeFill
                    skView.presentScene(scene)
            }
    
        }
    

    在您的 MainMenuScene.swift(以及您希望包含在游戏中的所有其他场景)中,确保该类本身是这样开始的:

    class chooseScene: SKScene {
    
    override func didMoveToView(view: SKView) {
    
    } }
    

    这是我在 viewController 和 SKScenes 中使用的代码,几个月前我遇到了和你完全相同的问题。

    【讨论】:

    • 请注意:在我的代码中,我使用了 .ResizeFill。根据您的游戏,您的可能需要 .AspectFill。以防万一你不知道这些东西,这里有一个很好的解释:thinkingswiftly.com/…
    【解决方案2】:

    在你的视图控制器中试试这个

    // Configure the view.
    let skView = self.view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true
    
    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = true
    
    let scene = MainMenuScene(size: skView.frame.size)
    
    /* Set the scale mode to scale to fit the window */
    scene.scaleMode = .AspectFill
    
    skView.presentScene(scene)
    

    MainMenuScene 中,确保添加这些初始化程序

    override init(size: CGSize) {
        super.init(size: size)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    【讨论】:

    • 我在 MainMenuScene 中有初始化的东西。当我为 let scene = MainMenu.... 添加您的行时,它会按应有的方式加载菜单。但令人怀疑的是,GameScene 没有按预期加载任何内容。它将运行计时器,游戏逻辑将运行它,切换到结束游戏场景。然后当你切换回来时,它会再次重复同样的事情。我需要在 GameScene(原始初始场景)中更改什么?
    • 我不知道发生了什么。不确定 GameScene 是如何从 MainMenuScene 中出现的。看不到你的代码..你知道吗?我只是让你知道如何在视图控制器中加载一个场景与另一个场景。
    • 我在 didMoveToView 中调用了大部分游戏逻辑。首先是背景颜色发生了变化。这样可行。然后没有标签直接放在屏幕上。既然它不是最初的,我应该以不同的方式构建它吗?
    • 屏幕参数等会不会乱了?这将解释背景和其他一切如何仍然有效。我将如何调整它,使其与我最初做的一样?
    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2013-08-21
    • 2014-04-28
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多