1. En esta práctica vamos a crear un Applet Java donde una pelota rebota en los límites de un recinto. Se utiliza la técnica del
doble buffer para evitar parpadeos y para asegurar que la imagen está cargada se utiliza un objeto MediaTracker.
import java.applet.*;
import java.awt.*;
public class PelotaRebote extends Applet implements Runnable{
private static final long serialVersionUID = 1L;
private static final int ANCHO_APPLET = 250;
private static final int ALTO_APPLET = 310;
private static final int T_PAUSA = 10;
private static final int VELOCIDAD = 3;
//---
private static final int K = 50;
//---
private Thread hilo;
private Image pelota;
//Doble_Buffer::Evitar parpadeo
Graphics doble_buffer;
Image imagen_db;
//Propiedades de la pelota
private int direc_X = 1;
private int direc_Y = 1;
private int pelota_X, pelota_Y;
private int limite_der, limite_izq, limite_inf, limite_sup;
bitCoach::Juan Bautista Cascallar Lorenzo
2. public void init(){
precarga_de_imagenes();
//--- doble buffer ---
imagen_db = createImage(2*K + ANCHO_APPLET, 2*K + ALTO_APPLET);
doble_buffer = imagen_db.getGraphics();
//valores iniciales de la pelota
pelota_X = (2 * K + ANCHO_APPLET) / 2;
pelota_Y = (2 * K + ALTO_APPLET) / 2;
limite_izq = K; //pared izquierda
limite_der = ANCHO_APPLET + K - pelota.getWidth(this);
limite_sup = K;
limite_inf = ALTO_APPLET + K - pelota.getHeight(this);
}
public void precarga_de_imagenes(){
pelota = getImage(getCodeBase(), "pelota.gif");
//--- Utilizamos el tracker para asegurar que se carga la imagen (precarga) ---
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(pelota, 0);
try{
tracker.waitForAll();
}catch(InterruptedException e){}
}
public void start(){
hilo = new Thread(this);
hilo.start();
}
public void run(){
while(true){
actualizar_datos();
repaint();//Llama a update()
try{
Thread.sleep(T_PAUSA);
}catch(Exception e){};
}
}
public void actualizar_datos(){
//Rebotes de la pelota con las paredes
boolean reb_x = (pelota_X <= limite_izq) || (pelota_X >= limite_der);
boolean reb_y = (pelota_Y >= limite_inf) || (pelota_Y <= limite_sup);
//Si rebota en las paredes izq o der cambia la dirección del movimiento en el eje X.
if(reb_x){ direc_X = -direc_X; }
//Si rebota en las paredes inf o sup cambia la dirección del movimiento en el eje Y.
if(reb_y){ direc_Y = -direc_Y; }
//actualiza la posición de la pelota
pelota_X = pelota_X + (VELOCIDAD * direc_X);
pelota_Y = pelota_Y + (VELOCIDAD * direc_Y);
}
public void update(Graphics g){
paint(g);
}
bitCoach::Juan Bautista Cascallar Lorenzo
3. public void paint(Graphics g){
// --- Relleno de Fondo del Applet ---
doble_buffer.setColor(Color.GRAY);
doble_buffer.fillRect(K - 5, K -5, ANCHO_APPLET + 10, ALTO_APPLET + K + 5);
doble_buffer.setColor(Color.WHITE);
doble_buffer.drawString("Java Applet::Pelota Rebotona", K, ALTO_APPLET + K + 15);
doble_buffer.drawString("bitCoach::Juan Bautista Cascallar Lorenzo", K, ALTO_APPLET + K + 30);
//Vaciamos el doble_buffer
doble_buffer.fillRect(K, K, ANCHO_APPLET , ALTO_APPLET);
//pintamos la pelota
doble_buffer.drawImage(pelota,pelota_X,pelota_Y,this);
//Volcamos todo los pintado en segundo plano al objeto Graphics del Applet
g.drawImage(imagen_db, 0, 0, this);
}
public void stop(){
if(hilo != null){
hilo = null;
}
}
}//FIN CLASE
bitCoach::Juan Bautista Cascallar Lorenzo