ArkaLlop - Clon del Arkanoid

Llop Site Home > JAVA > ArkaLlop > Pantalla de menú

Pantalla de menú:

Clase PantallaMenu

package arkallop;

import java.lang.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/** Título: ArkaLlop
    Descripción: Prácticas capítulo 11, ejercicio 4
    Copyright: Copyright (c) 2005
    Empresa: Casa_Llop
    @author Albert_Lobo
    @version 1.0 */

/** Clase que extiende 'JPanel', y que sirve como pantalla de menú.
    Consta de un panel con pestañas al que se añaden:
      - un panel con un dibujo de presentación,
      - un panel en el que se pueden ajustar algunas opciones,
      - y otro panel con las instrucciones del juego.
    También incorpora un botón para pasar a la pantalla de juego. */
public class PantallaMenu extends JPanel
{
  // La partida actual.
  private Partida partida;

  // Panel con pestañas.
  private JTabbedPane pnlInicio;

  // Panel con la imagen de presentación, panel de las opciones, y panel de la información.
  private PanelConFondo pnlFondo;
  private PanelOpciones pnlOpciones;
  private PanelInformacion pnlInfo;
  // Botón para pasar al juego.
  private ArkaButton boton;

  // Variables que se ajustarán a través del panel de opciones:
  // el escenario inicial, la imagen de fondo, y el modo de juego.
  private byte escenarioInicial;
  private byte fondoEscenario;
  private byte modoJuego;

  // Array de bytes que contendrá un muro -un 'nivel'- para previsualizar en el panel de opciones.
  private byte muestraEscenario [][];

  /** Constructor.
      @param nuevaPartida Partida  Esta partida. */
  public PantallaMenu (Partida nuevaPartida)
  {
    // Llamar al constructor de la superclase, y establecer un gestor de diseño 'BorderLayout'.
    super ();
    setLayout (new BorderLayout ());

    // Inicializar las variables y los componentes.
    partida = nuevaPartida;
    inicializaVariables ();
    inicializaComponentes ();

    // Añadir los componentes al panel.
    add (pnlInicio, BorderLayout.CENTER);
    add (boton, BorderLayout.SOUTH);
  }

  /** Inicializa las variables. */
  public void inicializaVariables ()
  {
    // Obtenemos las variables de la partida.
    escenarioInicial = partida.getEscenarioInicial ();
    fondoEscenario = partida.getFondoEscenario ();
    modoJuego = partida.getModoJuego ();

    muestraEscenario = ColeccionNiveles.getNivel (String.valueOf (escenarioInicial + 1));
  }

  /** Inicializa los componentes. */
  public void inicializaComponentes ()
  {
    // Inicializa los 3 sub-paneles.
    pnlFondo = new PanelConFondo ();
    pnlOpciones = new PanelOpciones ();
    pnlInfo = new PanelInformacion ();

    // Inicializa el panel con pestañas, y añade los 3 sub-paneles.
    pnlInicio = new JTabbedPane ();
    pnlInicio.setForeground (Color.red);
    pnlInicio.setFont (ArkaLlop.getFuenteBeyondWonderland ());
    pnlInicio.addTab ("Juego", pnlFondo);
    pnlInicio.addTab ("Opciones", pnlOpciones);
    pnlInicio.addTab ("Informacion", pnlInfo);

    // Inicializa el botón que lleva a la pantalla de juego para empezar la partida.
    boton = new ArkaButton ();
    boton.setAction (new AbstractAction ("Jugar")
    {
      public void actionPerformed (ActionEvent evento)
      {
        // Se ajustan las opciones, por si ha habido cambios, y se pasa a la pantalla de juego.
        partida.setOpciones (escenarioInicial, fondoEscenario, modoJuego);
        partida.cambioAJuego ();
      }
    });
  }

  /** Clase interna que extiende 'JPanel'. Este panel se limita a mostrar una imagen. */
  class PanelConFondo extends JPanel
  {
    // La imagen de fondo del panel.
    private Image imgFondo;

