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------------------------------