gpt4 book ai didi

java - 无法使用加速度计坐标

转载 作者:行者123 更新时间:2023-11-30 11:32:48 24 4
gpt4 key购买 nike

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

我的加速度计是在 Activity 游戏中实现的,它在添加加速度计之前就起作用了。 Game 在类 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()。我试图非常具体,所以你们知道所有的细节,希望你能帮助我。感谢您的任何建议,我真的很绝望。

最佳答案

我希望 Engine.gamenull。很难看出您的代码是如何工作的,但如果我理解正确,您应该在游戏的 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);
}

关于java - 无法使用加速度计坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com