    /** Constructor. */
    public PanelConFondo ()
    {
      // Llamada al constructor de la superclase, e inicialización de la imagen de fondo.
      super ();
      imgFondo = ArkaLlop.getImagen ("caratula.jpg");
    }

    /** Se sobrecarga esta la función para que pinte la imagen de fondo.
        @param graficos Graphics  Contexto 'Graphics' sobre el que pintamos. */
    public void paint (Graphics graficos)
    {
      super.paint (graficos);
      graficos.drawImage (imgFondo, 0, 0, null);
    }
  }

  /** Clase interna que extiende 'JPanel'.
      Permite ajustar el escenario inicial de la partida, la imagen de fondo, y el modo de juego. */
  class PanelOpciones extends JPanel
  {
    // La fuente del panel, una tabla de colores (para los ladrillos de la vista previa del muro),
    // y una tabla de imágenes para la vista previa de los fondos del juego.
    private Font fuente;
    private Color colores [];
    private Image imagenes [];

    // Lista desplegable para los niveles.
    private JComboBox listaNiveles;
    // Etiqueta para la vista previa de las imagenes de fondo.
    private JLabel etqImagenFondo;
    // Botones para ajustar las opciones 'fondo del juego', y 'modo del juego'.
    private ArkaButton btnFonodoMenos;
    private ArkaButton btnFonodoMas;
    private ArkaButton btnModoJuegoMenos;
    private ArkaButton btnModoJuegoMas;

    /** Constructor. */
    public PanelOpciones ()
    {
      // Llama al constructor de la superclase, y pone un gestor de diseño nulo.
      super ();
      setLayout (null);

      // Se inicializan las variables y los componentes.
      inicializaVariables ();
      inicializaComponentes ();
    }

    /** Inicializa las variables. */
    private void inicializaVariables ()
    {
      // Inicializa la fuente, los fondos, y los colores.
      fuente = ArkaLlop.getFuenteBeyondWonderland ().deriveFont (28);
      imagenes = new Image [FondosPantalla.TOTAL_FONDOS];
      for (byte i = 0; i < FondosPantalla.TOTAL_FONDOS; i++)
        imagenes [i] = FondosPantalla.getImagenFondo (i).getScaledInstance (205, 160, Image.SCALE_DEFAULT);
      // Inicializa los colores con su valor RGB en HEX.
      colores = new Color [] {new Color (Integer.decode ("#FFFFFF").intValue ()),
                              new Color (Integer.decode ("#FFFF00").intValue ()),
                              new Color (Integer.decode ("#0033FF").intValue ()),
                              new Color (Integer.decode ("#CC0099").intValue ()),
                              new Color (Integer.decode ("#993300").intValue ()),
                              new Color (Integer.decode ("#FF6600").intValue ()),
                              new Color (Integer.decode ("#33FFFF").intValue ()),
                              new Color (Integer.decode ("#FF0000").intValue ()),
                              new Color (Integer.decode ("#00CC00").intValue ()),
                              new Color (Integer.decode ("#66CC66").intValue ()),
                              new Color (Integer.decode ("#666666").intValue ())};
    }

