2

我正在尝试开发一个小型 android 应用程序。你正在控制你的角色,即宇航员,你应该收集气泡来生存。好吧,我一开始就被卡住了。我希望角色由加速度计控制,但我无法解决我得到的错误。

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

我只需要 x 坐标,我需要在我的 GameRenderer 中使用它们,特别是在 movePlayer() 中。因此,我将 Game 的实例添加到了我的 Engine 类中,我将所有这些东西保存在其中,并在 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();
        }

        }

这是我的引擎中的游戏实例:

public static Game game;

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

4

1 回答 1

1

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

@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);
}
于 2013-05-05T13:14:55.570 回答