2014-07-12 9 views
2

원형 모양으로 터치를 감지해야하지만, 모양이 원형처럼 보이지만 터치 가능한 영역은 여전히 ​​직사각형입니다. 사용자가 내 서클에 닿은 경우에만 터치를 감지합니까?원형 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"); 
    } 
} 
+0

이 질문을보십시오. http://tackoverflow.com/questions/13291919/detect-touches-only-on-non-transparent-pixels-of-uiimageview- 효율적으로 비 트랜스 포렌트에서 터치를 감지하고자 할 수 있습니다. 비트 만 –

+0

문제는 모든 프레임에서 이와 같은 비교를 실행하고 있으므로 각 프레임의 모양 픽셀을 개별적으로 검사하면 성능이 좋지 않을 수 있다는 것입니다. – lisovaccaro

답변

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에 대해 간단하고 성능이 우수한 것은 아닙니다.

업데이트는 다시 좋지 않은 또 하나의 옵션을 추가하고 싶었지만 완전히 모양의 외부 접촉을 제거 할 수 있습니다. 그러나 가장자리의 일부가 터치 반응을 일으키지 않으므로 역의 문제가 있습니다.

당신이 할 수있는 일은 둥근 모양의 사각형 바깥으로 확장하지 않고 가능한 큰 크기의 일반 사각형 인 보조 터치 객체를 생성하고이를 사용하여 터치 감지를 수행하는 것입니다.

내가 말했듯이, 귀하의 터치 rect가 커버하지 않는 바깥 쪽 영역이 반작용 반응을 일으키지 않을 것입니다. 이 기능은 경우에 따라 바람직하지 않을 수도 있습니다. 그냥 내가 버리고 그걸 결정하게 만들었다.

+0

그 생각은 좋지 않다고 생각합니다. 이미 물리학을 만들었습니다. 왜냐하면 나는 그 정맥에서 어떤 것을 생각하고 있었기 때문이다. – lisovaccaro

+0

두 물리 구조체 인'_button'과'_touchy'를 이미 만들었습니다. 기본적으로 새로운 터치에서'_touchy.position = touchLocation; '을 수행합니다. 이후에'_button '과 충돌하는지 어떻게 확인합니까? – lisovaccaro

+0

그건 물리 충돌 질문입니다. 코멘트가 답을 잃어 버렸을 때 코멘트를 작성하지 않는 것이 가장 좋습니다. 당신은 사용할 수있는 방법에 대한 높은 수준의 질문을했습니다. 지금 묻고있는 것은 물리학 및 충돌에 관한 구체적인 질문입니다. 그 말을 반복해서 나타내지 않으면 서 그 대답에 특히 많은 사람들이있을 것입니다! 하하 – prototypical