    /** Inicializa los componentes. */
    private void inicializaComponentes ()
    {
      // Rellenamos la lista desplegable con un array de 'String's que lleva los números
      // del "1" al "45".
      String contenidoLista [] = new String [ColeccionNiveles.TOTAL_NIVELES];
      for (byte i = 0; i < ColeccionNiveles.TOTAL_NIVELES; i++)
        contenidoLista [i] = String.valueOf (i + 1);
      listaNiveles = new JComboBox (contenidoLista);
      // Le ponemos fuente, color, tamaño, y ubicación.
      listaNiveles.setFont (fuente);
      listaNiveles.setForeground (Color.red);
      listaNiveles.setLocation (20, 135);
      listaNiveles.setSize (110, 40);
      // Si se detecta algún cambio, habrá que ajustar la variable del escenario inicial, la
      // vista previa del muro de ladrillos, y repintar para que se note el cambio.
      listaNiveles.setAction (new AbstractAction ()
      {
        public void actionPerformed (ActionEvent evento)
        {
          escenarioInicial = (byte) listaNiveles.getSelectedIndex ();
          muestraEscenario = ColeccionNiveles.getNivel (String.valueOf (escenarioInicial + 1));
          repaint ();
        }
      });

      // Inicializamos la etiqueta para la vista previa del fondo, y le ponemos
      // la imagen del fondo de pantalla actual.
      etqImagenFondo = new JLabel ();
      etqImagenFondo.setIcon (new ImageIcon (imagenes [fondoEscenario]));
      // Establecemos tamaño y ubicación.
      etqImagenFondo.setSize (205, 180);
      etqImagenFondo.setLocation (30, 305);
      // Inicializamos los botones para gestionar la opción 'fondo del juego'.
      // Este botón pone a 'etqImagenFondo' la anterior imagen del array de fondos, y repinta.
      btnFonodoMenos = new ArkaButton ();
      btnFonodoMenos.setAction (new AbstractAction ()
      {
        public void actionPerformed (ActionEvent evento)
        {
          // Si estamos al principio del array, volvemos al final.
          if (fondoEscenario == 0)
            fondoEscenario = 3;
          else
            fondoEscenario--;
          etqImagenFondo.setIcon (new ImageIcon (imagenes [fondoEscenario]));
          repaint ();
        }
      });
      btnFonodoMenos.setLocation (145, 295);
      // Este botón pone a 'etqImagenFondo' la siguiente imagen del array de fondos, y repinta.
      btnFonodoMas = new ArkaButton ();
      btnFonodoMas.setAction (new AbstractAction ()
      {
        public void actionPerformed (ActionEvent evento)
        {
          // Si estamos al final del array, volvemos al principio.
          if (fondoEscenario == 3)
            fondoEscenario = 0;
          else
            fondoEscenario++;
          etqImagenFondo.setIcon (new ImageIcon (imagenes [fondoEscenario]));
          repaint ();
        }
      });
      btnFonodoMas.setLocation (205, 295);
      // Inicializamos los botones para gestionar la opción 'modo de juego'.
      // Tanto el uno como el otro disparan la misma acción:
      // cambiar el modo de juego (que será o 'COMPETICION' o 'ENTRENAMIENTO').
      btnModoJuegoMenos = new ArkaButton ();
      btnModoJuegoMenos.setAction (new AbstractAction ()
      {
        public void actionPerformed (ActionEvent evento)
        {
          if (modoJuego == Partida.COMPETICION)
            modoJuego = Partida.ENTRENAMIENTO;
          else
            modoJuego = Partida.COMPETICION;
          repaint ();
        }
      });
      btnModoJuegoMenos.setLocation (360, 330);
      btnModoJuegoMas = new ArkaButton ();
      btnModoJuegoMas.setAction (btnModoJuegoMenos.getAction ());
      btnModoJuegoMas.setLocation (425, 330);

      // Ponemos el texto a los botones del panel (unas flechas) -genuino arte ASCII.
      btnFonodoMenos.setText ("<-");
      btnFonodoMas.setText ("->");
      btnModoJuegoMenos.setText ("<-");
      btnModoJuegoMas.setText ("->");

      // Añadir todos estos componentes al panel.
      add (listaNiveles);
      add (btnFonodoMenos);
      add (btnFonodoMas);
      add (btnModoJuegoMenos);
      add (btnModoJuegoMas);
      add (etqImagenFondo);
    }

    /** Función sobrecargada para pintar los bordes del panel.
        @param graficos Graphics  Contexto 'Graphics' sobre el que pintar. */
    public void paintBorder (Graphics graficos)
    {
      super.paintBorder (graficos);

      graficos.setColor (Color.blue);
      // Pinta un rectángulo redondeado azul alrededor de cada una de las 3 'zonas de opción'.
      graficos.drawRoundRect (10, 30, 470, 220, 10, 10);
      graficos.drawRoundRect (25, 240, 250, 240, 10, 10);
      graficos.drawRoundRect (240, 270, 250, 220, 10, 10);

      // Pinta un rectángulo redondeado azul alrededor de cada una de las 3 opciones seleccionadas.
      graficos.drawRoundRect (60, 199, 199, 30, 10, 10);
      graficos.drawRoundRect (5, 460, 150, 30, 10, 10);
      graficos.drawRoundRect (255, 355, 230, 30, 10, 10);
    }

