Sprite kit SpriteKit触摸-包含点

Sprite kit SpriteKit触摸-包含点,sprite-kit,Sprite Kit,我有一个问题,在我的touchesbreated方法中,我没有得到我认为应该得到的东西 我正在测试特定节点内的命中率。我试过几种方法,但都不管用。我已经创建了一个工作环境,但是我很想知道这是一个bug还是我做错了什么 代码如下: 标准触摸法: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { /* Called when a touch begins */ SKSpriteNode *infoPan

我有一个问题,在我的touchesbreated方法中,我没有得到我认为应该得到的东西

我正在测试特定节点内的命中率。我试过几种方法,但都不管用。我已经创建了一个工作环境,但是我很想知道这是一个bug还是我做错了什么

代码如下:

标准触摸法:

-(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;
}
-(bool)myPtInNode:(SKSpriteNode*)节点输入点:(CGPoint)输入点{
if(node.position.xinPoint.x){
if(node.position.yinPoint.y){
返回true;
}
}
返回false;
}
有人看到这里出了什么问题吗

谢谢,
kg

解决了这个问题,并希望更新每个人


事实证明,对于这个特定的infoPanelNode(一个SKSpriteNode),我在其中有一个子节点,它是一个SKCropNode。然后,该节点裁剪出一个更大的节点(显然它是裁剪节点的子节点),因此只有一小部分是可见的(允许滚动到该节点的部分)。不幸的是,对containsPoint的调用显然将所有子节点的边界与接收节点的边界结合起来,用作边界测试rect。如果它尊重SKCropNode的子节点边界,这是可以理解的,但显然,事实并非如此,因此如果您有这种类型的设置,您必须自己进行设置。

解决了此问题,并希望更新所有人


事实证明,对于这个特定的infoPanelNode(一个SKSpriteNode),我在其中有一个子节点,它是一个SKCropNode。然后,该节点裁剪出一个更大的节点(显然它是裁剪节点的子节点),因此只有一小部分是可见的(允许滚动到该节点的部分)。不幸的是,对containsPoint的调用显然将所有子节点的边界与接收节点的边界结合起来,用作边界测试rect。如果它尊重SKCropNode的子节点边界,这是可以理解的,但显然,事实并非如此,因此如果您有这种类型的设置,您必须自己进行设置。

解决了此问题,并希望更新所有人


事实证明,对于这个特定的infoPanelNode(一个SKSpriteNode),我在其中有一个子节点,它是一个SKCropNode。然后,该节点裁剪出一个更大的节点(显然它是裁剪节点的子节点),因此只有一小部分是可见的(允许滚动到该节点的部分)。不幸的是,对containsPoint的调用显然将所有子节点的边界与接收节点的边界结合起来,用作边界测试rect。如果它尊重SKCropNode的子节点边界,这是可以理解的,但显然,事实并非如此,因此如果您有这种类型的设置,您必须自己进行设置。

解决了此问题,并希望更新所有人


事实证明,对于这个特定的infoPanelNode(一个SKSpriteNode),我在其中有一个子节点,它是一个SKCropNode。然后,该节点裁剪出一个更大的节点(显然它是裁剪节点的子节点),因此只有一小部分是可见的(允许滚动到该节点的部分)。不幸的是,对containsPoint的调用显然将所有子节点的边界与接收节点的边界结合起来,用作边界测试rect。如果它尊重SKCropNode的子级边界,这是可以理解的,但显然,事实并非如此,因此如果您有这种类型的设置,您必须自己进行设置。

我不确定SKCropNode将如何工作,但一般来说,为了让
containsPoint:
检测其中的接触,您需要给它一个相对于其父节点的点。下面的代码应该可以工作。请注意,在调用
locationInNode:

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

我不确定SKCropNode将如何工作,但一般来说,为了让
containsPoint:
检测其中的接触,您需要给它一个相对于其父节点的点。下面的代码应该可以工作。请注意,在调用
locationInNode:

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

我不确定SKCropNode将如何工作,但一般来说,为了让
containsPoint:
检测其中的接触,您需要给它一个相对于其父节点的点。下面的代码应该可以工作。请注意,在调用
locationInNode:

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

我不确定SKCropNode将如何工作,但一般来说,为了让
containsPoint:
检测其中的接触,您需要给它一个相对于其父节点的点。下面的代码应该可以工作。请注意,在调用
locationInNode:

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

提示:转换坐标,参见SKNode REFERENCE,我也已经尝试过了-仍然没有成功。尝试:-(CGPoint)convertPoint:(CGPoint)point from node:(SKNode*)node在开始之前,尝试在InfoPannelNode上捕捉touch,我建议您将其子类化为touch responsivespritenode或smthn。提示:转换坐标,请参阅SKNode参考我也尝试过-仍然没有成功。尝试:-(CGPoint)convertPoint:(CGPoint)point from node:(SKNode*)node在开始之前,尝试在InfoPannelNode上捕捉touch,我建议您将其子类化为touch responsivespritenode或smthn。提示:转换坐标,请参阅SKNode参考我也尝试过-仍然没有成功。尝试:-(CGPoint)convertPoint:(CGPoint)point from node:(SKNode*)node在开始之前,尝试在InfoPannelNode上捕捉touch,我建议您将其子类化为touch responsivespritenode或smthn。提示:转换坐标,请参阅SKNode参考我也尝试过-仍然没有成功。尝试:-(CGPoint)convertPoint:(CGPoint)point from node:(SKNode*)node开始之前,请尝试在InfoPannelNode上捕获touch,我建议您将其子类化为touch responsivesp