Java Can';不能使用加速度计坐标
我正在尝试开发一个小型android应用程序。你在控制你的角色,即宇航员,你应该收集气泡以生存。嗯,一开始我就被绊倒了。我希望角色由加速度计控制,但我无法解决我得到的错误 我的加速计是在活动游戏中实现的,在添加加速计之前就已经运行了。Game在类GameView的setContentView()实例中有一个参数,该类设置我的GameRenderer 我只需要x坐标,我需要在游戏渲染器中使用它们,特别是在movePlayer()中。所以,我在Engine类中添加了游戏实例,在这里我保存了所有这些东西,在movePlayer()中我使用Engine.Game.xJava Can';不能使用加速度计坐标,java,android,accelerometer,Java,Android,Accelerometer,我正在尝试开发一个小型android应用程序。你在控制你的角色,即宇航员,你应该收集气泡以生存。嗯,一开始我就被绊倒了。我希望角色由加速度计控制,但我无法解决我得到的错误 我的加速计是在活动游戏中实现的,在添加加速计之前就已经运行了。Game在类GameView的setContentView()实例中有一个参数,该类设置我的GameRenderer 我只需要x坐标,我需要在游戏渲染器中使用它们,特别是在movePlayer()中。所以,我在Engine类中添加了游戏实例,在这里我保存了所有这些东
这就是问题所在。当我试着运行它时,我得到了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();
}
}
第51行只是调用movePlayer()。我想说得非常具体,所以你们都有所有的细节,希望你们能帮助我。谢谢你的建议,我真的很绝望。我希望
引擎。游戏为null
。很难看出您的代码是如何工作的,但如果我理解正确,您应该在游戏的onCreate
中设置Engine.game
:
@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);
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Engine.game=this;//可能Engine
,game
或x
为空..?试着调试这行代码“有问题。当我尝试运行它时,我得到了NullPointerException,日志显示错误在第51行和第83行。”-NPE是最容易调试的异常。转到该行,查看哪个引用为null。如果您在那里设置断点,任何好的IDE都会立即告诉您。没有其他异常,游戏正在运行:)谢谢,您救了我的命!
@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);
}