Arraylist y herencia

Voy a mostrar un ejemplo donde estoy probando el uso de herencia.

Hay tres clases,una que es una nave que se puede mover con las teclas y disparar,la otra clase es la encargada del disparo y por ultimo esta la clase padre que es la encargada de manejar un arraylist que actualizara todos los metodos draw de las clases hijas y añade un metodo para eliminar los objetos,ademas en el contructor se añade asi misma a la lista y las clases hijas que llamen a super() se añadiran a la lista.

Lo que me gustaria saber es si la clase padre esta diseñada correctamente,pero si no lo esta me gustaria saber como mejorarla o diseñarla de otra manera.

-archivo principal:

//prueba de veracidad
Jugador jugador1;

void settings(){
  size(640,480);
  noSmooth();
}

void setup(){
  frameRate(30);
  background(85,106,206);
  jugador1 = new Jugador();
}

void draw(){
  background(85,106,206);
  //jugador1.draw();
  Padre.draw_all();
}

-clase jugador:

//clase jugador--------------------------------------
class Jugador extends Padre{
  private float x,y,velocidad;
  private PImage grafico = loadImage("jugador.png");
  private Disparo disparo1;
  private int contador; 
  
  public Jugador(){
    super();
    imageMode(CENTER);
    this.x = 320;
    this.y = 400;
    this.velocidad = 5;
    this.contador = 0;
  }
  
  public void draw(){
    mover();
    disparar();
    image(grafico,x,y);
  }
  
  private void mover(){
    if(keyPressed && key == CODED && keyCode == LEFT){
      x -= velocidad;
    }else if(keyPressed && key == CODED && keyCode == RIGHT){
      x += velocidad;
    }
    
    if(keyPressed && key == CODED && keyCode == UP){
      y -= velocidad;
    }else if(keyPressed && key == CODED && keyCode == DOWN){
      y += velocidad;
    }
  }
  
  private void disparar(){
    contador++;
    if(keyPressed && key == 'z' && contador > 5){
      disparo1 = new Disparo(x,y); 
      contador = 0;
    }
  }

} //fin clase jugador------------------------------------

-clase disparo:

//clase disparo-----------------------------------
class Disparo extends Padre{
  private float x,y,velocidad;
  private PImage grafico = loadImage("disparo.png");
  
  public Disparo(float x,float y){
    super();
    imageMode(CENTER);
    this.x = x;
    this.y = y;
    this.velocidad = 3;
  }
  
  public void draw(){
    mover();
    eliminar();
    image(grafico,x,y);
  }
  
  private void mover(){
    y -= velocidad;
  }
  
  private void eliminar(){
    if(y < 64){
      live = false;
      //si padre.kill() esta descomentado en el metodo draw_all
      //de la clase padre este condicional no hace falta
      //solo es necesario pone la variable live en false
      if(live == false){
        kill();
      }
    }
  }
  
} //fin clase disparo---------------------------------

-clase padre:

//clase padre-----------------------------------
static class Padre{
  private static ArrayList<Padre> lista = new ArrayList<Padre>();
  public boolean live = true;
  
  public Padre(){
    lista.add(this);
  }
  
  public void draw(){
  }
  
   public static void draw_all(){
    for(int indice = lista.size()-1;indice >= 0;indice--){
      Padre padre = lista.get(indice);
      padre.draw();
      //con esto no hace falta llamar al metodo kill() 
      //en ninguna clase hija solo hay que poner live en false
      //descomentar padre.kill() si quieres que funcione
      //padre.kill(); 
    }
  }
  
  public void kill(){
    for(int indice = lista.size()-1;indice >= 0;indice--){
      Padre padre = lista.get(indice);
      if(padre.live == false){
        lista.remove(indice);
      }
    }
  }

} //fin clase padre------------------------------
2 Likes

Hola hokuto, la clase padre esta mal planteada, fijate que tienes un array llamado lista en cada instancia de la clase padre, esto no creo que sea lo que buscas, deberias hacer lista global y asi no tendrias este problema.

1 Like

Lo que pasa es que en todos los sitios te dicen que no uses variables globales que es muy malo,al final le he cogido miedo a usarlas jejeje.

Puedes mostrarme un ejemplo con la correcciones o mejoras que tu le añadirias,tambien podrias mirar la clase disparo y jugador para ver si tambien hay algo que corregir.