2009-08-24 6 views
0

안녕 얘들 아, 그 점에 관해 많은 질문을 많이 준비했지만, 아직 정확한 답변을 얻지 못했습니다. cocos2D의 접촉 문제

그래서 ..이 문제가

..

이것은적인 Cocos2D 내 첫 번째 프로젝트, 그것에 대해 정말 죄송합니다.

나는 한 장면이 내가 이름 그리드 하나 개의 레이어가이 그리드의 내부에, 많은 많은 블록 (너무 레이어)이 게임 플레이를 그 내부라고합니다.

블록을 터치 할 때 확인해야합니다. 인터페이스 작성기를 사용하기 전에이를 수행합니다. 따라서 touchesBegin을 호출 할 때 정확한 터치를 한 번에 볼 수 있습니다. 하지만 cocos2D에서, 나는 당신이 객체의 위치를 ​​확인해야한다는 것을 알았고, 그렇다면 바로 테스트를 치지 않았습니까?!

그래서 내 touchesBegin은 다음과 같이이다 :

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView: [touch view]]; 
    //location = [[Director sharedDirector] convertCoordinate: location]; 

    for(int i = 0; i < [arrAllBlocks count]; i++) 
    { 
     for (int j = 0; j < [[arrAllBlocks objectAtIndex:i] count]; j++) 
     { 
      Block *tempBlock = [[arrAllBlocks objectAtIndex:i] objectAtIndex:j]; 
      CGRect mySurface = (CGRectMake(tempBlock.position.x, tempBlock.position.y, tempBlock.contentSize.width,tempBlock.contentSize.height)); 
      if(CGRectContainsPoint(mySurface, location)) 
      { 
       NSLog(@"Hit Positions %fl:%fl",location.x,location.y); 
       NSLog(@"Object Positions %fl:%fl",tempBlock.position.x,tempBlock.position.y); 
       NSLog(@"Object Color:%@ hited", tempBlock.strName); 
      } 
     } 

    } 
} 

첫 번째 문제는 :이 상하 반전 보인다! 첫 번째 줄에서이 블록 중 하나를 클릭하면됩니다! 나는 마지막 줄에서 블록을 얻는다 !! 나는 정말로 그것을 얻지 않는다! 그리고 타격은 나에게 완벽하지 않습니다! 그리고 내가 convertCoordinate 최악의 경우!

누군가 나를 도울 수 있습니까?! 그리고 나쁜 영어에 대해 유감스럽게 생각합니다./

+0

OpenGL은 나머지 iPhone의 작동 방식에 따라 상하 방향의 좌표를 사용합니다. 나는 Cocos2D가 어떻게 그 문제를 처리하는지 모르지만 네, 그것은 성가신 일입니다. –

답변

0

코코아 2D의 좌표계는 코코아의 좌표계와 반대입니다. (실제로, 코코아는 나에게 거꾸로이지만, 단지 관례입니다.)

나는 항상이 모든 것을 잊어 버린다! 기억해야 할 두 가지가 있습니다

1

은 ...

  • 적인 Cocos2D 시스템의 원점은 왼쪽 하단 좌표.
  • 기본적으로 표시 요소의 기준점은 해당 중심입니다.

    요소의 앵커 포인트뿐만 아니라 왼쪽 아래로 설정 :

그래서 이것은 내가이 문제를 해결하는 방법입니다.

[block setAnchorPoint:ccp(0, 0)]; 

ccTouchesBegan에서 convertCoordinate를 사용하십시오.

-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint pt = [touch locationInView:[touch view]]; 
    CGPoint ptConv = [[Director sharedDirector] convertCoordinate:pt]; 
} 

요소의 사각형을 계산하고 비교

... 그것은 당신이없는 유일한 단계처럼 보인다

CGSize size = [block contentSize]; 
CGPoint point = [block position]; 
rect = CGRectMake(point.x, point.y, size.width, size.height); 

if (CGRectContainsPoint(rect, ptConv)) 
{ 
    // touched 
} 

는 앵커 포인트를 변경하는 것입니다.

고정 점을 변경하지 않으려면 직사각형 계산 방법을 변경해야합니다. 너비와 높이의 절반을 더하거나 뺍니다.

희망이 있습니다.