2017-07-20 41 views
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); 
    } 
} 

请帮助我,我不知道我做错了;

回答

0

您尚未初始化任何地方的myGLRenderer

当您使用private MyGLRenderer myGLRenderer;时,您只是创建了一个null对象引用。你应该通过调用构造函数来初始化它。

+0

嗨,我在MyGLRenderer中有一个构造函数。我编辑了我的问题(MyGLRenderer完整的代码),只是不太明白我把cotnstructor放在哪里。 – Vladimir

+0

@Vladimir您应该从Activitiy'onCreate()'方法或'MyGLSurfaceView'中调用它。所以,像'myGLRenderer = new MyGLRenderer();'。 – Reaper

+0

我这样做,但我有一个问题,工作室要我在MyGLRenderer中创建另一个构造函数,但我有一个,在哪里使用纹理。我尝试写myGLRenderer = new MyGLRenderer(Contex上下文);但不行; [ – Vladimir