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()
}
}
}
}
}
- это ваш «сатурн» узел с геометрией? Что означает «результат»? – mnuages
Hi mnuages! Да, узел «сатурн» содержит всю геометрию, используемую для создания объекта сатурна. Я согласился, что может быть только один SCNScene. И нам разрешено добавлять и удалять узлы в одну сцену. Или может быть более одной сцены, и пользователь может нажать узел в одной сцене, чтобы перевернуть на другую сцену и наоборот. – swl
проблема может заключаться в том, что у вас будет несколько распознавателей жестов нажатия ('gestureRecognizers.addObjectsFromArray (existingGestureRecognizers)'). Когда вы загружаете сцену планеты, все же возможно, что это первый распознаватель, который будет запущен (и, таким образом, снова сгенерирует сцену планеты) – mnuages