我需要将多个变量从 GameViewController 传递到 GameScene。
游戏 View Controller :
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene(size: view.frame.size) as GameScene? {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
skView.showsPhysics = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
// pass game set-up variables
scene.idDefence = idDefence
scene.idAttack = idAttack
scene.tries = tries
scene.runs = runs
scene.teamShirt = teamShirt
skView.presentScene(scene)
}
}
GameScene - 具有上面列出的变量(idDefence)等。
class GameScene: SKScene, SKPhysicsContactDelegate {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
// variables - set-up defenders
var idDefence = 0
...
这符合要求,但 idDefence 变量(从 GameViewController 正确打印为数字)不会传递到事件的 GameScene 并保持为 0。GameScene 代码:
override init(size: CGSize) {
super.init(size: size)
physicsWorld.gravity = CGVectorMake(0.0, 0.0)
physicsWorld.contactDelegate = self
getDefenceInfo()
getAttackInfo()
loadLevel()
spawnPlayers()
spawnDefenders()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// get attack variables from database
func getDefenceInfo(){
println("defence ID: \(idDefence)")
}
非常感谢任何帮助
最佳答案
您正在 init(size:)
初始化程序中检查这些属性的值;线上调用:
if let scene = GameScene(size: view.frame.size) as? GameScene {
...
}
此时,来自 GameViewController 的设置属性值的代码尚未运行;因此它们仍然有默认值。
如果您检查 GameScene
的 didMoveToView
方法中的属性值,您将看到它们都有正确的值,因为 didMoveToView
code> 将在 skView.presentScene(scene)
之后调用。
关于ios - Swift:从 GameViewController 设置 GameScene 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257711/