Es momento de revisar un poco el código que tenemos escrito y reordenar un poco, hacerlo un poco más «elegante».
Si vemos en el método paint(), tenemos tres bloques de código que son idénticas; es la iteración que recorren las tres listas (box,weapon y fruit) para ir dibujando en la ventana, si recordamos sabemos que las clases Box, Weapon y Fruit implementan la interface Element; es decir que con muy poquitos cambios podemos mejorar.
En la interface Element incorporaremos dos metodos:
public interface Element {
/** resto del codigo **/
public boolean isVisible();
public BufferedImage getImage();
}
Será necesario renombrar los métodos que devuelven BufferedImage de las clases: Box, Weapon, Fruit y tambien Player, puesto que implementa la interface.
En Player debemos implementar isVisible(),solo hacemos que devuelva true:
public boolean isVisible() {
return true;
}
Dentro de RunnerOne definimos un nuevo método:
private void drawList(ArrayList itemList,Graphics g) {
if(!itemList.isEmpty()) {
Iterator it = itemList.iterator();
while(it.hasNext()) {
Element el = (Element)it.next();
if(el.isVisible()) {
g.drawImage(el.getImage(),el.getX(),el.getY(), null);
}
}
}
}
Si vemos el bloque de código que ejecuta, es similar a lo que tenemos escrito en paint(), cambia el hecho que en lugar de castear el objeto a un Box, Fruit o Weapon lo hacemos a Element; el resto es idéntico.
Por último modificamos paint() para invocar al método drawList() por cada una de las listas que tenemos:
public void paint(Graphics g) {
/** resto del codigo **/
drawList(listFruit, g);
drawList(listBox, g);
drawList(listWeapon, g);
/** resto del codigo **/
}
De esta forma hacemos uso de la interfaz para reutilizar codigo.