2017-04-05 81 views
1

我有一個相當特殊的問題。我曾經使用默認代碼從視圖控制器呈現我的遊戲場景。但是我加了另一個SKScene,並從使用此代碼我現在提出我的遊戲場景:從另一個SKScene展示的SKScene無法從SKS文件加載

//In an SKScene (not Game scene) 
let scene = GameScene() 
let skView = self.view! 
skView.ignoresSiblingOrder = true 
scene.scaleMode = .aspectFit 
let push = SKTransition.push(with: SKTransitionDirection.right, duration: 0.4) 
skView.presentScene(scene, transition: push) 

我的問題是,我的遊戲場景似乎不再認識我的SKS文件,當我運行的代碼行:

//in gamescene 
sprite = self.childNode(withName: "sprite") as! SKLabelNode 

展開時沒有找到任何東西。 當我使用的代碼介紹我SKScene從GameViewController:

if let scene = GKScene(fileNamed: "GameScene") { 

     // Get the SKScene from the loaded GKScene 
     if let sceneNode = scene.rootNode as! GameScene? { 

      // Copy gameplay related content over to the scene 
      sceneNode.entities = scene.entities 
      sceneNode.graphs = scene.graphs 

      // Set the scale mode to scale to fit the window 
      sceneNode.scaleMode = .aspectFit 

      // Present the scene 
      if let view = self.view as! SKView? { 
       view.presentScene(sceneNode) 

       view.ignoresSiblingOrder = true 
      } 
     } 
    } 

一切正常。我究竟做錯了什麼?提前致謝。

+0

需要更多的上下文才能瞭解正在發生的事情。看起來你正在用'UIViewController'編寫這段代碼(這是否正確?)如果是這樣的話。當你寫'self.childNode()...'不會自引用一個'UIViewController'?不應該是'scene.childNode()'?你怎麼在第一個地方添加子節點? – Acoop

+0

@Acoop我更新了我的問題。感謝評論,如果您需要更多信息,請詢問。 – joshLor

+0

謝謝。你如何實例化精靈開始?爲什麼你在第一個內創建第二個'SKView',然後替換'view'? – Acoop

回答

1

我認爲當你從SKScene而不是從UIViewController出現時,它崩潰的原因是由於2個原因。

  1. 您正在創建2個不同的類,可能會有不同的代碼。當您從SKScene中提供時,將創建一個GameScene類型的對象,但是當您從UIViewController中提供時,將創建一個GKScene類型的對象。
  2. 當您創建GameScene類型的對象時,您使用的初始值設定項不考慮附加的SKS文件。但是,當你創建GKScene類型的對象時,你會這樣做。

因此,我會編輯的代碼的第一個塊爲:

//In an SKScene (not Game scene) 
if let sceneContainer = GKScene(fileNamed: "GameScene") { 
    let skView = self.view! 
    skView.ignoresSiblingOrder = true 
    //Something comparable to the following line. I don't have a project set up, but let the compiler run you through the exact syntax. 
    let scene = sceneContainer.rootNode as! GameScene? 
    scene?.scaleMode = .aspectFit 
    let push = SKTransition.push(with: SKTransitionDirection.right, duration: 0.4) 
    skView.presentScene(scene!, transition: push) 
} 

的文檔用於獲取從所述GKSceneSKScene可以發現here