Android accelerometer difficulties

不问归期 提交于 2019-12-09 23:19:58

问题


I'm a beginner in Android game Development, and I developing a small Game. I am facing some difficulties with the Motion Sensor: Accelerometer.

this game is in Landscape mode. I want if my phone tilts in right, my character also goes right. ( same thing for left ) And when I stop tilting Character in the game should stop moving.

But i don't understand really good the operation of the accelerometer,

here is my code:

 @Override
public void onSensorChanged(SensorEvent event) {
     synchronized (this) {
        long penchement = (long) (event.values[1]- 0.5);
          if(penchement>0){
              if(penchement>lastUpdate)
                  lastUpdate=penchement;
              if(penchement>0.2){
                  booldroite=true; // boolean for going right
                  boolgauche=false; // boolean for going left
              }
              if(lastUpdate-penchement<0.2)
                  booldroite=false;
          }
          else{
              if(penchement<lastUpdate)
                  lastUpdate=penchement;
              if(penchement<-0.2){
                  boolgauche=true;
                  booldroite=false;
              }
              if(lastUpdate+penchement>-0.2)
                  boolgauche=false;
          }

}

So my code works (a bit), but my character's moves aren't smooth at all. Sometimes my phone tilts but my Characters doesn't move...

Thank you very much in advance if you can help me.


回答1:


Sensor readings are noisy by nature, that's the reason for the flickering movement of your character.

You will need to implement some kind of low pass filter after the readings. There's a basic low pass filter example in SensorEvent.

 public void onSensorChanged(SensorEvent event) {

      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

You might want to use the values in gravity[] to find out the 'tilt' of the phone. Also, play around with the value of final float alpha: Values near 1.0 will improve the smoothness, while smaller values near 0.0 will obtain noisier readings, but have a faster response.

Bonne chance!



来源:https://stackoverflow.com/questions/13935759/android-accelerometer-difficulties

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!