我需要检测圆形的触摸,问题是虽然形状看起来像圆形,但可触摸区域仍然是矩形。如何仅在用户触摸我的圈子时如何检测触摸?
这就是我现在正在做的事情:
// 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");
}
}
答案 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没有一个简单且性能友好的解决方案。
<强>更新强>
想要添加一个选项,这也是不理想的,但可以完全去除形状之外的触摸。然而,它有一些相反的问题,因为一些边缘不会触摸反应。
你可以做的是创建一个辅助触摸对象,它是一个普通的矩形,尽可能大,不会延伸到圆角矩形之外,并用它来进行触摸检测。
就像我说的那样,你会遇到相反的问题,因为触摸矩形未覆盖的外部区域不会触及反应。取决于具体情况,该功能可能是也可能不是所希望的。我想我会把它扔出去让你决定。