viernes, 27 de julio de 2007

Applet de una bola rebotando

Para aprender a programar applets y a controlar los loops, me han mandado programar una bola que rebota. Analizo el programa:

La clase Applet implementa varios métodos a los que llama de manera predeterminada y que podemos o tenemos que hacerles override. Los dos más importantes son init y paint(Graphics g). Pretenden que en init se carguen los datos iniciales y se instancien las declaraciones de objetos. En el caso de que también se trabaje con animaciones, que implican una sucesión de operaciones intercaladas por interrupciones de una longitud que podemos determinar, necesitamos recurrir a la clase Thread. Los Thread representan hilos de proceso. Paint, que recibe como parámetro una instancia de la clase abstracta Graphics, puede hacer dos cosas: o bien pinta la bola, con lo que recibiría los datos de anchura, altura, color, etc. de la bola, o bien invocamos un método pinta de la bola.

public void init() {

height=this.getBounds().height;
width=this.getBounds().width;

bola=new Bola(200,201);
ThreadBola t=new ThreadBola();
t.start();

}


public void paint(Graphics g) {

bola.pinta(g);

}

Guardo en los atributos estáticos height y width la altura y la anchura del applet respectivamente. Llamo al constructor de la clase Bola pasándole las coordenadas en las que quiero que la pelota aparezca. Como se ve, basta con llamar al método start del objeto ThreadBola para que él mismo se organice.

Necesito una clase que represente a la bola en sí. La clase Bola consiste en un constructor que la coloca en unas coordenadas preestablecidas de la pantalla y que inicializa la dirección en la que se moverá por ambos ejes. Además, la clase ThreadBola necesitará que se mueva a razón de una vez por "fotograma", así que también será necesario implementar un método mueve. Quiero que la bola se pinte a sí misma, por así decirlo, así que tendré que implementar otro método pinta al que se le pase el objeto de tipo Graphics.

public Bola() {

//Empieza.

xpos=100;
ypos=100;
dirx=xpos % 10 +1;
diry=ypos % 10 +1;


}


public void mueve() {

if (xpos<0||xpos>=appletBola.width) {
dirx=-dirx;}

if(ypos<0||ypos>appletBola.height) {
diry=-diry;}

xpos+=dirx;
ypos+=diry;

}


public void pinta(Graphics g) {
g.setColor(color);
g.fillOval(xpos, ypos, 20, 20);
}


El método mueve tiene que controlar que no haya llegado a los límites de la pantalla. Si lo ha hecho, ya sea en el eje y o en el eje x, alteraré la dirección del movimiento en ese eje. Obliga a la bola a tomar la dirección opuesta a la que llevaba en el eje en el que se cumpla la condición. Además, sumo la dirección en x a la posición que tenía anteriormente y lo mismo con la dirección en y.

La clase Thread funciona de la siguiente manera. Después de que se llame al método start, el objeto llama la función run, que engloba la operativa principal de la clase. Primero comprueba si el hilo no se ha interrumpido por algún motivo, caso en el que no ejecutaría las operaciones. Dentro de la dinámica de cada "fotograma", le decimos a la pelota que se mueva mediante el método mueve. Llamamos entonces al método repaint del applet, que a su vez hemos organizado de manera que llame al método pinta de la bola. Por último, indicamos las unidades de tiempo durante las que el thread "dormirá". Cuando menor sea el número, más rápido se moverá la bola.


public void run() {

while(true)
{


bola.mueve();
repaint();

try { Thread.sleep(15);
} catch (InterruptedException exc) { }

}

}


Subiría el resultado, pero soy pobre y vago. Imagináoslo.

2 comentarios:

Anónimo dijo...

I really like when people are expressing their opinion and thought. So I like the way you are writing

Anónimo dijo...

Hola muy bueno tu ejemplo. estoy tratándolo de hacer en eclipse JAVA pero me sale un error por que me dice que 'appletBola' no se puede resolver. solo queria saber De donde sale esta palabra o que debo de hacer para que no me salga el error?