检查单击SKShapeNode的时间

时间:2014-02-20 19:16:32

标签: objective-c sprite-kit sknode

所以我生成了一个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位置西南方的屏幕上的任何位置也会将上述代码呈现为真。

enter image description here

使用红点表示的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;
}

感谢您的帮助!

1 个答案:

答案 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上):

Visualized clickable region

要解决您的问题,请尝试以下操作:

circle.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-TARGET_RADIUS/2.0f, -TARGET_RADIUS/2.0f, TARGET_RADIUS, TARGET_RADIUS)].CGPath;

并添加

circle.position = CGPointMake(x, y);