2015-02-21 3 views
0

Вот немного модифицированный проект SceneKit стартера - я добавил еще один файл .dae с именем planet.dae. Нажмите «корабль», чтобы перейти на планету. Коснитесь планеты, чтобы переключиться обратно на корабль. Нажатие на корабль открывает планету. Но когда пользователь ударяет по планете, ничего не происходит - похоже, я не признаю свое прикосновение. Что дает?Как вы переключаетесь между даэ-сценами?

import SceneKit 
class GameViewController: UIViewController { 

override func viewDidLoad() { super.viewDidLoad() 
    shipScene() 
} 

func shipScene() { 
    let scene = SCNScene(named: "art.scnassets/ship.dae")! 
    let ship = scene.rootNode.childNodeWithName("ship", recursively: true)! 
    let scnView = self.view as SCNView 
    scnView.scene = scene 
    scnView.autoenablesDefaultLighting = true 
    scnView.allowsCameraControl = true 
    scnView.backgroundColor = UIColor.blackColor() 

    let tapGesture = UITapGestureRecognizer(target: self, action: "handleShipTap:") 
    let gestureRecognizers = NSMutableArray() 
    gestureRecognizers.addObject(tapGesture) 
    if let existingGestureRecognizers = scnView.gestureRecognizers { 
     gestureRecognizers.addObjectsFromArray(existingGestureRecognizers) 
    } 
    scnView.gestureRecognizers = gestureRecognizers 
} 

func handleShipTap(gestureRecognize: UIGestureRecognizer) { 
    let scnView = self.view as SCNView 
    let p = gestureRecognize.locationInView(scnView) 
    if let hitResults = scnView.hitTest(p, options: nil) { 
     if hitResults.count > 0 { 
      let result: AnyObject! = hitResults[0] 

      if result.node!.name!.hasPrefix("ship") { 
       planetScene() 
      } 
     } 
    } 
} 
func planetScene() { 
    let scene = SCNScene(named: "art.scnassets/saturn.dae")! 
    let ship = scene.rootNode.childNodeWithName("planet", recursively: true)! 
    let scnView = self.view as SCNView 
    scnView.scene = scene 
    scnView.autoenablesDefaultLighting = true 
    scnView.allowsCameraControl = true 
    scnView.backgroundColor = UIColor.blackColor() 

    let tapGesture = UITapGestureRecognizer(target: self, action: "handlePlanetTap:") 
    let gestureRecognizers = NSMutableArray() 
    gestureRecognizers.addObject(tapGesture) 
    if let existingGestureRecognizers = scnView.gestureRecognizers { 
     gestureRecognizers.addObjectsFromArray(existingGestureRecognizers) 
    } 
    scnView.gestureRecognizers = gestureRecognizers 
} 

func handlePlanetTap(gestureRecognize: UIGestureRecognizer) { 
    let scnView = self.view as SCNView 
    let p = gestureRecognize.locationInView(scnView) 
    if let hitResults = scnView.hitTest(p, options: nil) { 
     if hitResults.count > 0 { 
      let result: AnyObject! = hitResults[0] 

      if result.node!.name!.hasPrefix("saturn") { 
       shipScene() 
      } 
     } 
    } 
} 
} 
+0

- это ваш «сатурн» узел с геометрией? Что означает «результат»? – mnuages

+0

Hi mnuages! Да, узел «сатурн» содержит всю геометрию, используемую для создания объекта сатурна. Я согласился, что может быть только один SCNScene. И нам разрешено добавлять и удалять узлы в одну сцену. Или может быть более одной сцены, и пользователь может нажать узел в одной сцене, чтобы перевернуть на другую сцену и наоборот. – swl

+0

проблема может заключаться в том, что у вас будет несколько распознавателей жестов нажатия ('gestureRecognizers.addObjectsFromArray (existingGestureRecognizers)'). Когда вы загружаете сцену планеты, все же возможно, что это первый распознаватель, который будет запущен (и, таким образом, снова сгенерирует сцену планеты) – mnuages

ответ

0

Удаление TapGesture с планетыScene() - это все.

Смежные вопросы