Sviluppare un gioco per Android – Lezione 11: da Canvas a OpenGL ES
Android Blog Italia.
Se avete seguito tutte le lezioni, avete appreso l’utilizzo di SurfaceView e dell’oggetto Canvas, la tela dentro la quale disegniamo. Utilizzando OpenGL ES il procedimento non è poi così diverso. Per effettuare il rendering di oggetti OpenGL, infatti, utilizziamo un’implementazione apposita di SurfaceView e un renderer OpenGL. Se siete pronti, possiamo iniziare.
Creazione del renderer OpenGL
Il primo passo consiste nell’implementare la classe GlRenderer, che potete vedere qui di seguito.
package com.example.lezioneopengl_androidblog;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class GlRenderer implements Renderer {
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
}
}
Al momento, trattandosi di una lezione introduttiva su OpenGL ES, lasceremo i tre metodi vuoti, quindi non faranno nulla e nella prossima lezione vedremo come utilizzarne qualcuno, l’importante è capire, per il momento, a cosa servono. Inoltre, come potete vedere, abbiamo implementato l’interfaccia android.opengl.GLSurfaceView.Renderer.
I metodi e l’attività principale
Diamo un’occhiata ai tre metodi del nostro renderer OpenGL:
- onSurfaceCreated(GL10 gl, EGLConfig config): è molto importante poiché ogni volta che il nostro dispositivo va in stato di sleep, è questo il metodo che viene utilizzato per ricreare la superficie (non solo per crearla quindi!). Questo, infatti, è il posto dove verranno caricate le nostre risorse (immagini, etc.) poiché dovete ricordare che, in stato di sleep, queste ultime vengono distrutte assieme al contesto di gioco;
- onSurfaceChanged(GL10 gl, int width, int height) : viene chiamato ogni volta che cambiano le dimensioni della nostra superficie; Principalmente, esso apporta modifiche alla nostra viewport, una regione rettangolare attraverso la quale vediamo il nostro gioco;
- onDrawFrame(GL10 gl): viene chiamato dal thread di rendering (creato di default da Android) per disegnare ogni singola immagine. Tutte le attività dedicate al disegno avvengono qui.
Vediamo, a questo punto, la nostra classe MainActivity.java:
public class MainActivity extends Activity {
/** La view OpenGL */
private GLSurfaceView glSurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// inizializza la view OpenGL e
// crea un'istanza con questa Activity
glSurfaceView = new GLSurfaceView(this);
// setta il nostro renderer principale
glSurfaceView.setRenderer(new GlRenderer());
setContentView(glSurfaceView);
}
@Override
protected void onResume() {
super.onResume();
glSurfaceView.onResume();
}
@Override
protected void onPause() {
super.onPause();
glSurfaceView.onPause();
}
}
Al rigo 4 abbiamo dichiarato la nostra view OpenGL fornita da Android: GLSurfaceView. Al rigo 17 l’abbiamo istanziata mentre al rigo 20 abbiamo passato il renderer alla view. Infine, al rigo 21, abbiamo informato la nostra attività di utilizzare la view OpenGL. I metodi onResume() e onPause() vengono sovrascritti e attivano i rispettivi metodi nella nostra view. Se provate ad avviare l’applicazione ora, avrete di fronte una schermata vuota.
Questo è tutto, siamo passati finalmente ad una configurazione OpenGL ES. Nella prossima lezione approfondiremo il discorso iniziando a parlare di come vengono visualizzati gli elementi, di quali sono quelli primitivi e, naturalmente, faremo qualche accenno ai concetti base di programmazione 3D. Per qualunque dubbio o chiarimento, come di consueto, non esitate a commentare l’articolo.
Sviluppare un gioco per Android – Lezione 11: da Canvas a OpenGL ES
Android Blog Italia.