2012-12-01 3 views
0

화면의 맨 위에서 아래로 움직이는 애니메이션과 같은 "비"가 있습니다 (여러 이미지가 연속적으로 맨 위에서 떨어짐). 나는 또한 아래쪽에 손가락으로 제어되는 바구니 이미지를 가지고있다. 나는 앱이 떨어지는 이미지와 바스켓 사이의 "충돌"의 양을 계산하고 그들이 충돌하면 이미지를 제거하기를 원합니다.CGRectIntersectsRect 콜리 전 카운트가 너무 많습니다.

저는 두 개의 타이머를 사용합니다 : 하나는 연속적으로 위에서 이미지를 떨어 뜨립니다. 각 이미지를 배열에 넣었습니다. 그런 다음 0.001마다 충돌을 확인하는 또 다른 타이머가 있습니다.

두 개체가 충돌 할 때마다 계산을 할 수 있었지만 문제가 너무 많습니다. 예를 들어, 각 시각적 충돌은 985 충돌과 같은 것을 계산합니다. 내가 내 코드에서 잘못하고있는 중이 야? 타이머 :

[NSTimer scheduledTimerWithTimeInterval:(0.001) target:self selector:@selector(onCollisionCheckTimer) userInfo:nil repeats:YES]; 

충돌 검사기 :

- (void)onCollisionCheckTimer{ 
    for (x = 0; x<100; x++){ 
     CALayer *layer = appleView[x].layer.presentationLayer; 
     if(CGRectIntersectsRect(basketView.frame, layer.frame)) { 
      collision++; 
      printf("%i\n", collision); 
      [appleView[x] removeFromSuperview]; 
     } 
    } 
} 

printf("%i", collision); 모든 충돌 모든

답변

1

최초의 수백에 숫자를 출력하고, 귀하의 충돌 테스트 타이머 지속 시간이 너무 짧습니다. 실질적으로 주 실행 루프는 초당 약 60 회만 실행되므로 0.016에 가까운 기간을 사용해야합니다. 모든 밀리 초를 트리거하도록 예약 된 타이머를 얻지 못할 것입니다.

둘째,보기는 슈퍼 뷰에서 제거 된 후에도 레이어 속성을 유지합니다. 아마도 일어나고있는 것은 떨어지는 물체가 superview에서 제거 되더라도 여전히 appleView 콜렉션에서 그 객체를 반복하면서 그 속성이 여전히 바구니보기와 교차하는 것입니다.

이 문제를 해결하는 한 가지 방법은 충돌을 확인하기 전에 각 사과보기의 superview 속성을 확인하는 것입니다. 그것이 nil이 아닌 경우에만 충돌 테스트를 수행해야합니다.

+1

또는 사과 모양이 바구니에 도착하면 appleView 배열에서 각 사과보기를 제거하십시오. 또한'NSTimer' 대신'CADisplayLink'를 사용하십시오. 'CADisplayLink'는 코어 애니메이션 업데이트를 구동하는 디스플레이 리프레시 타이머와 동기화됩니다. –

+0

도움과 정보를 모두 제공해 주셔서 감사합니다. – user1861051

+0

superview 속성 검사는 어떻게합니까? – user1861051