BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

juego misiles en java-misiles del arraylist no se mueven

BocaDePez

Estoy empezando en programación y he querido hacer un juego de naves que lanzan misiles. Bueno la imagen del misil está hecha con BufferedImage pero para no tener que hacer un montón de misiles uno a uno he hecho un ArrayList y sí salen los misiles pero no se mueven.

El primer misil sí se dispara pero el resto no.

Si no les parece mal voy a poner el código de las dos clases involucradas haber si alguien puede darme alguna indicación. Creo que estoy cerca pero no doy con el fallo. Bueno aquí está el código de las clases:

clase misiles:

public class misiles implements KeyListener{

BufferedImage proyectil;

nave n;

Asteroids a;

ArrayList misil;

public int x=n.x;

int xa=1;

public int y=n.y;

int ya=1;

voyager v;

Sound sound;

misiles(Asteroids a){

loadImage();

misil=new ArrayList();

this.a=a;

}

public void loadImage(){

try{

proyectil=ImageIO.read(getClass().getClassLoader().getResource("imagenes/misilR.jpg"));

}catch(Exception e){

System.out.println("ERROR: No puedo cargar los misiles");

}

}

public void paintComponent(Graphics g){

g.drawImage(proyectil, x, y, a);

}

public void move(){

if(((x+xa)>0)&&(x+xa)

if(((y+ya)>0&&(y+ya)

x=x+xa;

y=y+ya;

}

}

}

@Override

public void keyTyped(KeyEvent e) {

// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

}

@Override

public void keyPressed(KeyEvent e) {

//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

if(e.getKeyCode()==KeyEvent.VK_SPACE){

xa=8;

sound.disparo.play();

}

if(e.getKeyCode()==KeyEvent.VK_Z){

a.obtenerMisil().add(new misiles(a));

}

}

@Override

public void keyReleased(KeyEvent e) {

// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

}

public Rectangle getBounds(){

return new Rectangle(x,y,5,1);

}

}

clase Asteroids:public class Asteroids extends JPanel{ JFrame frame; rocas r=new rocas(this); nave n=new nave(this); voyager v=new voyager(this); misiles m; ArrayList explosion; ArrayList misil; BufferedImage superexplosion; explosiones ex; Asteroids a; int score=0; public int x; public int xa=1; public int y; public int ya=1; Asteroids(){ misil=new ArrayList(); setSize(1300,850); cargarExplosion(); explosion=new ArrayList(); //si no lo ponemos da error NullPointerException m=new misiles(this); addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { }
@Override public void keyPressed(KeyEvent e) { n.keyPressed(e); m.keyPressed(e); }
@Override public void keyReleased(KeyEvent e) { n.keyReleased(e); } });{ setFocusable(true); Sound.marcha.loop(); } } public int score(){ return score; }public void paintComponent(Graphics g){ super.paintComponents(g); g.setColor(Color.BLACK); g.fillRect(0, 0, 1300, 850); r.paintComponent(g); n.paintComponent(g); m.paintComponent(g); v.paintComponent(g); dibujarExplosion(g); dibujarMisil(g); g.setColor(Color.GREEN); g.setFont(new Font("Verdana",Font.BOLD,39)); g.drawString("Naves destruidas: "+String.valueOf(score()),10,30); if(v.collision()){ g.setColor(Color.RED); g.setFont(new Font("Verdana",Font.BOLD,28)); g.drawString("Coordenadas X: "+String.valueOf(v.x),10,50); g.drawString("Coordenadas Y: "+String.valueOf(v.y),10,75); }
} public static void main(String[] args) throws InterruptedException { // TODO code application logic here JFrame frame=new JFrame(); Asteroids a=new Asteroids(); frame.add(a); frame.setTitle("Asteroids"); frame.setSize(1300,850); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setResizable(false); frame.setVisible(true); while(true){ a.move(); a.repaint(); Thread.sleep(15); } } public void move(){ r.move(); n.move(); m.move(); v.move(); } public ArrayList obtenerE(){ return explosion; } public void cargarExplosion(){ try{ superexplosion=ImageIO.read(getClass().getClassLoader().getResource("imagenes/particle_largeBall1.png")); }catch(Exception e){ System.out.println("No pude cargar explosion"); } } public void dibujarExplosion(Graphics g){ if(obtenerE().size()!=0){ ArrayList aux=obtenerE(); for(int i=0;i
public void dibujarMisil(Graphics g){ if(obtenerMisil().size()!=0){ ArrayList aux=obtenerMisil(); for(int i=0;i
}
Bueno, pues eso, un saludo y gracias.

BocaDePez

perdón, la clase Asteroids salió mal, aquí está de nuevo:

public class Asteroids extends JPanel{

JFrame frame;

rocas r=new rocas(this);

nave n=new nave(this);

voyager v=new voyager(this);

misiles m;

ArrayList explosion;

ArrayList misil;

BufferedImage superexplosion;

explosiones ex;

Asteroids a;

int score=0;

public int x;

public int xa=1;

public int y;

public int ya=1;

Asteroids(){

misil=new ArrayList();

setSize(1300,850);

cargarExplosion();

explosion=new ArrayList(); //si no lo ponemos da error NullPointerException

m=new misiles(this);

addKeyListener(new KeyListener() {

@Override

public void keyTyped(KeyEvent e) {

}

@Override

public void keyPressed(KeyEvent e) {

n.keyPressed(e);

m.keyPressed(e);

}

@Override

public void keyReleased(KeyEvent e) {

n.keyReleased(e);

}

});{

setFocusable(true);

Sound.marcha.loop();

}

}

public int score(){

return score;

}

public void paintComponent(Graphics g){

super.paintComponents(g);

g.setColor(Color.BLACK);

g.fillRect(0, 0, 1300, 850);

r.paintComponent(g);

n.paintComponent(g);

m.paintComponent(g);

v.paintComponent(g);

dibujarExplosion(g);

dibujarMisil(g);

g.setColor(Color.GREEN);

g.setFont(new Font("Verdana",Font.BOLD,39));

g.drawString("Naves destruidas: "+String.valueOf(score()),10,30);

if(v.collision()){

g.setColor(Color.RED);

g.setFont(new Font("Verdana",Font.BOLD,28));

g.drawString("Coordenadas X: "+String.valueOf(v.x),10,50);

g.drawString("Coordenadas Y: "+String.valueOf(v.y),10,75);

}

}

public static void main(String[] args) throws InterruptedException {

// TODO code application logic here

JFrame frame=new JFrame();

Asteroids a=new Asteroids();

frame.add(a);

frame.setTitle("Asteroids");

frame.setSize(1300,850);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLocationRelativeTo(null);

frame.setResizable(false);

frame.setVisible(true);

while(true){

a.move();

a.repaint();

Thread.sleep(15);

}

}

public void move(){

r.move();

n.move();

m.move();

v.move();

}

public ArrayList obtenerE(){

return explosion;

}

public void cargarExplosion(){

try{

superexplosion=ImageIO.read(getClass().getClassLoader().getResource("imagenes/particle_largeBall1.png"));

}catch(Exception e){

System.out.println("No pude cargar explosion");

}

}

public void dibujarExplosion(Graphics g){

if(obtenerE().size()!=0){

ArrayList aux=obtenerE();

for(int i=0;i

ex=(explosiones)aux.get(i);

g.drawImage(superexplosion, 650, ex.y, 650+1100, ex.y+1100, ex.obtenerCuadro()*40,0, ex.obtenerCuadro()*40+1100, 400, null);

//ojo poner en el constructor explosion=new ArrayList() si no da error NullPointerException

m.proyectil=null;//elimino el misil

}

}

}

public ArrayList obtenerMisil(){

return misil;

}

public void dibujarMisil(Graphics g){

if(obtenerMisil().size()!=0){

ArrayList aux=obtenerMisil();

for(int i=0;i

misiles m=(misiles)aux.get(i);

g.drawImage(m.proyectil, m.x, m.y,a);

}

}

}

}

🗨️ 1
superllo

Tienes un tag para añadir código y que no se descuadre la identación.

Saldría más o menos esto.
vukits
a.obtenerMisil().add(new misiles(a));

¿wtf?

Esta llamada es rarisima.

🗨️ 1
BocaDePez

Hola gracias por responder.

Sí:

if(e.getKeyCode()==KeyEvent.VK_Z){

a.obtenerMisil().add(new misiles(a));

}

esto lo hago para que cada vez que pulso la letra Z me añada un nuevo misil del arraylist. Efectivamente lo hace pero se queda parado sin más cuando aprieto tecla espacio debería salir disparado ya que allí tengo el metodo abstracto de la interfaz KeyListener:

if(e.getKeyCode()==KeyEvent.VK_SPACE){

xa=8;

sound.disparo.play();

}

Sólo funciona el primer misil, los demás aparecen pero quedan parados. Deberían salir a velocidad 8 y sonar ruido de disparo, el ruido suena pero los misiles se quedan parados.

saludos