2017-07-12 11 views
0

誰かがボックスをタップして消滅させるゲームを作成しようとしています。私の問題は、ゲームを再起動して、以前隠された/削除されたすべてのボックスを再追加することです。シーンキット(Swift):非表示/削除されたノードを再表示または再追加

私はそうのようなボックスの行を作成します。私は、x、yおよびコースのZの位置を更新

func addBoxes() { 

    for _ in 0..<5 { 

     let sphereGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0) 
     let sphereNode: SCNNode! = SCNNode(geometry: sphereGeometry) 
     sphereNode.position = SCNVector3(x: x, y: y, z: z) 

     scnScene.rootNode.addChildNode(sphereNode) 
} 

た後。

このすべてが美しく動作しますが、私はそうのようなタップボックスを非表示:すべてのボックスをタップし、隠された後

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    let touch = touches.first! 
    let location = touch.location(in: scnView) 
    let hitResults = scnView.hitTest(location, options: nil) 

    if let result = hitResults.first { 

     let node = result.node 
     node.isHidden = true 
    } 
} 

、ゲームは単に今のリセットので、すべてのボックスを再表示する必要があります

func newGame() { 

    // I've tried this and various versions of it, with no success 
    for child in scnScene.rootNode.childNodes { 

     child.isHidden = false 
    } 
} 

しかし、これは私を与える:

fatal error: unexpectedly found nil while unwrapping an Optional value 

私もchild.removeFromParentNode()と目を試してみましたシーンにノードを再追加しようとしましたが、これは同じエラーをスローします。

誰でも正しい方向に向けることができますか? forループで作成された1つまたはすべてのノードの表示を解除するにはどうすればよいですか?

+0

例外ブレークポイントを追加して、クラッシュする正確な行を取得できますか?あなたのコードにはオプションが全く表示されません。あるいは、 'scnScene'が' SCNScene! 'と宣言されていますか? – orangenkopf

+0

@ orangenkopf:はい、そうです。 'scnScene.rootNode.addChildNode(sphereNode)'でクラッシュします。 – Harold

+0

'SCNNode(geometry:)'はオプションではないので、型 'SCNNode'を削除してコンパイラにタイプを推論させます。しかし、あなたの問題は隠れ/隠れとは関係ありません。むしろ、ノードをノードに追加しようとするとシーンが作成されていない可能性があります。 – orangenkopf

答えて

2

非表示と非表示解除は次のように正常に動作します:

var targetsToDo: Int = 0 
let maximumNumberOfTargets = 5 

func loadGame() { 
    targetsToDo = maximumNumberOfTargets 

    scnScene = SCNScene() 
    scnView.scene = scnScene 

    for i in 1...maximumNumberOfTargets { 
     let box = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.1) 
     let node = SCNNode(geometry: box) 
     node.name = "Box \(i)" 
     scnScene.rootNode.addChildNode(node) 
     node.position = getRandomPosition() 
    } 
} 

@objc func handleTouch(recognizer: UITapGestureRecognizer) { 
    let point = recognizer.location(in: view) 
    print("Touch at \(NSStringFromCGPoint(point))") 
    if let node = scnView.hitTest(point).first?.node { 
     print(node.name ?? "") 
     node.isHidden = true 
     targetsToDo -= 1 

     if targetsToDo == 0 { 
      resetGame() 
     } 
    } 
} 

func resetGame() { 
    targetsToDo = maximumNumberOfTargets 

    for child in scnScene.rootNode.childNodes { 
     child.isHidden = false 
     child.position = getRandomPosition() 
    } 
} 

完了し、作業遊び場

hereを見つけることができます。

関連する問題