无法使用加速度计坐标

时间:2013-05-05 12:56:43

标签: java android accelerometer

我正在尝试开发一款小型Android应用。你正在控制你的角色,这是宇航员,你应该收集气泡来生存。好吧,我一开始就被困住了。我想要用加速度计控制角色,但我无法解决我得到的错误。

我的加速度计是在活动游戏中实现的,它在添加加速度计之前有效。 Game在GameView类的setContentView()实例中有参数,它设置了我的GameRenderer。

我只需要x坐标,我需要在我的GameRenderer中使用它们,特别是在movePlayer()中。所以,我在我的Engine类中添加了Game的实例,在那里我保留了所有这些东西,而在movePlayer()中我使用了Engine.game.x。

有问题。当我尝试运行它时,我得到NullPointerException,并且日志说错误在第51和83行。

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;


public class Game extends Activity implements SensorEventListener {
    private GameView gameView;
    SensorManager mSensorManager;
    Sensor mAccelerometer;
    public float x = 0;

 @Override
 public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     gameView = new GameView(this);
     setContentView(gameView);

     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     mSensorManager.registerListener(this, mAccelerometer,    SensorManager.SENSOR_DELAY_NORMAL);

 }

 @Override
 protected void onResume(){
     super.onResume();
     gameView.onResume();
 }

 @Override
 protected void onPause(){
     super.onPause();
     gameView.onPause();


 }

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
     x = event.values[0];

}


}

这是我的movePlayer方法:

private void movePlayer(GL10 gl) {
        lastX = Engine.game.x;  //**line 83**

        if (Engine.game.x * 10 > lastX) {       
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glPushMatrix();
            gl.glScalef(.25f, .25f, .25f);
            gl.glTranslatef(Engine.game.x, 0f, 0f);

            gl.glMatrixMode(GL10.GL_TEXTURE);
            gl.glLoadIdentity();
            gl.glTranslatef(0.25f, 0.0f, 0.0f);

            player.draw(gl);
            gl.glPopMatrix();
            gl.glLoadIdentity();
        }

        else if (Engine.game.x * 10 < lastX) {      
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glPushMatrix();
            gl.glScalef(.25f, .25f, 1f);
            gl.glTranslatef(Engine.game.x, 0f, 0f);

            gl.glMatrixMode(GL10.GL_TEXTURE);
            gl.glLoadIdentity();
            gl.glTranslatef(0.75f, 0.0f, 0.0f);

            player.draw(gl);
            gl.glPopMatrix();
            gl.glLoadIdentity();
        }

        else {      //postava se nehýbe
            gl.glMatrixMode(GL10.GL_MODELVIEW);
            gl.glLoadIdentity();
            gl.glPushMatrix();
            gl.glScalef(.25f, .25f, 1f);
            gl.glTranslatef(Engine.game.x, 0f, 0f);
            gl.glMatrixMode(GL10.GL_TEXTURE);
            gl.glLoadIdentity();
            gl.glTranslatef(0.0f, 0.0f, 0.0f);
            player.draw(gl);
            gl.glPopMatrix();
            gl.glLoadIdentity();
        }

        }

这是我的引擎中的Game实例:

public static Game game;

第51行只是调用movePlayer()。我想要非常具体,所以你们有所有的细节,希望你能帮助我。谢谢你的任何建议,我真的很绝望。

1 个答案:

答案 0 :(得分:1)

我希望Engine.gamenull。很难看出你的代码是如何正常工作的,但如果我理解正确,你应该在游戏的Engine.game中设置onCreate

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    Engine.game = this;     // <-- add this

    gameView = new GameView(this);
    setContentView(gameView);

    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}