2016-11-26 11 views
1

私は同じクラスのMovableBlockという3つのノードlineBlockを持っています。誰かが画面に触れているlineBlockノードを回転させたいです。UIRotationRecognizer(SpriteKit + Swift 3.0)内のタッチされたノードを見つける方法

私はtouchedMovedに正しいlineBlockノードを移動するため、これを解決してきました:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     touch = touches.first! 
     positionInScene = self.touch?.location(in: self) 
     let previousPosition = self.touch?.previousLocation(in: self) 
     let translation = CGVector(dx: (positionInScene?.x)! - (previousPosition?.x)!, dy: (positionInScene?.y)! - (previousPosition?.y)!) 

     if touchedNode?.name?.contains("LineBlock") == true { 
       (touchedNode as! MovableBlock).selected = true 
       (touchedNode as! MovableBlock).parent!.parent!.run(SKAction.move(by: translation, duration: 0.0)) 
     } 
    } 

しかし、私は私のUIRotationRecognizer関数内で同じことを行うことができませんでした。私の回転機能では、それは単純にかかわらず、最初のノードを回転させるのlineBlock(クラスMovableBlockの)私は感動しています:参考

func rotate(_ sender: UIRotationGestureRecognizer){ 
     if lineBlock.selected == true { 
       lineBlock.run(SKAction.rotate(byAngle: (-(self.rotationRecognizer?.rotation)!*2), duration: 0.0)) 
       rotationRecognizer?.rotation = 0 
     } 
    } 

、ここで私は(touchBeganで)touchedNodeの定義方法は次のとおりです。

touches: Set<UITouch>, with event: UIEvent?) { 
    touch = touches.first! 
    positionInScene = self.touch?.location(in: self) 
    touchedNode = self.atPoint(positionInScene!) 
+0

はtouchedNodeを使用したいが、touchedNodeはtouchBeganまたはtouchMovedの外側ではnilになる – nicolime

答えて

1

UIGestureRecognizerは、location(in:UIView)メソッドを持っています。 self.view?.convert(sender.location(in: self.view), to: self)を使用してUIRotationGestureRecognizerの場所を取得し、touchesBeganの場合と同様のロジックを使用できます。

convert(_:to:)は、ポイントがシーンの座標空間内にあることを確認します。

関連する問題