使用SKSprit在GameScene和GameViewController之间调用函数



所以我用swift编写了一个程序,并且很难理解GameScene和GameViewController:之间的正确通信

基本上,我有"保存文件",当使用函数"加载时,它们是plist;self.loadFromPlist(文件名:(";通过清除先前的节点数组来加载,并根据加载的Plist 的字典元素中的属性绘制一组SKShapeNodes

我需要一个文件浏览器,它是我从Cocoapod(FileBrowser(实现的,必须在";GameViewController";

我的问题是:

当像这样从"viewDidLoad"内部调用我的"loadFromPlist"函数时(初始化项目(-该函数起作用,并绘制游戏场景:

override func viewDidLoad() {
super.viewDidLoad()

if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let scene = SKScene(fileNamed: "GameScene") {
// Set the scale mode to scale to fit the window

scene.scaleMode = .aspectFill

// Present the scene
view.presentScene(scene)

let gameScene = scene as! GameScene

gameScene.loadFromPlist(scoreFileName: gameScene.defaultScore)
gameScene.gameViewControllerDelegate = self
}
view.ignoresSiblingOrder = true
view.showsFPS = true
view.showsNodeCount = true
}
}

当我试图在GameViewController中的自己的函数中做同样的事情时(在GamScene中称为view a GameviewDelete(,代码会执行这一行,我可以用调试器将其转到游戏场景中的"loadFromPlist"函数中,它会执行for循环绘制形状等,但它什么也不做。

func callloadplist() {

var loadedfilename2:String!

let file = FileBrowser()
present(file, animated: true, completion: nil)

if let scene = GameScene(size: view.frame.size) as? GameScene {
var strippedfilename: String?
file.didSelectFile = { (file: FBFile) -> Void in
let loadedfilename = file.displayName
scene.filebrowserselectedfilename = loadedfilename
if let view = self.view as! SKView? {
// Load the SKScene from 'GameScene.sks'
if let myskscene = SKScene(fileNamed: "GameScene") {
// Set the scale mode to scale to fit the window
let gameScene = myskscene as! GameScene
let strippedfilename = String(loadedfilename.dropLast(6))
print(strippedfilename)

gameScene.loadFromPlist(scoreFileName: "output")
}
}
}
}
}

因此,函数调用在"viewDidLoad(("内部工作,在GameScene.swift中也作为"self.loadFromPlist(fileName:("工作,但不能从我在GameViewControllers中创建的自定义方法/函数中调用——有什么见解吗?

感谢

因此file.didSelectFile正在设置一个闭包以响应所选文件的事件。然后在"GameScene"对象的另一个实例上运行调用的函数。

我能够完善我的问题并在这里回答:

Swift-SKSprite工具包-从文件浏览器关闭更改游戏场景变量

最新更新