Swift 从SKScene显示UIViewController时显示黑屏
这段代码旨在向用户展示Swift 从SKScene显示UIViewController时显示黑屏,swift,uiviewcontroller,sprite-kit,skscene,Swift,Uiviewcontroller,Sprite Kit,Skscene,这段代码旨在向用户展示UIViewController“菜单”,而是用一个黑屏向用户致意 let currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController! let mymenu = menu() currentViewController.present(mymenu, animated: true, completion: nil) 我正在从一个SKScene过渡到从另
UIViewController
“菜单”,而是用一个黑屏向用户致意
let currentViewController:UIViewController=UIApplication.shared.keyWindow!.rootViewController!
let mymenu = menu()
currentViewController.present(mymenu, animated: true, completion: nil)
我正在从一个
SKScene
过渡到从另一个SKScene
呈现一个SKScene
,例如,您应该执行以下操作:
let nextScene = MainScene(size: self.scene!.size)
self.scene?.view?.presentScene(nextScene, transition: SKTransition.doorway(withDuration: 1))
您不需要检索currentViewController
,因为您始终可以访问场景的视图
正如下面对注释所解释的,有多种方法可以调用实现到游戏viewController的函数,其中一种方法可以是创建代理/协议,如以下代码所示:
游戏场景示例:
import SpriteKit
protocol GameViewControllerDelegate: class {
func callMethod(inputProperty:String)
}
class GameScene: SKScene {
weak var gameViewControllerDelegate:GameViewControllerDelegate?
override func didMove(to view: SKView) {
gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
}
}
class GameViewController: UIViewController, GameViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
let gameScene = scene as! GameScene
gameScene.gameViewControllerDelegate = self
gameScene.scaleMode = .aspectFill
view.presentScene(gameScene)
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
func callMethod(inputProperty:String) {
print("inputProperty is: ",inputProperty)
}
}
游戏视图控制器示例:
import SpriteKit
protocol GameViewControllerDelegate: class {
func callMethod(inputProperty:String)
}
class GameScene: SKScene {
weak var gameViewControllerDelegate:GameViewControllerDelegate?
override func didMove(to view: SKView) {
gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
}
}
class GameViewController: UIViewController, GameViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
let gameScene = scene as! GameScene
gameScene.gameViewControllerDelegate = self
gameScene.scaleMode = .aspectFill
view.presentScene(gameScene)
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
func callMethod(inputProperty:String) {
print("inputProperty is: ",inputProperty)
}
}
输出:
import SpriteKit
protocol GameViewControllerDelegate: class {
func callMethod(inputProperty:String)
}
class GameScene: SKScene {
weak var gameViewControllerDelegate:GameViewControllerDelegate?
override func didMove(to view: SKView) {
gameViewControllerDelegate?.callMethod(inputProperty: "call game view controller method")
}
}
class GameViewController: UIViewController, GameViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
let gameScene = scene as! GameScene
gameScene.gameViewControllerDelegate = self
gameScene.scaleMode = .aspectFill
view.presentScene(gameScene)
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}
func callMethod(inputProperty:String) {
print("inputProperty is: ",inputProperty)
}
}
但我正在转换为视图,而不是SKScene。您应该区分UIKit
元素和Sprite kit
元素,特别是在游戏中使用时。您也没有视图,但有一个包含SKScene
的SKView
,因此无法“转换”到视图对不起,我不明白。我想在我的SKScene中调用一个函数,它将为播放器提供uiviewcontroller。啊,对了,这是另一个故事:-),无论如何,你可以在你的场景中提供播放器视图或任何其他UIKit
视图self.scene?.view?.addSubview()
好的,抱歉,谢谢,但是我如何为播放器提供uiviewcontroller?