2011-08-01 3 views
1

J'essaie d'initialiser GL11 parce que je faisais référence à une troublante méthode qui avaitExceptionInInitializerError

GL11 gl 

comme argument. J'ai essayé de l'initialiser dans ma classe renderer, mais il ne fonctionne pas si je pensais que l'initialisation a été déconner avec le moteur de rendu et a créé une nouvelle classe pour initialiser dans.

import javax.microedition.khronos.egl.EGL10; 
import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.egl.EGLContext; 
import javax.microedition.khronos.egl.EGLDisplay; 
import javax.microedition.khronos.opengles.GL11; 

import android.opengl.GLU; 



public class Unproject { 

public static float setx; 
public static float sety; 
public static float posx, posy, posz; 

EGLConfig[] configs = new EGLConfig[1]; 
EGLConfig config = configs[0]; 
static EGLContext glContext; 
public static GL11 gl = (GL11)glContext.getGL(); 
EGLDisplay dpy = ((EGL10) gl).eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 

public Unproject() { 
    glContext = ((EGL10) gl).eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null); 
} 

    public static void vector3 (GL11 gl){ 

     int[] viewport = new int[4]; 
     float[] modelview = new float[16]; 
     float[] projection = new float[16]; 
     float winx, winy, winz; 
     float[] newcoords = new float[3]; 

     gl.glGetIntegerv(GL11.GL_VIEWPORT, viewport, 0); 
     gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelview, 0); 
     gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection, 0); 

     winx = (float)setx; 
     winy = (float)viewport[3] - sety; 
     winz = 0; 

     GLU.gluUnProject(winx, winy, winz, modelview, 0, projection, 0, viewport, 0, newcoords, 0); 
     posx = (int)newcoords[1]; 
     posy = (int)newcoords[2]; 
     posz = (int)newcoords[3]; 


    } 
} 

Vector3 est la méthode que je faisais problème avec. Je l'ai déplacé ici dans cette classe à partir du moteur de rendu.

Voici mon renderer:

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 
import javax.microedition.khronos.opengles.GL11; 


import android.opengl.GLU; 
import android.opengl.GLSurfaceView.Renderer; 
import android.view.MotionEvent; 


public class GLSurfaceRenderer implements Renderer{ 


public float setx, sety; 
private float posx, posy, posz; 
private double speed; 
private static float rotation; 
private static float statrotation; 

GL11 gl; 



private static FlatColoredSquare square; 
private static FlatColoredSquare statSquare; 



    public GLSurfaceRenderer() { 

    square = new FlatColoredSquare(); 
    statSquare = new FlatColoredSquare(); 
    rotation = (float) Math.floor(Math.random()*361); 
    speed = 0.1;  

} 
    public synchronized void randomMethod(MotionEvent event){ 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 
     setx = event.getX(); 
     sety = event.getY(); 
     Unproject.vector3(gl); 
     } 
    } 

@Override 
public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | 
      GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    gl.glScalef(10, 10, 0); 
    gl.glPushMatrix(); 
    gl.glRotatef(rotation, 0, 0, 1); 
    gl.glTranslatef((float) speed/10, 0, 0);  
    square.draw(gl);  
    gl.glPopMatrix(); 

    gl.glPushMatrix(); 
    gl.glTranslatef(posx, posy, posz); 
    gl.glRotatef(statrotation,0,0,1); 
    statSquare.draw(gl); 
    gl.glPopMatrix(); 


    statrotation++; 
    speed++;  

} 





@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0.0f, width, 0.0f, height); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    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); 

} 



} 

Unfortuanatly ce code va lancer un ExceptionInInitializerError

08-01 17:01:34.672: ERROR/AndroidRuntime(421): Uncaught handler: thread main exiting due to uncaught exception 
08-01 17:01:34.762: ERROR/AndroidRuntime(421): java.lang.ExceptionInInitializerError 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.GLSurfaceRenderer.randomMethod(GLSurfaceRenderer.java:44) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.Practice.onTouchEvent(Practice.java:37) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.Activity.dispatchTouchEvent(Activity.java:2064) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1690) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.os.Looper.loop(Looper.java:123) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ActivityThread.main(ActivityThread.java:4310) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at dalvik.system.NativeStart.main(Native Method) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421): Caused by: java.lang.NullPointerException 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  at android.app.ui.Unproject.<clinit>(Unproject.java:22) 
08-01 17:01:34.762: ERROR/AndroidRuntime(421):  ... 13 more 

Est-ce que je peux faire pour corriger cela? Suis-je complètement dans le mauvais arbre? Je pense que c'est peut-être la façon dont je partage les variables entre les classes, y a-t-il une meilleure façon de le faire?

Répondre

1

Il semble que l'erreur que vous obtenez est due à une exception NullPointerException dans votre initialisation de classe.

static EGLContext glContext; 
public static GL11 gl = (GL11)glContext.getGL(); 

Vous remarquerez que vous essayez d'appeler getGl() d'une instance de EGLContext qui n'est pas initialisé. Vous devrez d'abord attribuer glContext à quelque chose avant de pouvoir l'utiliser. La pile indique <clinit>, ce qui n'est pas très utile si vous ne savez pas ce que cela signifie. Il fait référence à l'initialisation de la classe, qui est ce qui se passe lorsque les membres statiques sont initialisés (comme dans ce cas), mais il pourrait également faire référence à un bloc d'initialisation statique qui ressemble à ceci:

static { 
    //some static init code 
} 

La raison pour laquelle ExceptionInInitializerError est Throw probablement parce que quelque chose de plus haut attrape toutes les exceptions, et les enveloppe dans le ExceptionInInitializerError.

+0

Des suggestions sur ce à quoi peut affecter glContext. Quelqu'un a suggéré DEPTH_BUFFER mais il n'acceptera pas que = ( – Jack

+0

Basé sur la documentation, il a un constructeur public No-Arg: http://developer.android.com/reference/javax/microedition/khronos/egl/EGLContext.html #EGLContext() –

+0

Un peu plus bas dans mon code je lui attribue des choses, ai-je besoin de le déplacer au-dessus de GL11? Problème avec ça malheureusement parce que glContext utilise GL11 dans sa définition donc erm =/ – Jack

2

Based on this documentation Une erreur ExceptionInInitializerError est émise pour indiquer qu'une exception s'est produite lors de l'évaluation d'un initialiseur statique ou de l'initialiseur d'une variable statique. Vérifiez que votre code a une logique d'initialisation statique.

Questions connexes