UITapGestureRecognizer on SKNode: Converting Coordinates from UIView to SKNode

glenstorey

I have a UITapGestureRecognizer and a UIPanGestureRecognizer on a UIView with a SKScene on it. The pan gesture recogniser moves a SKNode left to right, and I want the Tap gesture recogniser to detect a child of the SKNode that pans. Panning works fine, but I'm having trouble detecting taps - the Tap Gesture fires the relevant method, but I'm not sure how to convert the coordinates from the view to the scene to the node to detect if the tap is in one of the children nodes.

UIView (with gestures) → SKScene → Panning node → Children of panning node

How do I check a whether a tap gesture's touch coordinate is any given 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);

        }
    }
}

}

glenstorey

In the end I needed to do a couple more steps from what were suggested - converting from the SKView → SKScene and then to the SKNode which contained the nodes I was hit testing.

    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];

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related