2012-03-04 5 views
0

그래서 장치의 롤을 사용하여 주인공의 위치를 ​​설정하는 Android 용 게임을 만듭니다. .onSensorChanged (이벤트) 메서드가 실행될 때마다 위치가 업데이트됩니다. 문제는 앱을 실행하고 탁상용으로 휴대 전화를 설정할 때도 값이 크게 (약 2도) 바뀌는 것입니다. 수집 된 데이터의 민감도는 각도의 차이가 매 변경시 약 0.4도 씩 증가하는 것처럼 보이는 것처럼 매우 정확하지 않은 것처럼 보입니다. 나는 또한 화면 내 캐릭터의 움직임을 제한하기 위해이 알고리즘을 구현했습니다방향 롤 데이터에 액세스하는 것은 안드로이드에 대해 불안정합니다

roll: 2.265 
roll: 2.265 
roll: 2.265 
roll: 1.843 
roll: 2.265 
roll: 2.265 
roll: 2.75 
roll: 2.265 

,하지만 충분하지 않습니다 심각 속도와의 응답을 제한 :

Log.e(TAG, "roll: " + event.values[2]); 

순차 정도의 출력을 사용하면 다음과 같다 현재 롤 데이터에 관한 캐릭터의 이동 (가능하면 롤에 관해서는 캐릭터의 배치가 1-1에 가까워지기를 원합니다).

public void onSensorChanged(SensorEvent event) 
{ 
    if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) 
    { 
    float newX = -(int)event.values[2] * CCDirector.sharedDirector().displaySize().width/10.0f + 
      CCDirector.sharedDirector().displaySize().width/2.0f; 

      sam.updatePosition(newX); 

    Log.e(TAG, "roll: " + event.values[2]); 
    } 
} 

public void updatePosition(float newX) 
{ 
    float winSizeX = CCDirector.sharedDirector().displaySize().width; 
    float contentWidth = this.sprite.getContentSize().width; 

    //tries to eliminate jumpy behaviour by the character by limiting his speed 
    double tolerance = 0.01; 
    if (Math.abs(newX - this.sprite.getPosition().x) > winSizeX * tolerance) 
     newX = this.sprite.getPosition().x - ((this.sprite.getPosition().x - newX) * 0.1f); 

    this.sprite.setPosition(newX, this.sprite.getPosition().y); 
} 

이 정상이거나 내가 그것을 테스트하고있어 휴대 전화의 경우 만약 내가 궁금하네요 (소니 엑스 페리아을 재생합니다.) 모든 입력에 대한

감사합니다.

+0

codez는 어디에 있습니까? – Coffee

+0

방금 ​​ – mknutso2

답변

0

비행 중에 데이터를 원활하게하는 방법은 moving average일까요?

조금 지연되지만 눈에 띄지는 않을 것입니다.

반면에 나는 Euler angles (예 : 롤)을 사용하지 않을 것입니다.

+0

질문에 편집했습니다. 나는이 위치 이동 제한 알고리즘을 포함 시켰습니다. (지금은 질문에 포함되어 있습니다.) 그러나 너무 많은 지연이있었습니다. 귀하의 링크에서 문제가 발생하지 않았습니다. 극단적 인 방향으로 장치를 사용하여 게임을하는 사람이있을 것이라고 기대하지 않기 때문에 불안정한 각도 동작 문제가 없습니다. – mknutso2