我正在制作游戏。在主菜单上,我有一个“开始游戏”,“高分”,“选项”,“商店”按钮。
我有不同级别的各种场景。每个场景都有一个“暂停按钮”,可以进入“选项”场景。选项场景有一个“后退”按钮。
如何让“BACK”按钮返回到有场景的地方?
现在“BACK”按钮只能返回菜单,即我的代码中的SceneSkip,无论它叫什么场景:
func back(){
let sceneSkip = SceneSkip(fileNamed: "SceneSkip")
sceneSkip?.scaleMode = .aspectFill
self.view?.presentScene(sceneSkip!, transition: SKTransition.fade(withDuration: 0.5))
}
答案 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顶部显示对话框。这样,当我完成对话后,我可以将其删除,并取消暂停游戏,一切都会回到原来的状态,而不必全部加载场景。