2015-03-17 8 views
6

Ich habe ein UITapGestureRecognizer und ein UIPanGestureRecognizer auf einem UIView mit einem SKScene darauf. Der Pan-Gesten-Erkenner bewegt einen SKNode von links nach rechts, und ich möchte, dass der Tap-Gesten-Erkenner ein Kind des SKNode erkennt, der schwenkt. Das Schwenken funktioniert einwandfrei, aber ich habe Probleme, Taps zu erkennen - die Tap-Geste löst die entsprechende Methode aus, aber ich bin mir nicht sicher, wie die Koordinaten von der Ansicht in die Szene zum Knoten konvertiert werden, um zu erkennen, ob der Tap in einem von ist die Kinderknoten.UITapGestureRecognizer auf SKNode: Konvertieren von Koordinaten von UIView SKNode

UIView (mit Gesten) → SKScene → → Knoten Schwenk Kinder des Knotens Panning

Wie kann ich überprüfen, ob eine die Berührung eines Tippgeste Koordinate jedes gegebene SKNode?

-(void)tapAction:(UITapGestureRecognizer*)sender{ 
if (sender.state == UIGestureRecognizerStateEnded) 
{ 
    // handling code 
    CGPoint touchLocation = [sender locationOfTouch:0 inView:sender.view]; 
    NSLog(@"TAP %@", NSStringFromCGPoint(touchLocation) 
     ); 
    for (SKLabelNode *node in _containerNode.children) { 

     if ([node containsPoint:[node convertPoint:touchLocation fromNode:self.parent]]) { 
      //This is where I want the tap to be detected. 
     } 

     CGPoint checkPoint = [node convertPoint:touchLocation fromNode:self.scene]; 
     NSLog(@"CheckPoint %@", NSStringFromCGPoint(checkPoint) 
      ); 
     //NSLog(@"iterating nodes"); 
     if ([node containsPoint:checkPoint]) { 
      NSLog(@"touch match %@", node); 

     } 
    } 
} 

}

Antwort

6

Am Ende brauchte ich ein paar mehr zu tun Schritte von dem, was vorgeschlagen wurde - Umwandlung von SKView → SKScene und dann zum SKNode, der die Knoten enthielt, die ich beim Testen getroffen hatte.

CGPoint touchLocation   = [sender locationOfTouch:0 inView:sender.view]; 
    CGPoint touchLocationInScene = [[self.scene view] convertPoint:touchLocation toScene:self.scene]; 
    CGPoint touchLocationInNode  = [self.scene convertPoint:touchLocationInScene toNode:_containerNode]; 
3

Ich habe bisher noch nicht verwendet SceneKit, sondern von dem docs sieht es aus wie Sie die SKView Methode verwenden, müssen convertPoint:toScene: die Gestenerkenner des Tap-Koordinaten aus dem Blickfeld zu konvertieren Koordinaten in Szene Koordinaten. Sie müssen dann die Knoten in Ihrer Szene testen, um herauszufinden, welcher Knoten angezapft wurde.

4

Sie sollten die Ansicht konvertieren Koordinaten in Szene Koordinaten convertPointFromView: mit

CGPoint touchLocationInView = [sender locationOfTouch:0 inView:sender.view]; 
CGPoint touchLocationInScene = [self convertPointFromView:touchLocationInView]; 

Dann können Sie mit denen Etikettenknoten erfassen wurde angezapft,

for (SKLabelNode *node in self.children) { 

    if ([node containsPoint:touchLocationInScene]) { 
     //This is where I want the tap to be detected. 
    } 

} 
Verwandte Themen