2012-02-24 1 views
0

저는 몇 시간 (실제로는 2 일) 동안 이것을 연구 해왔고 무엇이 잘못되었는지를 정확히 알 수 없습니다. 터치가 허용되고 처리되지만 isTouchHandled 테스트가 TRUE를 조기에 트리거합니다. 다른 바운딩 박스가 터치 된 것보다 다른 것을 터치하는 것처럼. 여러 개의 겹치지 않는 CCSprite 버튼이 있습니다. 각 버튼은 levelButtons 배열에 있습니다. 어떤 것을 만진 지 확인하기 위해 반복합니다. 하지만 항상 잘못된 것입니다.CGRectContainsPoints 및 경계 상자 검사가 여러 픽셀로 흐려짐

이러한 스프라이트가 다른 레이어에 있고 다른 레이어에있는 경우 CGRectContainsPoints 메서드가 해제됩니까? 즉, position에 의해보고 된 픽셀 위치의 원시 평등을 사용하는 CGRectContainsPoints입니까? 그렇다면 스프라이트의 위치는 전체 화면과 관련하여보고 된 위치와 다르며 상위 인 경우 상대적인 위치입니다. 어쩌면 이것과 관련이 있을까요? 내 배열과 내용의 태그가 올바르게 정렬되어 있으므로 여러 번 로그하고 확인했습니다. 바운딩 박스 검사 인 것 같습니다.

-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ 
    CCLOG (@"levelButtons size:%i",[self.levelButtons count]); 
    BOOL isTouchHandled = NO; 
    for (int i=0;i<25;i++){ 

     CCSprite*temp=(CCSprite*)[self.levelButtons objectAtIndex:i]; 

     CCLOG(@"iteration temp.tag: %i for object: %i",temp.tag,i); 

      isTouchHandled= CGRectContainsPoint([temp boundingBox], [[CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view]]]); 

     if (isTouchHandled) { 

      CCLOG(@"level touched: %i",temp.tag); 

      break; 
     } 

    } 


    return isTouchHandled; 
} 

업데이트 : 덧붙여, 나는 또한 단지 CCSprite를 서브 클래스와 그림에서 스프라이트의 내 배열을 가지고,이 방식으로 개별 스프라이트에 감동 방법을 추가 할 수 있습니다. 결과는 동일 했으므로 CGRectContainsPoints가 rect이 다른 자식의 자식 일 때 제대로 작동하지 않는다고 생각합니다. 좌표가 제대로보고되지 않으면 의심됩니다.

+0

다음 정보를 사용하여 http://www.cocos2d-iphone.org/forum/topic/9636 경계 상자 위치의 추가 로그 로그를 사용하여 경계 상자가 실제로 내 스프라이트 – johnbakers

+0

의 로그에 올바르게 그려지는지 확인할 수 있습니다. 레이어의 스프라이트 자식의 경계 상자가 화면과 관련이 없으므로 cgrectcontainspoint가 잘못된 좌표를 얻음을 인식하지 못했습니다. – johnbakers

답변

0

는 I는 CGRectContainsPoint 시험 새로운 CGRect를 생성하고, 실제의 화면 사각형으로 바운딩 박스를 변환하여이를 해결; 바운딩 박스 테스트는 자식 스프라이트 (또는 레이어)에있는 경우 자체적으로 작동하지 않습니다. 부모에 대한 로컬 위치 만 반환합니다.

0

스프라이트를 가져 오는 배열에 문제가있을 수 있다고 생각합니다. 어떤 식 으로든, 이것은 스프라이트 태그를 얻기위한 코드를 사용하는 방법입니다.

UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInView:[touch view]]; 
location = [[CCDirector sharedDirector] convertToGL:location]; 


for(int i1=0;i1<=25;i1++) 
{ 
    CCSprite *sprite1 = (CCSprite *)[self getChildByTag:i1]; 
    if(CGRectContainsPoint([sprite1 boundingBox], location)) 

    { 
     //Your Code 
      break; 
    } 

} 
+0

표준 경계 상자 검사를 사용하지 않는 것을 보았습니다. 모든 태그가 스프라이트에 있고, 다른 곳에 저장되지 않았기 때문에 내 배열이 문제가 될지 의심 스럽습니다. 스프라이트가 터치 된 점이라면, 그 터치의 태그를보고해야합니다. 어쩌면 바운딩 박스가 부모 - 자식 노드 관계와 함께 작동하는 방법 때문일 수도 있습니다. – johnbakers

+0

Ok. 내 코드를 업데이트했습니다. 테두리 상자는 CGRect와 같은 동작을 반환합니다 ... 나는 경계 상자에 문제가 없다고 생각합니다. – Anish