2016-03-22 7 views
0

ここでは、シンプルなシーンキットのデフォルトシーンを船で表示しています。船、リリース、船のスピンをタップします。あなたは船をタップするとアクションが始まるようにプログラムをどのように修正しますか?タップを離したり保持したりする心配はありません。タップを離すのではなく、タップするオブジェクトでアクションを実行するにはどうすればよいですか?

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

でカスタムUIViewのを作成して、メソッドを使用できます。これを行うにはあなたが求めているものを私に明確ではありません。このコードを実行した結果は何ですか?また、実行するコードとはどのように違うのですか? –

+0

このコードは現在、タップがオブジェクト(船)から解放されたときにアクションを呼び出します。タップが開始されたときにアクションを呼び出す方法を知りたい。 – swl

+0

あなたは[UITapGestureRecognizer - タッチダウン、タッチアップしないようにする]を参照することができます(http://stackoverflow.com/questions/15628133/uitapgesturerecognizer-make-it-work-on-touch-down-not-touch-up )あなたのジェスチャーをカスタマイズして使用することができます。 – chancyWu

答えて

0

ジェスチャ認識プログラムは、ジェスチャ全体を認識します。タッチが始まり、タッチ終了イベントが近接して発生したときに発生するタップについては、内蔵の認識装置は、「タップジェスチャー」が完了し、両方のイベントが完了した後にのみ起動します。

Touch BeginまたはTouch Endで異なる動作が必要な場合は、低レベルのイベントを自分で処理する必要があります。あなた自身、カスタムUIGestureRecognizerを作成するか、またはあなたがUIResponder

touchesBegan(_:withEvent:)よう Please see the Event Handling Guide for iOS

+0

あなたの助けに感謝スコットとchancyWu。 – swl

関連する問題