Hallo!
Ich habe ein (Verständnis-) Problem was die Vererbung von Methoden bei Klassen angeht.
Und zwar versuche ich eine 3D-Anwendung mit OpenGL zu schreiben.
Dazu habe ich eine Klasse "Mesh" die Methoden für z.B. den Vertex-Buffer zur Verfügung stellt.
"Mesh" wird erweitert durch die Klasse "Plane" welche mir eine 2 dimensionale Fläche erstellt - ein Rechteck. Dann habe ich mir eine Klasse "Cube" erstellt.
"Cube" erweitert "Plane" denn ich wollte mir aus 6 Planes den Cube erstellen.
Beim Ausführen des Programms, direkt nach dem Start, stürzt es aber ab.
public class Mesh {
// vertex buffer
private FloatBuffer vertexBuffer;
/* ... */
protected void setVertices(float[] vertices){
// Vertices in den Buffer schieben
}
/* ... */
public void draw(GL10 gl){
/* ... */
// Vertex-Buffer verwenden
// auf diese Zeile deutet später der Fehler
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
/* ... */
}
}
public class Plane extends Mesh {
// Vertex-Array
private float[] vertices;
/* ... */
public Plane(/*...*/){
// Plane berechnen
// Koordinaten stehen in vertices
/*
* an der Stelle "funktioniert" es mit dem Aufruf von setVertices()
*/
// ruft setVertices aus "Mesh" auf, schiebt Vertices in den Buffer
// setVertices(vertices);
}
/*
* wenn ich diese Funktion aufrufe, "funktioniert" es nicht
*/
public void drawPlane(){
// ruft setVertices aus "Mesh" auf, schiebt Vertices in den Buffer
// damit gibt es Probleme
setVertices(vertices);
}
}
public class Cube extends Plane {
// eine Seite des Würfels
private Plane bottomPlane;
/* ... */
public Cube(/*...*/){
bottomPlane = new Plane(/*...*/);
/* mit diesem Aufruf "funktioniert" es nicht wenn setVertices
* in drawPlane aufgerufen wird */
// bottomPlane.drawPlane();
/* mit diesem Aufruf "funktioniert" es */
drawPlane();
}
}
So, was funktioniert denn nun nicht...
Ich habe eine Renderklasse in der ich mir den Würfel (Cube) erstelle.
public class GLRenderer implements GLSurfaceView.Renderer {
private Cube myCube;
// Constructor
public GLRenderer(){
myCube = new Cube(/*...*/);
}
// wird mit jedem Frame ausgeführt
@Override
public void onDrawFrame(GL10 gl){
/* auf diese Zeile zeigt der Fehler wenn ich
* bottomPlane.drawPlane(); in "Cube" aufrufe
myCube.draw(gl);
}
}
Also wenn ich setVertices(vertices);
im Constructor von Plane aufrufe und den Aufruf von
drawPlane();
im Constructor von Cube weglasse, dann erstellt mir meine Renderklasse das Plane und ich kann es in onDrawFrame anzeigen lassen: myCube.draw(gl);
Wenn ich im Constructor von Cube aber bottomPlane.drawPlane();
aufrufe, stürzt die Anwendung mit Hinweis auf diese 2 Zeilen ab (gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);[code] und [code lang=javascript] myCube.draw(gl);
). NullPointerException. Ist vertexBuffer leer??
Wenn ich aber nur drawPlane(); in Cube aufrufe, wird das Plane angezeigt.
Kann mir jemand einen Tipp geben wo ich hier in die falsche Richtung denke?
Wieso funktioniert drawPlane() aber nicht bottomPlane.drawPlane()?
Die Funktion bottomPlane.drawPlane() wird ja ausgeführt, wieso bekomme ich also eine NullPointerException?
Danke für eure Hilfe und noch einen schönen Sonntag!