2016-03-22 5 views
0

Hier ist eine vereinfachte Szenekit-Standardszene mit dem Schiff. Tippe auf das Schiff, lass es los und das Schiff dreht sich. Wie änderst du das Programm, sodass die Aktion beginnt, wenn du auf das Schiff tippst? Keine Sorge, den Hahn zu lösen oder zu halten.Wie wird beim Antippen von Objekten eine Aktion ausgeführt, anstatt das Tippen zu beenden?

class GameViewController: UIViewController { 

override func viewDidLoad() { super.viewDidLoad() 

    let scene = SCNScene(named: "art.scnassets/ship.scn")! 

    let cameraNode = SCNNode() 
    cameraNode.camera = SCNCamera() 
    scene.rootNode.addChildNode(cameraNode) 
    cameraNode.position = SCNVector3(x: 0, y: 0, z: 15) 
    let lightNode = SCNNode() 
    lightNode.light = SCNLight() 
    lightNode.light!.type = SCNLightTypeOmni 
    lightNode.position = SCNVector3(x: 0, y: 10, z: 10) 
    scene.rootNode.addChildNode(lightNode) 
    let ambientLightNode = SCNNode() 
    ambientLightNode.light = SCNLight() 
    ambientLightNode.light!.type = SCNLightTypeAmbient 
    ambientLightNode.light!.color = UIColor.darkGrayColor() 
    scene.rootNode.addChildNode(ambientLightNode) 
    let scnView = self.view as! SCNView 
    scnView.scene = scene 
    scnView.allowsCameraControl = true 
    scnView.showsStatistics = true 
    scnView.backgroundColor = UIColor.blackColor() 
    let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:") 
    scnView.addGestureRecognizer(tapGesture) 

} 

func handleTap(gestureRecognize: UIGestureRecognizer) { 
    let scnView = self.view as! SCNView 

    // the ship 
    let ship = scnView.scene!.rootNode.childNodeWithName("ship", recursively: true)! 

    // the action 
    let rotateY = SCNAction.repeatActionForever(SCNAction.rotateByX(0, y: 2, z: 0, duration: 1)) 

    let point = gestureRecognize.locationInView(scnView) 
    let hitResults = scnView.hitTest(point, options: nil) 
    if hitResults.count > 0 { 
     let result: AnyObject! = hitResults[0] 

     // the call 
     if result.node!.name!.hasPrefix("ship") { 
      ship.runAction(rotateY) 
     } 
    } 
} 

override func shouldAutorotate() -> Bool { return true } 
override func prefersStatusBarHidden() -> Bool { return true } 
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone { return .AllButUpsideDown } 
    else { return .All } 
} 
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } 
} 
+0

Es mir nicht klar ist, was Sie fordern. Was ist das Ergebnis der Ausführung dieses Codes und wie unterscheidet er sich von dem, was Sie wollen? –

+0

Dieser Code ruft derzeit die Aktion auf, wenn der Tap vom Objekt (dem Schiff) losgelassen wird. Ich würde gerne wissen, wie man die Aktion aufruft, wenn der Tap ausgelöst wird. – swl

+0

können Sie verweisen [UITapGestureRecognizer - machen Sie es auf Touch-Down, nicht zu verbessern] (http://stackoverflow.com/questions/15628133/uitapgesure_recognizer-make-it-work-on-touch-down-not-touch-up) um deine Geste zu gestalten und sie zu benutzen. – chancyWu

Antwort

0

Ein Gestenerkenner erkennt eine ganze Geste. Für einen Tipp, der passiert, wenn die Berührung beginnt und Berührung Ende Ereignisse in unmittelbarer Nähe passieren. Der integrierte Erkenner wird nur ausgelöst, sobald die "Tippgeste" abgeschlossen ist und beide Ereignisse abgeschlossen sind.

Wenn Sie ein unterschiedliches Verhalten auf dem Touch Begin oder Touch End haben möchten, müssen Sie die Low-Level-Ereignisse selbst behandeln. Dazu können Sie entweder erstellen Sie Ihre eigenen, benutzerdefinierten UIGestureRecognizer oder Sie können eine benutzerdefinierte UIView erstellen und die Methoden in UIResponder wie touchesBegan(_:withEvent:)

Please see the Event Handling Guide for iOS

+0

Danke für Ihre Hilfe Scott und chancyWu. – swl