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