    /** Método sobrecargado. Pinta la vista previa del muro, y los textos de ayuda.
        @param graficos Graphics  Contexto 'Graphics' sobre el que se pinta. */
    public void paint (Graphics graficos)
    {
      super.paint (graficos);

      // Los ladrillos del muro.
      for (byte i = 0; i < 11; i++)
        for (byte j = 0; j < 13; j++)
        {
          if (muestraEscenario [j][i] != -1)
          {
            graficos.setColor (getColor (muestraEscenario [j][i]));
            graficos.fillRoundRect (140 + (i * 30), 20 + (j * 15), 28, 13, 2, 2);
            graficos.setColor (Color.black);
            graficos.drawRoundRect (140 + (i * 30), 20 + (j * 15), 28, 13, 2, 2);
          }
        }

      graficos.setFont (fuente);
      graficos.setColor (Color.red);
      // Los textos que orientan sobre cada opción.
      graficos.drawString ("Escoja el", 18, 50);
      graficos.drawString ("escenario", 18, 75);
      graficos.drawString ("inicial.", 18, 100);
      graficos.drawString ("Escenario " + String.valueOf (escenarioInicial + 1), 80, 220);
      graficos.drawString ("Escoja el fondo del", 20, 285);
      graficos.drawString ("escenario.", 20, 310);
      graficos.drawString ("Fondo " + String.valueOf (fondoEscenario + 1), 10, 485);
      graficos.drawString ("Modo de Juego", 275, 320);

      // La descripción del modo de juego es distinta según la opción seleccionada.
      if (modoJuego == Partida.COMPETICION)
      {
        graficos.drawString ("Competicion", 285, 385);
        graficos.drawString ("Atraviese los 45", 270, 430);
        graficos.drawString ("niveles para", 270, 455);
        graficos.drawString ("completar el juego.", 250, 480);
      }
      else
      {
        graficos.drawString ("Entenamiento", 285, 385);
        graficos.drawString ("Practique en el", 270, 430);
        graficos.drawString ("escenario inicial.", 270, 455);
      }
    }

    /** Devuelve un color.
        @param color byte  Color que se busca -su utiliza una de las constantes de color de la clase 'Nivel'.
        @return Color      El color buscado. */
    private Color getColor (byte color)
    {
      return colores [color];
    }
  }

  /** Clase interna que extiende 'JScrollPane'.
      Lleva un 'JEditorPane' en el que incrustamos una página HTML con información acerca del juego. */
  class PanelInformacion extends JScrollPane
  {
    // Panel en el que pegaremos el archivo HTML.
    private JEditorPane pnlEdtr;

    /** Constructor. */
    public PanelInformacion ()
    {
      // Llamada al constructor de la superclase. La barra deslizante debe ser vertical.
      super ();
      setVerticalScrollBarPolicy (JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
      // Se inicializa el 'panel editor', y se añade al panel.
      inicalizaComponentes ();
      setViewportView (pnlEdtr);
    }

    /** Inicializa el 'JEditorPane'. */
    private void inicalizaComponentes ()
    {
      // Inicializa 'pnlEdtr', se hace no editable, y se incrusta la página web.
      pnlEdtr = new JEditorPane ();
      pnlEdtr.setEditable (false);
      try
      {
        pnlEdtr.setPage (ArkaLlop.class.getResource ("rscArkaLlop/info.htm"));
      } catch (IOException e) { ArkaLlop.error ("Fichero 'info.htm' no encontrado."); }
    }
  }
}

¿Comentarios, sugerencias?: llopsite.at.yahoo.es | © 2005-07 Albert Lobo

Última actualización: 18-Feb-2007

Hosted by www.Geocities.ws

1