SpriteKit Touches - containsPoint

时间:2014-01-28 16:23:31

标签: sprite-kit

我有一个问题,在我的触摸开始的方法中,我没有回到我认为我应该做的。

我正在测试特定节点内的命中。我尝试了几种方法,但没有一种方法可行。我已经创建了一个解决方法,但很想知道这是一个错误还是我做错了什么。

以下是代码:

标准触摸开始方法:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */
    SKSpriteNode *infoPanelNode = (SKSpriteNode *)[self childNodeWithName:@"infoPanelNode"];

    UITouch *touch = [touches anyObject];
    if(touch){
        //e.g.  infoPanelNode position:{508, 23} size:{446, 265.5}  (also of note - infoPanelNode is a child of self)

        //This solution works
        CGPoint location = [touch locationInNode:self];
        //location == (x=77, y=170)
        bool withinInfoPanelNode = [self myPtInNode:infoPanelNode inPoint:location];
        // withinInfoPanelNode == false  (CORRECT)

        //This one doesn't return the same result - returns true when hit is not in the cell
        CGPoint infoLocation = [touch locationInNode:infoPanelNode];
        //infoLocation == (x=-862, y=294)
        bool withinInfoPanelNodeBuiltInResult = [infoPanelNode containsPoint:infoLocation];
        // withinInfoPanelNodeBuiltInResult == true (WRONG)

// This one doesn't work either - returns an array with the infoPanelNode in it, even though the hit point and node location are the same shown above
//        NSArray *nodes = [self nodesAtPoint:location];
//        for (SKNode *node in nodes) {
//            if(node==infoPanelNode)
//                withinInfoPanelNode = true;
//        }
//   

        //Code omitted - doing something with the withinInfoPanelNode now
}

我的自定义点击测试代码:

-(bool) myPtInNode:(SKSpriteNode *)node inPoint:(CGPoint)inPoint {
    if(node.position.x < inPoint.x && (node.position.x+node.size.width) > inPoint.x){
        if(node.position.y < inPoint.y && (node.position.y+node.size.height) > inPoint.y){
            return true;
        }
    }
    return false;
}

任何人都能看到这里出了什么问题?

谢谢, 公斤

2 个答案:

答案 0 :(得分:2)

我不确定SKCropNode究竟是如何工作的,但一般来说,为了让containsPoint:检测其中的触摸,你需要给它一个相对于其节点的点。以下代码应该有效。请注意在调用.parent

时添加locationInNode:
CGPoint infoLocation = [touch locationInNode:infoPanelNode.parent];
BOOL withinInfoPanelNodeBuiltInResult = [infoPanelNode containsPoint:infoLocation];

答案 1 :(得分:1)

解决了这个问题并希望更新所有人。

事实证明,使用这个特定的infoPanelNode(一个SKSpriteNode),我有一个子节点,它是一个SKCropNode。然后,该节点裁剪出一个更大的节点(显然它是裁剪节点的子节点),因此只能看到一小部分(允许滚动到该节点的某些部分)。不幸的是,对containsPoint的调用显然将所有子节点的边界与接收节点的边界组合起来用作边界测试rect。如果它尊重SKCropNode的IT孩子的界限,这是可以理解的,但显然,如果你有这种类型的设置,你就不必自己动手。