2010-12-02 4 views
7

Ich versuche eine GLSurfaceView zu erstellen, die eine Karte eines Spielbereichs anzeigt. Wenn der Spieler sich bewegt, ruft die Spielaktivität highlightSpot auf, was wiederum eine Render-Anfrage auslösen sollte. Ich möchte die Ansicht nur dann neu zeichnen, wenn der Spieler sich bewegt.GLSurfaceView rendert kontinuierlich, obwohl sich der Rendermodus ändert

Allerdings, mit meiner aktuellen Implementierung, trotz Aufruf setRenderMode(RENDERMODE_WHEN_DIRTY) auf meinem GLSurfaceView, scheint seine Render-Modus weiterhin kontinuierlich. Um dies zu überprüfen, habe ich eine einzelne println-Anweisung in meine onDrawFrame-Methode geschrieben, und wenn ich meine Anwendung ausführe, füllt die Ausgabe schnell mein logcat aus, ohne dass der Player sich einmal bewegt - es verhält sich eindeutig nicht so, wie ich es beabsichtigt hatte. Gibt es noch etwas, das ich tun muss, damit die Ansicht nur auf Anforderung gerendert wird?

(Der größte Teil dieses Codes ist bei http://insanitydesign.com/wp/projects/nehe-android-ports/ aus den Tutorials abgeleitet. Ich meine onDrawFrame weggelassen, OnSurfaceChanged und onSurfaceCreated Methoden aus Gründen der Prägnanz, als ich den Render-Modus nicht am Wechsel oder ein in diesen Verfahren überall anfordernden machen Wenn jemand denkt, dass es relevant sein könnte, kann ich das auch posten.)

public class SurfaceViewClass extends GLSurfaceView implements Renderer { 
    public SurfaceViewClass(Context context) { 
     super(context); 

     ... 

     this.setRenderer(this); 
     this.setRenderMode(RENDERMODE_WHEN_DIRTY); 
    } 

    public void highlightSpot(int x, int y) { 
     /* change some variables here */ 
     ... 

     this.requestRender(); 
    } 
} 

Antwort

6

OK, ich denke, ich habe das aussortiert. Die Stelle, an der der Rendermodus festgelegt wird, scheint die Klasse zu sein, die Ihr GLSurfaceView-Objekt enthält, nicht den GLSurfaceView-Konstruktor. Auch (etwas, das ich in the Android documentation for GLSurfaceView übersehen habe) kann man den Render-Modus der GLSurfaceView nicht einstellen, bevor man seinen Renderer setzt. Dies ist möglicherweise der Grund, warum der Versuch, den Rendermodus im Konstruktor festzulegen, nicht funktioniert.

Dies scheint es zu zwingen, nur zu machen, wenn ich es will, das ist genau das, was ich wollte:

public class Game extends Activity { 
private GLSurfaceView glSurface; 
private SurfaceViewClass svc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    glSurface = (GLSurfaceView) findViewById(R.id.SurfaceView01); 

    svc = new SurfaceViewClass(this); 
    glSurface.setRenderer(svc); 
    glSurface.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

public void movePlayer() { 
    svc.highlightSpot(location[PLAYER], 0); 
    glSurface.requestRender(); 
} 
} 
+0

Hinweis: Nach dieser Fixierung ich auch die requestRender Aussage in meiner highlightSpot Funktion entfernt, da ich Rufen Sie stattdessen requestRender von movePlayer() jetzt. Ich glaube, es würde in highlightSpot gut funktionieren, aber ich muss es nur einmal aufrufen. –

+1

Eigentlich nein, in highlightSpot() würde es nicht funktionieren, da es im GLSurfaceView-Objekt aufgerufen werden muss, nicht im SurfaceViewClass-Objekt, das ich als Renderer verwende. Ich hätte es vermeiden können, diese Frage überhaupt stellen zu müssen, wenn ich die beiden nicht zusammengeführt hätte. –

Verwandte Themen