转到上一个场景SpriteKit

时间:2018-03-16 15:35:48

标签: swift sprite-kit

我正在制作游戏。在主菜单上,我有一个“开始游戏”,“高分”,“选项”,“商店”按钮。

我有不同级别的各种场景。每个场景都有一个“暂停按钮”,可以进入“选项”场景。选项场景有一个“后退”按钮。

如何让“BACK”按钮返回到有场景的地方?

现在“BACK”按钮只能返回菜单,即我的代码中的SceneSkip,无论它叫什么场景:

func back(){
        let sceneSkip = SceneSkip(fileNamed: "SceneSkip")
        sceneSkip?.scaleMode = .aspectFill
        self.view?.presentScene(sceneSkip!, transition: SKTransition.fade(withDuration: 0.5))
}

2 个答案:

答案 0 :(得分:1)

所以我在业余时间一直在做游戏,而且我已经完全解决了你正在做的事情。以下是我在此过程中学到的一些事情。

1)当您呈现一个场景时,将调用您的场景的didMove(to:view)方法。通常你在那个方法中进行初始化,所以如果你只是暂停,并且再次呈现场景,你很可能会搞乱游戏状态。

2)由于数字1,每次用户想要暂停时,你都无法真正呈现新场景。

所以...我一直在使用的解决方案,这是一些谷歌搜索,实验等的结果,实际上是为我的所有弹出/暂停类型场景使用单独的视图。我在我的GameViewController viewWillLayoutSubviews中将它设置为这样,其中skView是主视图:

let psize = view.bounds
popup = SKView.init(frame: psize)
skView.addSubview(popup!)
popup?.allowsTransparency=true
popup?.isHidden=true

然后,当游戏中任何地方的任何场景想要添加弹出窗口时,我添加了以下功能:

func showPopupScene(_ scene : SKScene) {

    (self.view as? SKView)?.scene?.isPaused = true
    popup?.isHidden=false
    popup?.presentScene(scene)

}

func closePopup() {
    popup?.isHidden=true
    if let v=view as? SKView {
        (v.scene as? PopupNotify)?.onPopupClosed()
        v.scene?.isPaused=false
    }
}

现在,任何场景都可以创建一个场景,并将其显示为带有showPopupScene的弹出窗口。然后弹出场景需要调用closePopup并且游戏返回到它停止的场景。

其他项目:

我希望我的游戏场景能够正常运行,暂停弹出窗口,以及当它们从背景中暂停时等等...所以我覆盖了isPaused:

override var isPaused : Bool {
    get {
        guard let v = self.view?.window?.rootViewController as? GameViewController else {
            return super.isPaused
        }
        guard let p = v.popup else { return super.isPaused }
        return super.isPaused || !p.isHidden
    }
    set(newPaused) {
        super.isPaused = newPaused
        physicsWorld.speed = newPaused ? 0 : 1.0
    }
}

此外,我的场景的PopupNotify协议帮助了我想让场景知道弹出窗口被关闭的情况,以防他们需要根据弹出窗口显示的内容进行任何更改。

希望我没有忘记任何事情,但这些新增功能的组合提供了非常简单的弹出/暂停管理。

答案 1 :(得分:1)

我认为你正以困难的方式处理“关卡”。

我建议你做的是......

为您的菜单创建一个过渡到GameScene的场景。

在你的GameScene中,你可以加载游戏中常见的所有通用对象,无论其级别如何(例如gameHud,得分标签,暂停按钮,选项按钮等)。

然后根据参数(levelID)将您的关卡场景加载到GameScene中。

这样就不必在多个场景中创建任何通用对象,从而大大减少了冗余错误的可能性。

  

完全可选部分

我不喜欢在游戏中间切换暂停或选项的场景。它创造了许多出错的机会(无法加载数据,无法保存位置,得分,动画等)。

我将暂停和选项对话框创建为SKSpriteNodes并暂停游戏并在GameScene顶部显示对话框。这样,当我完成对话后,我可以将其删除,并取消暂停游戏,一切都会回到原来的状态,而不必全部加载场景。

enter image description here