gpt4 book ai didi

swift - 转到上一个场景 SpriteKit

转载 作者:行者123 更新时间:2023-11-28 12:06:17 25 4
gpt4 key购买 nike

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

我有不同级别的不同场景。这些场景中的每一个都有一个“暂停按钮”,可以将您带到“选项”场景。选项场景有一个“返回”按钮。

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

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

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

最佳答案

所以我一直在利用业余时间开发一款游戏,并且我几乎完全解决了您正在做的问题。以下是我在此过程中学到的一些东西。

1) 当你呈现一个场景时,你的场景的 didMove(to: view) 方法将被调用。通常您会在该方法中进行初始化,因此如果您只是暂停,然后再次呈现场景,您很可能会弄乱游戏状态。

2) 由于第 1 点,您无法在用户每次想要暂停时真正呈现一个新场景。

所以...我一直在使用的解决方案(这是大量谷歌搜索、试验等的结果)是为我所有的弹出/暂停类型场景实际使用一个单独的 View 。我在我的 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 协议(protocol)在我希望场景知道弹出窗口已关闭的情况下提供了帮助,以防他们需要根据弹出窗口显示的内容进行任何更改。

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

关于swift - 转到上一个场景 SpriteKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com