Hola,
Te muestro el código y te indico cuál es el flujo del programa (IGU):
El código de la parte de la IGU es:
Clase principal que inicia el juego:
Código:
public class RType
{
RType rtype;
public RType()
{
lanzarJuego();
}
public static final void main(String[] args)
{
new RType();
}
public void lanzarJuego()
{
rtype = new RType();
rtype.menuJugar();
}
}
Clase que extiende JFrame y pinta el menú "jugar" o "salir":
Código:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Dimension;
import java.awt.Font;
public class PantallaBienvenida extends JFrame
{
private Tablero tablero;
private JPanel panelContenedor;
private JButton botonJugar;
private JButton botonSalir;
private JPanel botonera;
public PantallaBienvenida()
{
setTitle("R-Type");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(480, 380);
setLocationRelativeTo(null);
setResizable(false);
panelContenedor = new JPanel();
botonera = new JPanel();
botonJugar = new JButton();
botonSalir = new JButton();
tablero = new Tablero();
setVisible(true);
}
public void menuJugar()
{
panelContenedor = (JPanel) getContentPane();
panelContenedor.setBorder(new EmptyBorder(150, 75, 120, 80));
panelContenedor.setBackground(Color.BLACK);
panelContenedor.setLayout(new BorderLayout(4, 4));
botonera.setLayout(new GridLayout(0, 1));
botonJugar.setText("JUGAR");
botonJugar.setPreferredSize(new Dimension(300, 30));
botonJugar.setFont(new Font("Arial Bold", 1, 16));
botonJugar.setForeground(Color.BLACK);
botonJugar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { jugar(); }
});
botonera.add(botonJugar);
botonSalir.setText("SALIR");
botonSalir.setPreferredSize(new Dimension(300, 30));
botonSalir.setFont(new Font("Arial Bold", 1, 16));
botonSalir.setForeground(Color.BLACK);
botonSalir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { salir(); }
});
botonera.add(botonSalir);
panelContenedor.add(botonera, BorderLayout.CENTER);
pack();
Toolkit.getDefaultToolkit().sync();
setVisible(true);
}
public void salir()
{
System.exit(0);
}
public void jugar()
{
remove(botonera);
remove(panelContenedor);
panelContenedor = (JPanel) getContentPane();
panelContenedor.setBorder(new EmptyBorder(0, 0, 0, 0));
panelContenedor.setBackground(Color.BLACK);
pack();
panelContenedor.add(tablero = new PanelTablero());
panelContenedor.setVisible(true);
pack();
Toolkit.getDefaultToolkit().sync();
pack();
}
}
Clase que extiende JPanel e implementa ActionListener. Esta clase pinta las naves y lleva el control del teclado, etc.
Código:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
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 java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;
public class Tablero extends JPanel implements ActionListener
{
private Timer timer;
private TableroPanel tableroJuego;
private boolean juegoTerminado;
public Tablero()
{
tableroJuego = new TableroPanel();
addKeyListener(new TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setBorder(new EmptyBorder(0, 480, 380, 0));
setDoubleBuffered(true);
juegoTerminado = false;
timer = new Timer(5, this);
timer.start();
}
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(tableroJuego.getImagenAliada(), tableroJuego.getXAliada(), tableroJuego.getYAliada(), this);
for (int i = 0; i < tableroJuego.getNaveAlien(); i++) {
g2d.drawImage(tableroJuego.getImagenAlien(i), tableroJuego.getXAlien(i), tableroJuego.getYAlien(i), this);
}
ArrayList<Misil> ms = tableroJuego.getMisiles();
for (int i = 0; i < ms.size(); i++) {
Misil m = (Misil) ms.get(i);
g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
}
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public int getLimiteAliens()
{
return tableroJuego.getLimiteAliens();
}
public boolean getIngame()
{
return tableroJuego.getIngame();
}
public boolean juegoTerminado()
{
return juegoTerminado;
}
public void actionPerformed(ActionEvent e)
{
requestFocusInWindow();
if(getLimiteAliens() == 0 || getIngame() == false) {
timer.stop();
setFocusable(false);
setVisible(false);
remove(this);
juegoTerminado = true;
repaint();
}
tableroJuego.comprobarColisiones();
tableroJuego.moverEnTablero();
repaint();
}
private class TAdapter extends KeyAdapter
{
public void keyReleased(KeyEvent e)
{
tableroJuego.getAliada().keyReleased(e);
}
public void keyPressed(KeyEvent e)
{
tableroJuego.getAliada().keyPressed(e);
}
}
}
El flujo del programa es:
1º. Se inicia el programa.
2º. Se muestra el menu de "jugar" o "salir".
3º. Si eliges salir, el programa finaliza.
4º. Si eliges jugar, aparecen las naves y puedes jugar hasta que el juego finalice.
Lo que no entiendo, y es en lo que llevo días estancado, es cómo puedo hacer para que mi programa vuelva a mostrar el menú del paso 2º una vez finalice el 4º paso.
Es como si el flujo del programa se quedase en el ActionListener de la clase Tablero. Si pongo allí un nuevo objeto PantallaBienvenida con el método menuJugar() crea una ventana nueva pero deja la anterior, al final tengo dos ventanas.
Muchísimas gracias por la ayuda.
Saludos.