2012-11-05 5 views
2

내 앱에서는 가속도계를 사용하여 게임의 캐릭터를 제어합니다. 지금은 세로 방향 만 허용하여 문자를 이동하기 위해 사용자가 장치를 오른쪽이나 왼쪽으로 기울여야합니다. 지금까지 괜찮 았어. 지금 내가 달성하고자하는 것은 사용자가 현재 진행하고있는 기울기를 고려하여 가속도계를 '보정'하는 것입니다. 사용자가 자신의 옆에 누워 있다고 말하면, 시작점을 고려하지 않았기 때문에 값이 왜곡되어 문자를 제어 할 수 없게됩니다. 그래서 초기 틸트 양을 고려하여 게임을하는 동안 계정을 차지하려고하지만 작동하지 않습니다. 그래서UIAccelerometer를 보정 하시겠습니까?

나는 '보정'가속도계에 내 비 게임보기에서 버튼이 있고이는 실행 코드입니다 :

이것은 IBAction를

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:1.0f/30.0f]; 
[[UIAccelerometer sharedAccelerometer] setDelegate:self]; 

이을에 초기화 I에서 가속도계 위임 호출 내 게임보기에서 다음

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    [[NSUserDefaults standardUserDefaults] setFloat:acceleration.x forKey:@"X-Calibrate"]; 
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil]; 
} 

입니다 iVar calibrationFloat를 NSUserDefaults에서 설정 한 값으로 설정하십시오. 그런 다음 작은 불안감을 없애기 위해 kFilteringFactor도 사용합니다. 그래서이 모든 것에 rollingX 동일하게 설정하는 게임 가속도계 대리자 메서드는 다음 나는 rollingX에 따라 문자 이동 :

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    rollingX = ((acceleration.x - calibrationFloat) * kFilteringFactor) + (rollingX * (1.0 - kFilteringFactor)); 
} 

그러나이 작동하지 않는, 교정은 아무것도하지 않는 것 내가 아니다 왜. 왜 이것이 작동하지 않는가?

답변

2

몇 가지 정보를 알려 드릴 수 있습니다. rollingX에 대한 계산이 잘못되어 -1 - 1 범위를 벗어난 값을 제공 할 수 있습니다. 한계를 감지하여 적절하게 조정하는 방법이 필요합니다. 또한 한 축만 옵셋해도 작동하지 않습니다. 가속도계는 3D 공간에서 작동합니다. 계산이 올바르게 작동하려면 전화기가 항상 z 평면에서 0이어야합니다. 사용자가 전화기를 회전하면 z 평면에 더 가까이 갈수록 장치가 x 평면에서 출력하는 판독 값이 더 작아집니다. 가속도계는 중력을 감지하므로 비행기는 이것에 비해 고정되어 있습니다.

효과적인 보정을 수행하려면 가중 된 오프셋이 필요하므로 (예 : z가 증가하고 x가 아닌 y에주의를 기울이십시오) 모든 3 축에 연속 매트릭스 변환을 적용해야합니다.

+0

코드 예제를 제공 할 수있는 방법이 있습니까? 나 자신도 가속도계와 행렬에 익숙하지 않아서 코드 예제에 대한 현상금을 게시했다. 정말 고마워! –

+0

나는 전에 simular 한 일을했지만, 나는 두려워하는 내 머리 꼭대기에서 너를 말할 수 없었다. 이 블로그 게시물을 확인해보십시오. 그러면 도움이 될 것입니다. http://www.paradeofrain.com/2010/07/lessons-learned-in-tilt-controls/ –

+0

블로그 게시물에 행운이 있습니까? 더 궁금한 점이 있으면 알려주세요. –