我正在尝试开发一款小型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()。我想要非常具体,所以你们有所有的细节,希望你能帮助我。谢谢你的任何建议,我真的很绝望。
答案 0 :(得分:1)
我希望Engine.game
是null
。很难看出你的代码是如何正常工作的,但如果我理解正确,你应该在游戏的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);
}