저는 몇 시간 (실제로는 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
이 다른 자식의 자식 일 때 제대로 작동하지 않는다고 생각합니다. 좌표가 제대로보고되지 않으면 의심됩니다.
다음 정보를 사용하여 http://www.cocos2d-iphone.org/forum/topic/9636 경계 상자 위치의 추가 로그 로그를 사용하여 경계 상자가 실제로 내 스프라이트 – johnbakers
의 로그에 올바르게 그려지는지 확인할 수 있습니다. 레이어의 스프라이트 자식의 경계 상자가 화면과 관련이 없으므로 cgrectcontainspoint가 잘못된 좌표를 얻음을 인식하지 못했습니다. – johnbakers