Java - Duda sobre colaboración de clases

 
Vista:

Duda sobre colaboración de clases

Publicado por Eduardo (3 intervenciones) el 29/09/2014 13:32:04
Hola.

Estoy empezando con la programación en JAVA y estoy haciendo un jueguecillo en el cual me ha aparecido un problema y agradecería que alguien me asesorara en el asunto.

El juego es el típico de una nave espacial que tiene que matar a los enemigos que se encuentra.

Tengo varias clases como

Escenario: me pinta el fondo
Nave: me controla la nave
Disparo: controla el disparo.
Enemigos: controla a los enemigos

El caso es que en Nave declaro y actualizo las variables x e y de la nave.

Tengo estas líneas para que me las devuelva actualizadas al mover la nave.

Código:
public int getX()
{
return x;
}
public int getY()
{
return y;
}

La nave se pinta desde Escenario y pongo lo siguiente para ello:

Código:
g2d.drawImage(nave.getImage(), nave.getX(), nave.getY(), this);

Esto me funciona perfectamente.

Cuando pulso la tecla "B" hago que me aparezca el disparo y suba hasta arriba.

Para ello tomo las coordenadas de la nave y así el disparo sale de ella de esta manera:

Código:
dispy=nave.getY();
dispx=nave.getX();

Pues resulta que esto sólo me funciona la primera vez que disparo.
El resto de las veces, aunque mueva la nave el disparo sigue saliendo de las coordenadas donde estaba la nave al principio. Osea, que cuando pido las coordenadas de la nave en disparo siempre me devuelve las mismas (las primeras). No me las actualiza.

Por qué puede ser?

Agradecería que alguien me pudiera dar un poco de luz en el asunto.

Un saludo y gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Duda sobre colaboración de clases

Publicado por Tom (1831 intervenciones) el 29/09/2014 15:09:38
Es raro. Habría que ver en qué parte del código haces lo del disparo ... ¿ quizás estés usando un objeto nave distinto ?
¿ estás usando threads ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda sobre colaboración de clases

Publicado por edmiller (3 intervenciones) el 30/09/2014 08:31:50
Pues estoy bastante pez en esto, pero creo que no uso Threads.
Uso la estructura de un ejemplo que vi en Internet.



Como no es muy largo, voy a poner aquí las distintas clases:

Clase Mover Sprites

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.JFrame;
 
public class Mover_Sprites extends JFrame{
 
 private static final long serialVersionUID = 1L;
 
 public Mover_Sprites()
 {
 add(new Escenario());
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 setSize(640, 480);
 setLocationRelativeTo(null);
 setTitle("Mover Sprites");
 setResizable(false);
 setVisible(true);
 }
 
 public static void main(String[] args)
 {
 new Mover_Sprites();
 }
}

Clase Escenario:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
 
import java.awt.RenderingHints;
 
public class Escenario extends JPanel implements ActionListener {
 /**
 *
 */
 private static final long serialVersionUID = 1L;
 private Timer timer;
 private Nave nave;
 private Disparo disparo;
 private Enemigos enemigos;
 private String escenario = "Luna_Espacio_640_480.jpg";
private int xn,yn;
 ImageIcon image_icon;
 
 
 public Escenario(){
 
 addKeyListener(new TAdapter());
 setFocusable(true);
 setBackground(Color.BLACK);
 setDoubleBuffered(true);
 
 image_icon = new ImageIcon(this.getClass().getResource(escenario));
 
 enemigos = new Enemigos();
 nave = new Nave();
 disparo= new Disparo();
 timer = new Timer(2, this);
 timer.start();
 
 }
 
 public void paint(Graphics g) {
 super.paint(g);
 
 Graphics2D g2d = (Graphics2D)g;
 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
			RenderingHints.VALUE_ANTIALIAS_ON);
 g2d.drawImage(image_icon.getImage(), 0, 0, this);
 
 
 
 enemigos.pinta(g2d);
 disparo.pinta(g2d);
 xn=nave.getX();
 yn=nave.getY();
g2d.drawImage(nave.getImage(), xn, yn, this);
 Toolkit.getDefaultToolkit().sync();
 g.dispose();
 }
 
 
 
 
 public void actionPerformed(ActionEvent e){
nave.move();
 enemigos.move();
 disparo.move();
 
 repaint();
 }
 
 private class TAdapter extends KeyAdapter{
 
 
 public void keyPressed(KeyEvent e){
 nave.keyPressed(e);
 disparo.keyPressed(e);
	 }
 
 
 
 
 public void keyReleased(KeyEvent e){
	 nave.keyReleased(e);
 
	 }
 }
 
 
 
}


Clase Nave:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import java.awt.Image;
import java.awt.event.KeyEvent;
 
import javax.swing.ImageIcon;
 
public class Nave {
 private String nave = "navebt.png";
 private int dx;
 private int dy;
 public int x;
 public int y;
 private Image image;
 
 int pausa=0;
 
 public Nave()
 {
 ImageIcon image_icon = new ImageIcon(this.getClass().getResource(nave));
 image = image_icon.getImage();
 
 x = 300;
 y = 200;
 }
 
