检测圆形SKShapeNode中的触摸?

时间:2014-07-12 15:14:09

标签: ios touch sprite-kit cgrect skshapenode

我需要检测圆形的触摸,问题是虽然形状看起来像圆形,但可触摸区域仍然是矩形。如何仅在用户触摸我的圈子时如何检测触摸?

这就是我现在正在做的事情:

 // Here I add the Shape
_circle = [SKShapeNode node];
_circle.name = @"circle";
_circle.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
[_circle setPath:CGPathCreateWithRoundedRect(CGRectMake(-70, -70, 140, 140), 70, 70, nil)];
_circle.strokeColor = _circle.fillColor = [UIColor colorWithRed:255.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:1.0];
[self addChild:_circle];
//...

// Listening to touches
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    if (CGRectContainsPoint(_circle.frame, location)) {
        NSLog(@"Circle is touched");
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在处理实际圈子,可以使用数学来获得所需的结果。您可以计算从圆心到触点的距离。如果该距离低于圆的半径,则表示您有一个有效的触摸。

- (bool)pressed:(UITouch*) touch
{
    CGPoint location = [touch locationInNode:self];
    float hyp = sqrtf(powf(_button.position.x  - location.x,2) + powf(_button.position.y - location.y,2));
    if(hyp < _button.frame.size.width/2)
    {
        return true;
    } else {
        return false;
    }
}

但是,使用圆角矩形,此解决方案将无法正常工作。

然而,您可以通过使用SpritKit的物理学来采用不同的方法。你要做的是创建一个带有物理体的透明节点,并让它移动到触摸位置。这应该会让你的节点和按钮发生冲突。

当然你的按钮也需要一个合适的物理身体。

不是我认为你希望的理想解决方案,但在这一点上,SpriteKit没有一个简单且性能友好的解决方案。

<强>更新

想要添加一个选项,这也是不理想的,但可以完全去除形状之外的触摸。然而,它有一些相反的问题,因为一些边缘不会触摸反应。

你可以做的是创建一个辅助触摸对象,它是一个普通的矩形,尽可能大,不会延伸到圆角矩形之外,并用它来进行触摸检测。

就像我说的那样,你会遇到相反的问题,因为触摸矩形未覆盖的外部区域不会触及反应。取决于具体情况,该功能可能是也可能不是所希望的。我想我会把它扔出去让你决定。