UITapGestureRecognizer на SKNode: преобразование координат из UIView в SKNode

У меня есть UITapGestureRecognizer и UIPanGestureRecognizer на UIView с SKScene на нем. Распознаватель жестов панорамирования перемещает SKNode слева направо, и я хочу, чтобы распознаватель жестов Tap обнаруживал дочерний элемент SKNode, который перемещается. Панорамирование работает нормально, но у меня проблемы с обнаружением касаний — жест касания запускает соответствующий метод, но я не уверен, как преобразовать координаты из вида в сцену в узел, чтобы определить, находится ли касание в одном из дочерние узлы.

UIView (с жестами) → SKScene → узел панорамирования → потомки узла панорамирования

Как проверить, является ли координата касания жеста касания каким-либо заданным 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);

        }
    }
}

}


person glenstorey    schedule 17.03.2015    source источник


Ответы (3)


В конце концов, мне нужно было сделать еще пару шагов из того, что было предложено — преобразование из SKView → SKScene, а затем в SKNode, который содержал узлы, которые я тестировал.

    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];
person glenstorey    schedule 18.03.2015

Вы должны преобразовать координаты вида в координаты сцены, используя convertPointFromView:

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

Затем вы можете определить, какой узел метки был нажат, используя

for (SKLabelNode *node in self.children) {

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

}
person rakeshbs    schedule 18.03.2015

Я раньше не использовал SceneKit, но из документов видно, что вам нужно использовать метод SKView convertPoint:toScene: для преобразования координат касания распознавателя жестов из координат вида в координаты сцены. Затем вам нужно проверить узлы в вашей сцене, чтобы выяснить, какой узел был задействован.

person Duncan C    schedule 17.03.2015