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.