2017-11-25 14 views
1

最初のシーンとして2つのボタンを含むメニューを提示しようとしています。playcreditsplayをクリックすると、tutorialeasyhardbackという別のメニューシーンを表示したいと考えています。
単にSKSpriteNodeオブジェクトとしてボタンを作成し、touchesBeganのクリックを処理することです。

私のmenuScene.sksファイルでは、私は適切にノードを配置して名前を付けました。SpriteKit:アンラッピング中に予期せぬ結果が発生し、複数のメニューシーンを実装できない

import SpriteKit 

class menuScene: SKScene { 

var playButton:SKSpriteNode! 
var creditsButton:SKSpriteNode! 

override func didMove(to view: SKView) { 
    playButton = self.childNode(withName: "playButton") as! SKSpriteNode 
    creditsButton = self.childNode(withName: "creditsButton") as! SKSpriteNode 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    // transition is defined in Helper.swift 
    let touch = touches.first 

    if let location = touch?.location(in: self){ 

     let nodesArray = self.nodes(at: location) 

     if nodesArray.first?.name == "playButton" { 
      let nextScene = difScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } else if nodesArray.first?.name == "creditsButton" { 
      let nextScene = creditsScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } 
    } 
    } 
} 

私は実行し、menuSceneは問題なく表示される:ここで、あなたはこのシーンにリンクされているmenuScene.swiftファイルを確認することができます。しかし、私がplayボタンをタッチするとエラーが発生し、次のシーンからです:difScene。 は、ここでは、difScene.swiftを見つけることができます:

import SpriteKit 

class difScene: SKScene { 

var tutButton:SKSpriteNode! 
var easyButton:SKSpriteNode! 
var hardButton:SKSpriteNode! 
var backButton:SKSpriteNode! 

override func didMove(to view: SKView) { 
    tutButton = self.childNode(withName: "tutButton") as! SKSpriteNode // error 
    easyButton = self.childNode(withName: "easyButton") as! SKSpriteNode 
    hardButton = self.childNode(withName: "hardButton") as! SKSpriteNode 
    backButton = self.childNode(withName: "backButton") as! SKSpriteNode 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    let transition = SKTransition.push(with: .down, duration: 0.2) 
    let touch = touches.first 

    if let location = touch?.location(in: self){ 

     let nodesArray = self.nodes(at: location) 
     if nodesArray.first?.name == "tutButton" { 

      let nextScene = GameScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } 

     if nodesArray.first?.name == "easyButton" { 
      let nextScene = difScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } 

     if nodesArray.first?.name == "hardButton" { 
      let nextScene = difScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } 

     if nodesArray.first?.name == "backButton" { 
      let nextScene = menuScene(size: self.size) 
      self.view?.presentScene(nextScene, transition: transition) 
     } 
    } 
    } 
} 

それが有用である可能性がある場合には、ここに私のGameViewController.swiftです:

import UIKit 
import SpriteKit 
import GameplayKit 

class GameViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

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

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

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

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

       view.ignoresSiblingOrder = true 

       view.showsFPS = false 
       view.showsNodeCount = false 
      } 
     } 
    } 
} 

override var shouldAutorotate: Bool { 
    return true 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    if UIDevice.current.userInterfaceIdiom == .phone { 
     return .allButUpsideDown 
    } else { 
     return .all 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Release any cached data, images, etc that aren't in use. 
} 

override var prefersStatusBarHidden: Bool { 
    return true 
    } 
} 

私が手にエラーがある:私はこれがある

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

知っています一意のエラーではありません。私はGoogleでチュートリアルを見て、他のStackOverflowスレッドから解決策を導き出そうとしましたが、これを克服できませんでした。名前「tutButton」とは、子ノードがそうエラーが発生SKSpriteNodeにキャスト強制、存在しないため

答えて

1

エラーは、このライン

tutButton = self.childNode(withName: "tutButton") as! SKSpriteNode // error 

です。

let nextScene = difScene(size: self.size) 
self.view?.presentScene(nextScene, transition: transition) 

これは新しいdifSceneを初期化し、それを提示し、順番にクラッシュされた上記のコードの行を呼び出す:再生ボタンを押すと

は、あなたがこのコードを呼び出します。

didMoveに参照する4つのボタンを追加するdifSceneに対応するsksファイルがありますか。

もしそうなら、あなたはあなたのメニューシーンのために行ったようsksファイルでdifSceneを初期化する必要があります:

let scene = GKScene(fileNamed: "difScene") 

ない場合は、これら4つのボタンノードを作成する必要があり、それらを追加しますあなたのシーンへの子供たちとしてプログラム的に。


サイドノート:スウィフトで、大会は大文字で始まる種類に名前を付けることです。 menuSceneMenuSceneで、difSceneDifSceneである必要があります。これにより、他の人があなたのコードを読んで理解しやすくなります。

+0

申し訳ありませんが、私のJava日から習慣です...対応するdifScene.sksファイルがあり、すべてのボタンが配置されています。 GameViewControllerでdifSceneをどこで初期化すればよいですか? –

+1

@CevatMertDökümcü現在の場所( 'let nextScene = difScene(size:self.size)')と同じ場所で初期化することができますが、 'size'ではなく' fileNamed'を使ってイニシャライザを呼び出す必要があります。 – nathan

+0

ああ、初期化後にサイズを変更するにはどうすればよいですか?私は "nextScene?.size = self.size"を使用しようとしましたが、動作しませんでした。私は現在、difSceneに成功していますが、意図したよりも大きいです。 –

関連する問題