GameLib y la clase Game
Creando la clase Game
Hasta el momento, nos hemos llevado un pequeño tiempo creando las bases de nuestro applet, que necesitaremos para todos nuestros juegos futuros. ¿Se imaginan tener que crear todo de nuevo cada vez que hagamos un nuevo juego? Además, con el tiempo, habrá ciertas partes del código que no necesitaremos ver ni modificar, como lo relacionado con el hilo del tiempo, y siempre estarán ahi, ocupando espacio de nuestro applet y confundiendonos al desplazarnos por nuestro applet conforme lo vayamos modificando. Afortunadamente, podemos crear una librería que nos permitirá almacenar ciertas clases comunes para todos nuestros juegos. Siendo este un juego muy básico, no haremos gran uso aun a esta librería, pero veremos en futuros juegos lo importante que será esta librería. Comencemos a crearla.
Para comenzar vayamos a nuestra carpeta "src". Demos clic con el botón derecho y en "nuevo" [new], elijamos "otro" [other]. En categoría elijamos "otro" [Other] y elijamos "carpeta" [Folder]. Nos pedirá un nombre, eligiremos el estandar "GameLib" (Librería de juego). No olvidemos la importancia de la diferencia entre minúsculas y mayúsculas.
Una vez que hayamos creado nuestro GameLib, daremos clic derecho y en "nuevo", elijamos "otro". De la categoría "Java" elijamos "clase de Java" [Java Class]. De nombre le pondremos "Game" y aceptemos. Nos abrirá nuestra nueva clase. Seleccionemos todo, y sustituyamoslo por el siguiente código:
package GameLib;
import java.applet.Applet;
import java.awt.Graphics;
public class Game extends Applet implements Runnable
{
Thread thd;
public void init()
{
}
public void start()
{
if(thd==null)
{
Thread thd=new Thread(this);
thd.start();
}
}
public void stop()
{
if(thd!=null)
{
thd.stop();
thd=null;
}
}
public void run()
{
while(true)
{
game();
repaint();
try
{
Thread.sleep(50);
}
catch(InterruptedException e){}
}
}
public void update(Graphics g)
{
paint(g);
}
public void game()
{
}
}
Como podremos ver, todo lo anterior ya lo vimos, por lo que no necesitaremos explicar mas que algunos detalles: Al principio tiene este código:
package GameLib;
Con esto, empaquetamos nuestra clase como parte del GameLib, para poderle llamar en futuras referencias. Luego, al final tenemos dos nuevas funciones:
public void update(Graphics g)
{
paint(g);
}
public void game()
{
}
Update es una función especial que llama a paint. De esta forma nos aseguramos que nuestro juego pueda ser dibujado. La segunda es muy posible que ya hayas visto que es llamada en nuestro run. La creamos para poderla "sobrecargar" desde nuestra clase principal, y poner todo el código de nuestro juego en su interior. Guardemos y cerremos nuestra clase, ya no tendremos que preocuparnos de ella nunca más durante el resto de nuestro curso.
Probando la clase Game
"Muy lindo, hemos creado la clase Game", has de decir, ¿Pero para que sirve exactamente? ¿Cómo funciona? Descuida, a continuación haremos un pequeño ejemplo que te mostrará como se usa esta clase especial. Vayamos al applet1, que será el que modificaremos para adaptarlo a nuestra nueva clase. Para empezar, ya no necesitaremos importar la clase applet, pues Game ya lo hace por si mismo, por otro lado, necesitaremos importar nuestra nueva librería, así que al comienzo de todo, agregaremos esta librería:
import GameLib.Game;
De esta forma llamamos a nuestra clase Game contenida en la GameLib, y así podremos usarle en nuestro código, Ahora, cambiaremos nuestra clase applet1 para que su extensión sea Game en lugar de Applet:
public class applet1 extends Game
Como podremos ver, nuestra clase applet1 ya no se imprementa como corrible, esto es por que nuestra clase Game ya lo hace, y por tanto no hay necesidad de hacerlo ahora. Tambien recordemos que en Game ya tenemos nuestro hilo de tiempo, así como el start() y el stop(), por lo que ya no los necesitaremos aquí, y podremos eliminarlos.
Por último, modificaremos la clase run(), cambiandole el nombre a game(), y quitando lo que ya está allá, que sería el while true, el repaint y el sleep, por lo que debería de quedarnos de la siguiente forma:
public void game()
{
// Aquí va el código de nuestro juego
x += 2;
y += 1;
}
Si lo has hecho todo bien, la clase applet1 debe verse ahora de esta forma:
import GameLib.Game;
import java.awt.Graphics;
import java.awt.Color;
public class applet1 extends Game
{
// Aquí se declaran nuestras variables
int x = 0;
int y = 0;
public void init()
{
// Comienza descarga asíncrona de recursos pesados
setBackground(Color.blue);
}
public void game()
{
// Aquí va el código de nuestro juego
x += 2;
y += 1;
}
public void paint(Graphics g)
{
// Aquí se dibujan todos los objetos
g.setColor(Color.yellow);
g.drawRect(x, y, 20, 10);
}
}
Como podremos ver, es mucho más corto y limpio ahora, mostrandonos solo la información que en verdad necesitamos ver. Corramos nuestra clase con Shift+F6 para comprobar que ha salido de forma correcta. ¡Muy buen trabajo!
Limpiando nuestra pantalla
¡Un segundo! Nuestro rectangulo se desplaza pero va dejando sus dibujos antes y no se limpia la pantalla ¿Qué ha pasado?... No te asustes, lo que pasa en verdad es algo muy sencillo y que no debe preocuparnos. Lo que pasa es que al llamar al paint desde update, olvidamos decirle que se limpiara la pantalla. Pero eso no es nada malo, por el contrario, hasta podremos sacarle ventaja en un futuro. Por ahora, tan solo agreguemos una sencilla línea a nuestro código para que se corrija el problema, quedando nuestro paint así:
public void paint(Graphics g)
{
// Aquí se dibujan todos los objetos
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.yellow);
g.drawRect(x, y, 20, 10);
}
ClearRect se encarga de limpiar una sección de nuestra pantalla con el color de fondo, en nuestro caso, le damos las coordenadas desde 0,0 hasta su ancho y alto, limpiando la pantalla por completo. IMPORTANTE: Recuerden que la limpieza de nuestra pantalla va hasta el principio de nuestro paint, de lo contrario, nada de lo que dibujemos antes se verá en pantalla.
"¿A que me refería con que podríamos sacar ventaja de esto?" Preguntarán. Más tarde cuando veamos como dibujar imagenes, podremos sustituir esta línea con una imagen de fondo de nuestra preferencia. Si no lo sustituyeramos, veríamos un molesto parpadeo, que actualmente está ahí, pero solo se nota mucho cuando se dibujan imagenes muy grandes. De esta forma, nuestra librería está lista y sabemos como usarla, por lo que estamos listos para comenzar a programar juegos.
Regresa al menú principal, y comienza ahora el curso de programación de nuestro primer juego.
![Un proyecto de Ayotli Diseño Web [Un proyecto de Ayotli Diseño Web]](../ayotli.png)