Juego de plataforma en Java (8): Un poco de optimización

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *