2015-03-17 16 views
6

mam UITapGestureRecognizer i UIPanGestureRecognizer na UIView z SKScene na nim. Wykrywacz gestów przesuwania przesuwa SKNode od lewej do prawej i chcę, aby wykrywacz gestów do wykrywania wykrył potomek SKNode, który patrzy. Przesuwanie działa dobrze, ale mam problem z wykrywaniem kliknięć - Gest dotknięcia wywołuje odpowiednią metodę, ale nie jestem pewien, jak przekonwertować współrzędne z widoku do sceny na węzeł, aby wykryć, czy kran jest w jednym z węzły dzieci.UITapGestureRecognizer na SKNode: Konwersja współrzędnych z UIView do SKNode

UIView (z gestami) → SKScene → Przesuwanie węzłów → Dzieci z panoramowanie węzeł

Jak mogę sprawdzić, czy dotykowy kranu gest za koordynowanie jest dana 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); 

     } 
    } 
} 

}

Odpowiedz

6

W końcu muszę zrobić kilka więcej kroki od tego, co zasugerowano - przejście z SKView → SKScene, a następnie do SKNode, który zawierał węzły, które przeszły testowanie.

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

Nie używałem SceneKit wcześniej, ale z docs wygląda na to trzeba użyć metody SKView convertPoint:toScene: przekonwertować tap gest Rozpoznawania za koordynuje z widokiem współrzędnych na współrzędne sceny. Następnie musisz przetestować węzły w scenie, aby dowiedzieć się, który węzeł został dotknięty.

4

Należy przekształcić View współrzędnych sceny Współrzędne użyciu convertPointFromView:

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

Następnie można wykryć których etykieta węzeł był na podsłuchu, stosując

for (SKLabelNode *node in self.children) { 

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

} 
Powiązane problemy