所以我生成了一个SKShapeNode,并且需要知道何时单击该节点。我通过致电:
这样做- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint positionInScene = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:positionInScene];
if ([node.name isEqualToString:TARGET_NAME]) {
// do whatever
}
}
}
所以我得到的结果非常奇怪。单击点本身确实有效。但是,按下SKShapeNode位置西南方的屏幕上的任何位置也会将上述代码呈现为真。
使用红点表示的SKShapeNode,阴影区域中的任何UITouch都会将上面的代码呈现为真。
以下是我构建SKShapeNode的方法。注意我的应用程序以横向模式运行可能也很重要。
#define RANDOM_NUMBER(min, max) (arc4random() % (max - min) + min)
- (SKShapeNode *)makeNodeWithName:(NSString *)name color:(UIColor *)color
{
SKShapeNode *circle = [SKShapeNode new];
int maxXCoord = self.frame.size.width;
int maxYCoord = self.frame.size.height;
CGFloat x = RANDOM_NUMBER((int)TARGET_RADIUS, (int)(maxXCoord - TARGET_RADIUS));
CGFloat y = RANDOM_NUMBER((int)TARGET_RADIUS, (int)(maxYCoord - TARGET_RADIUS - 15));
circle.fillColor = color;
circle.strokeColor = color;
circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x, y, TARGET_RADIUS, TARGET_RADIUS)].CGPath;
circle.name = name;
return circle;
}
感谢您的帮助!
答案 0 :(得分:4)
这是因为圆节点的位置在原点,它从(x,y)开始绘制矩形路径。因此节点的框架被拉伸以包含(0,0)到(x + TARGET_RADIUS,y + TARGET_RADIUS)之间的所有内容。
您可以通过可视化圆圈的框架来自行检查:
SKSpriteNode *debugFrame = [SKSpriteNode spriteNodeWithColor:[NSColor yellowColor] size:circle.frame.size];
debugFrame.anchorPoint = CGPointMake(0, 0);
debugFrame.position = circle.frame.origin;
debugFrame.alpha = 0.5f;
[self addChild:test];
这显示了实际的可点击区域(在OSX上):
要解决您的问题,请尝试以下操作:
circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-TARGET_RADIUS/2.0f, -TARGET_RADIUS/2.0f, TARGET_RADIUS, TARGET_RADIUS)].CGPath;
并添加
circle.position = CGPointMake(x, y);