如何从 UIViewController 呈现 SKScene
How To Present a SKScene from a UIViewController
我正在用 SpriteKit 创建这个游戏。
首次启动时,GameViewController
会显示另一个名为 MenuViewController
的 ViewController,并与故事板链接。
在 MenuViewController
中有一个播放按钮,它将呈现一个名为 GameScene
的 SKScene。
我想出了如何从 GameViewController
显示 MenuViewController
,但我找不到在点击播放按钮时显示 GameScene
的方法。
在我的代码中,当点击按钮时,实际上什么也没有发生。
GameViewController
:
import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
let storyBoard: UIStoryboard = UIStoryboard(name: "MenuViewController", bundle: nil)
let vc = storyBoard.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController
self.present(vc, animated: true, completion: nil)
}
}
并且在 MenuViewController
:
import UIKit
import SpriteKit
class MenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func playButtonTapped(_ sender: Any) {
if let view = self.view as! SKView? {
let scene = GameScene(size: view.bounds.size)
scene.scaleMode = .aspectFill
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = false
view.showsNodeCount = false
view.showsPhysics = false
}
}
}
另外,我在控制台中打印了这个警告:
SKView: ignoreRenderSyncInLayoutSubviews is NO. Call _renderSynchronouslyForTime without handler
不知道有没有关系...
我确实将 MenuViewController
的故事板的视图设置为与 SKView 相同。
我找不到任何方法让 GameScene
出现。没有任何反应。
谢谢!
根据 Apple 开发文档,'scene' 需要为 'view' 出示。
试试这个。 :)
@IBAction func playButtonTapped(_ sender: Any) {
if let view = self.view as? SKView {
let scene = GameScene(size: view.bounds.size)
scene.scaleMode = .aspectFill
view.ignoresSiblingOrder = true
view.showsFPS = false
view.showsNodeCount = false
view.showsPhysics = false
// Add this code
view.presentScene(scene)
}
}
https://developer.apple.com/documentation/spritekit/skview/1519705-presentscene
我想我可能已经找到了解决方案——我没有直接从 MenuViewController
显示 GameScene
,而是在按下 playButton
时转换到GameViewController
然后从那里呈现 GameScene
。
我不知道为什么它在 MenuViewController
中不起作用,但这种方法有效。
在你的GameViewController中class改变
if let scene = SKScene(fileNamed: "GameScene")
至
if let scene = GameScene(fileNamed: "GameScene")
我正在用 SpriteKit 创建这个游戏。
首次启动时,GameViewController
会显示另一个名为 MenuViewController
的 ViewController,并与故事板链接。
在 MenuViewController
中有一个播放按钮,它将呈现一个名为 GameScene
的 SKScene。
我想出了如何从 GameViewController
显示 MenuViewController
,但我找不到在点击播放按钮时显示 GameScene
的方法。
在我的代码中,当点击按钮时,实际上什么也没有发生。
GameViewController
:
import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
let storyBoard: UIStoryboard = UIStoryboard(name: "MenuViewController", bundle: nil)
let vc = storyBoard.instantiateViewController(withIdentifier: "MenuViewController") as! MenuViewController
self.present(vc, animated: true, completion: nil)
}
}
并且在 MenuViewController
:
import UIKit
import SpriteKit
class MenuViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func playButtonTapped(_ sender: Any) {
if let view = self.view as! SKView? {
let scene = GameScene(size: view.bounds.size)
scene.scaleMode = .aspectFill
view.presentScene(scene)
view.ignoresSiblingOrder = true
view.showsFPS = false
view.showsNodeCount = false
view.showsPhysics = false
}
}
}
另外,我在控制台中打印了这个警告:
SKView: ignoreRenderSyncInLayoutSubviews is NO. Call _renderSynchronouslyForTime without handler
不知道有没有关系...
我确实将 MenuViewController
的故事板的视图设置为与 SKView 相同。
我找不到任何方法让 GameScene
出现。没有任何反应。
谢谢!
根据 Apple 开发文档,'scene' 需要为 'view' 出示。 试试这个。 :)
@IBAction func playButtonTapped(_ sender: Any) {
if let view = self.view as? SKView {
let scene = GameScene(size: view.bounds.size)
scene.scaleMode = .aspectFill
view.ignoresSiblingOrder = true
view.showsFPS = false
view.showsNodeCount = false
view.showsPhysics = false
// Add this code
view.presentScene(scene)
}
}
https://developer.apple.com/documentation/spritekit/skview/1519705-presentscene
我想我可能已经找到了解决方案——我没有直接从 MenuViewController
显示 GameScene
,而是在按下 playButton
时转换到GameViewController
然后从那里呈现 GameScene
。
我不知道为什么它在 MenuViewController
中不起作用,但这种方法有效。
在你的GameViewController中class改变
if let scene = SKScene(fileNamed: "GameScene")
至
if let scene = GameScene(fileNamed: "GameScene")