0
我的OpenGl项目中的单击按钮存在一些问题。我尝试用按钮更改Z值,但每次都发生错误。XML按钮和OpenGL Android,错误“在空对象引用上”
LOG
FATAL EXCEPTION: main
Process: com.example.vladimir.myapplication, PID: 26366
java.lang.NullPointerException: Attempt to read from field 'float com.example.vladimir.myapplication.MyGLRenderer.z' on a null object reference
at com.example.vladimir.myapplication.MyGLActivity$1.onClick(MyGLActivity.java:64)
,我不知道,我究竟做错了。
这是我的代码按钮和MainActivity
private MyGLRenderer myGLRenderer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_gl);
glView = (MyGLSurfaceView) findViewById(R.id.glSurfaceViewID);
/*ОБРАБОТКА НАЖАТИЙ НА КНОПКИ*/
Button ZoomIn = findViewById(R.id.ZoomIn);
Button ZoomOut = findViewById(R.id.ZoomOut);
ZoomOut.setOnClickListener(ZoomOutListener);
ZoomIn.setOnClickListener(ZoomInListener);
}
//Функция-Обработчик нажатия на кнопки
View.OnClickListener ZoomInListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
myGLRenderer.z +=1;
Log.e("ZoomIn", "ZoomIn");
}
};
这MyGLRENDERER,在那里我试图改变Z值
public class MyGLRenderer implements GLSurfaceView.Renderer {
private Context context;
private TextureCube cube;
private TextureRoad road;
private TextureTree tree;
private TextureSome some;
float angleX = 0; // по Х Влево вправо
float angleY = 0; // по У
public float z = -50; // ZOOM
float spinRotate;
private float zoomIn;
private float zoomOut;
public void GLZoomControls() {
Log.e("ONO", "ONO JIVOE");
z +=1;
}
public class Zoom {
MyGLRenderer renderer;
private float zoomIn;
private float zoomOut;
int ZoomFlag;
public void GLZoomControls() {
Log.e("ONNNO", "ONO JIVOE");
z +=1;
}
}
//Конструктор для построения
public MyGLRenderer(Context context) {
this.context = context;
cube = new TextureCube(); // текстуры куба
road = new TextureRoad(); // текстуры дороги
tree = new TextureTree(); // текстуры дерева
some = new TextureSome();
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Цвет черный
gl.glClearDepthf(1.0f); // Глубина цвета
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); //
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glDisable(GL10.GL_DITHER);
cube.loadTexture(gl, context); // Загрузка текстуры куба
road.loadTextureRoad(gl, context); // Загрузка текстуры дороги
tree.loadTextureTree(gl, context); // загрузка текстуры дерева
some.loadTextureSome(gl,context);
gl.glEnable(GL10.GL_TEXTURE_2D); // Наложение текстуры
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
if (height == 0) height = 1;
float aspect = (float)width/height;
//просмотр
gl.glViewport(0, 0, width, height);
// Перспектива
gl.glMatrixMode(GL10.GL_PROJECTION); // выбор матрицы
gl.glLoadIdentity(); // обновление матрицы
GLU.gluPerspective(gl, 45, aspect, 0.1f, 150000.0f);
gl.glPushMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW); // Выбираем модель просмотра матрицы
gl.glLoadIdentity(); // обновление положение
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// ----- Рендеринг ----- //
gl.glLoadIdentity(); // обновляем положение
//проверка пола
if (z == -16) {
//Движение сцены
z = -18;
}
gl.glTranslatef(angleY/16,-angleX/16, 0); //перемещает Z X Y
GLU.gluLookAt(gl, 3, -z/2, 0, 0, 0, 0, 0, 1, 0); //посмотрим что выйдет :D
gl.glRotatef(spinRotate,0,1,0);
//ОПТИМИЗИРОВАТЬ РИСОВКА ТОЛЬКО ПОСЛЕ ИЗМЕНЕНИЯ ЗУМА или ПОСЛЕ ТАЧА
//проверка на флаг
cube.draw(gl); // Рисуем куб
road.drawRoad(gl); // Рисуем дорогу
tree.drawTree(gl); // Рисуем дерево
some.drawSome(gl);
}
}
请帮助我,我不知道我做错了;
嗨,我在MyGLRenderer中有一个构造函数。我编辑了我的问题(MyGLRenderer完整的代码),只是不太明白我把cotnstructor放在哪里。 – Vladimir
@Vladimir您应该从Activitiy'onCreate()'方法或'MyGLSurfaceView'中调用它。所以,像'myGLRenderer = new MyGLRenderer();'。 – Reaper
我这样做,但我有一个问题,工作室要我在MyGLRenderer中创建另一个构造函数,但我有一个,在哪里使用纹理。我尝试写myGLRenderer = new MyGLRenderer(Contex上下文);但不行; [ – Vladimir