 public void move()
 {
 
 if (pausa==1){
	 pausa=0;
 if (dx > 0 && x <= 640 - 38)
	x=x+ dx;
 else
 if (dx < 0 && x >= 2)
	 x=x+ dx;
 
 if (dy > 0 && y <= 480 - 50)
	y += dy;
 else
 if (dy < 0 && y >= 2)
	 y += dy;
 }else{
	 pausa++;}
 
 
 }
 public int getX()
 {
 return x;
 }
 public int getY()
 {
 
 return y;
 }
 
 public Image getImage()
 {
 return image;
 }
 public void keyPressed(KeyEvent e)
 {
 
 int key = e.getKeyCode();
 pausa=0;
 
 if (key == KeyEvent.VK_RIGHT )
 {
 dx = 2;
 
 }
 if (key == KeyEvent.VK_LEFT)
 {
 
	dx = -2;
 }
 if (key == KeyEvent.VK_UP )
 {
 dy = -2;
 
 }
 if (key == KeyEvent.VK_DOWN )
 {
 dy = 2;
 
 }
	 }
 
 public void keyReleased(KeyEvent e)
 {
 int key = e.getKeyCode();
 
 if (key == KeyEvent.VK_RIGHT)
 {
 dx = 0;
 }
 if (key == KeyEvent.VK_LEFT)
 {
 dx = 0;
 }
 if (key == KeyEvent.VK_UP)
 {
 dy = 0;
 }
 if (key == KeyEvent.VK_DOWN)
 {
 dy = 0;
 
 }
 
 }
 
}

Clase Disparo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.awt.event.KeyEvent;
 
import javax.swing.ImageIcon;
 
import java.awt.Graphics;
import java.awt.Image;
 
 
 
import java.awt.Graphics2D;
 
public class Disparo {
	private Nave nave;
 
	int disparo=0;
	int dispy, dispx;
 
 
	private String disp = "disparo.png";
	private Image image;
 
	public Disparo(){
		//nave = new Nave();
		ImageIcon image_icon = new ImageIcon(this.getClass().getResource(disp));
		 image = image_icon.getImage();
	}
 
	 public void move()
	 {
 
		 if (disparo==1)
	 dispy--;
	 if (dispy==-1)
			disparo=0;
	 }
 
	public void pinta (Graphics g){
		if (disparo==1){
 
 
		Graphics2D g2d = (Graphics2D)g;
		 g2d.drawImage(image, dispx, dispy, null);}
			}
 
 
	public void keyPressed(KeyEvent e)
	 {
 
	 String tecla=KeyEvent.getKeyText(e.getKeyCode());
 
		if (disparo==0 && tecla.equals("B")){
 
			nave = new Nave();
			dispy=nave.getY();
			dispx=nave.getX();
			disparo=1;
 
}
}
}

Clase Enemigos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
mport java.awt.Graphics;
import java.awt.Image;
 
//import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
 
 
import java.awt.Graphics2D;
 
 
 
public class Enemigos {
 
	private String enem1 = "navebt.png";
	private String pelota ="pelota.png";
 
	 Image [] graficos= new Image[3];
	 private int [][] datosene;
	private int numene=2;
 
public Enemigos()
{
 
	datosene=new int[3][2];
	datosene[0][0]=(int)(Math.random()*602);//coor x
	datosene[0][1]=0;//coory
	datosene[1][0]=(int)(Math.random()*602);
	datosene[1][1]=100;
 
ImageIcon image_icon = new ImageIcon(this.getClass().getResource(enem1));
graficos [0] = image_icon.getImage();
ImageIcon image_icon1 = new ImageIcon(this.getClass().getResource(pelota));
graficos [1] = image_icon1.getImage();
 
}
 
public void pinta(Graphics g){
	int f;
	for (f=0;f<=numene;f++){
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(graficos[f], datosene[f][0], datosene[f][1], null);
 
}
}
 
public void move(){
 
int f;
for (f=0;f<=numene;f++){
 
	datosene[f][1]++;
	if (datosene[f][1]==500){
		datosene[f][1]=0;
		datosene[f][0]=(int)(Math.random()*602);//coor x
	}
 
 
}
 
 
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda sobre colaboración de clases

Publicado por Tom (1831 intervenciones) el 30/09/2014 09:27:58
Efectivamente, estás usando una clase nave distinta !!

1
2
3
4
5
6
if(disparo == 0 && tecla.equals("B")) {
			nave = new Nave();
			dispy = nave.getY();
			dispx = nave.getX();
			disparo = 1;
		}
No es el mejor diseño pero en tu caso lo mejor es que vuelvas al sistema que ya empezaste a hacer:

En Escenario():
disparo = new Disparo(nave);

En Disparo te guardas la referencia a la nave pasada en el constructor.

Y, lógicamente, ya no creas más objetos nave en más sitios.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Duda sobre colaboración de clases

Publicado por edmiller (3 intervenciones) el 30/09/2014 09:49:06
Muchísimas gracias!!!!

Ya me funciona.

Pero la verdad es que no entiendo por qué.

Por qué estaba usando una clase nave distinta?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar