2010-12-02 15 views
7

Oyun alanının haritasını görüntüleyen bir GLSurfaceView oluşturmaya çalışıyorum. Oyuncu hareket ettiğinde, oyun aktivitesi highlightSpot'u çağırır ve bu da bir render isteğini tetiklemelidir. Görünümü yeniden çizmek istediğim tek zaman, oyuncunun hareket ettiği zamandır.GLSurfaceView, render kipi değiştirilmesine rağmen sürekli olarak iş görür

Ancak, şu anki uygulamamla birlikte, GLSurfaceView cihazımda setRenderMode(RENDERMODE_WHEN_DIRTY) numaralı telefonu aramasına rağmen, render modu hala sürekli görünüyor. Kontrol etmek için, onDrawFrame yöntemimde tek bir println ifadesini attım ve uygulamamı çalıştırdığımda, çıktı, oyuncunun bir kez bile taşınmadan logcat'ımı hızla doldurmasına neden oluyor. Görünümü yalnızca sorulduğunda render etmek için yapmam gereken başka bir şey var mı?

(bu kodun toplu http://insanitydesign.com/wp/projects/nehe-android-ports/ de öğreticiler türetilmiştir. Ben oluşturma modunu değiştirme veya bu yöntemlerin herhangi bir yerinde kılmak isteğinde değilim ben, özlü uğruna benim onDrawFrame, OnSurfaceChanged ve onSurfaceCreated yöntemleri ihmal birisi alakalı olabileceğini düşünüyorsa., ben de o yayınlayabilirsiniz.)

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(); 
    } 
} 

cevap

6

Tamam, ben bu dizildi bulduk. Oluşturma modunu ayarlama yeri, GLSurfaceView yapıcısında değil, GLSurfaceView nesnesini içeren sınıf gibi görünüyor. Ayrıca (the Android documentation for GLSurfaceView içinde gözardı ettiğim bir şey), oluşturucusunu ayarlamadan önce GLSurfaceView'un render modunu ayarlayamazsınız. Bu, belki de oluşturucuda oluşturma modunu ayarlama girişimi çalışmaz. Not

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

:

Bu benim istediğim tam olarak ne olduğu, bunu istemek sadece işlemek için zorlamak gibi görünüyor bu sabitleme sonra, ben de benim highlightSpot işlevinde requestRender deyimi kaldırıldı, günümüze dek call requestReter, şimdi yerine taşıyın. VurgulayınSpot'ta çalışacağına inanıyorum, ama sadece bir kez aramam gerekiyor. –

+1

Aslında, hayır, highlightSpot() işlevinde işe yaramaz çünkü GLSurfaceView nesnesinde, renderer olarak kullandığım SurfaceViewClass nesnesinde değil çağrılmalıdır. Bu iki soruyu sormazsam, bu soruyu tamamen sormaktan kaçınmış olabilirim. –

İlgili konular