package com.miviclin.droidengine2d.engine;

import android.opengl.GLSurfaceView;

import com.miviclin.droidengine2d.graphics.GLRenderer;
import com.miviclin.droidengine2d.graphics.GLView;

/**
 * Gestor principal del engine. Maneja el hilo del juego y el hilo del renderer.
 * 
 * @author Miguel Vicente Linares
 * 
 */
public class Engine {
	
	private GameThread gameThread;
	private GLRenderer renderer;
	private GLView glView;
	
	/**
	 * Crea un Engine.<br>
	 * AndroidEngine utiliza OpenGL ES 2.0, por tanto, es recomendable comprobar primero si el dispositivo soporta OpenGL ES 2.0. Ejemplo:
	 * 
	 * <pre>
	 * {@code Engine engine;
	 * if (detectOpenGLES20()) {
	 *     engine = new Engine(...);
	 * } else {
	 *     // Indicar al usuario que su dispositivo no soporta OpenGL ES 2.0 y cerrar la app
	 * }
	 * </pre>
	 * 
	 * @param game Juego
	 * @throws IllegalArgumentException Si el juego es null
	 */
	public Engine(Game game) {
		EngineLock engineLock = new EngineLock();
		if (game == null) {
			throw new IllegalArgumentException("The Game can not be null");
		}
		this.glView = new GLView(game.getActivity());
		this.glView.setEGLContextClientVersion(2);
		this.gameThread = new GameThread(game, glView, engineLock);
		this.renderer = new GLRenderer(game, engineLock);
	}
	
	/**
	 * Lanza los hilos del Juego y GLView e inicia el juego
	 */
	public void startGame() {
		gameThread.start();
		glView.setRenderer(renderer);
		glView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
	}
	
	/**
	 * Pausa los hilos del juego. Llamar en Activity.onPause()
	 */
	public void onPause() {
		glView.onPause();
		gameThread.pause();
	}
	
	/**
	 * Reanuda los hilos del juego. Llamar en Activity.onResume()
	 */
	public void onResume() {
		glView.onResume();
		gameThread.resume();
	}
	
	/**
	 * Para el juego. Llamar cuando se termine la aplicacion.
	 */
	public void onFinish() {
		gameThread.terminate();
	}
	
	/**
	 * Devuelve el GLView
	 * 
	 * @return GLView
	 */
	public GLView getGlView() {
		return glView;
	}
	
}

@@ -37,16 +37,45 @@
 ngine;%0A%0A
+import android.app.Activity;%0A
 import a
@@ -452,16 +452,44 @@
 glView;%0A
+%09private Activity activity;%0A
 %09%0A%09/**%0A%09
@@ -1333,16 +1333,162 @@
 eLock);%0A
+%09%09this.activity = game.getActivity();%0A%09%7D%0A%09%0A%09/**%0A%09 * Devuelve el GLView%0A%09 * %0A%09 * @return GLView%0A%09 */%0A%09public GLView getGlView() %7B%0A%09%09return glView;%0A
 %09%7D%0A%09%0A%09/*
@@ -1762,16 +1762,136 @@
 nPause()
+%3Cbr%3E%0A%09 * Si se ha llamado a onPause() porque la Activity se esta cerrando, este metodo llama a %7B@link Engine#onFinish()%7D
 %0A%09 */%0A%09p
@@ -1951,24 +1951,75 @@
 ad.pause();%0A
+%09%09if (activity.isFinishing()) %7B%0A%09%09%09onFinish();%0A%09%09%7D%0A
 %09%7D%0A%09%0A%09/**%0A%09 
@@ -2172,24 +2172,33 @@
 %09 * Para el 
+hilo del 
 juego. Llama
@@ -2235,172 +2235,374 @@
 ion.
-%0A%09 */%0A%09public void onFinish() %7B%0A%09%09gameThread.terminate();%0A%09%7D%0A%09%0A%09/**%0A%09 * Devuelve el GLView%0A%09 * %0A%09 * @return GLView%0A%09 */%0A%09public GLView getGlView() %7B%0A%09%09return glView
+%3Cbr%3E%0A%09 * Si se sobreescribe este metodo, se debe llamar a %7B@code super.onFinish()%7D para que el hilo del juego se destruya al salir de la%0A%09 * aplicacion, de lo contrario podria quedarse funcionando en segundo plano. Este metodo es llamado por %7B@link Engine#onPause()%7D cuando%0A%09 * la Activity se esta cerrando.%0A%09 */%0A%09protected void onFinish() %7B%0A%09%09gameThread.terminate()
 ;%0A%09%7D

Call onFinish() from Engine.onPause()