sexta-feira, 31 de maio de 2013

JAVA GAMES 2D::Menu::14

Olá pessoal!
Nesse tutorial iremos mostrar uma maneira de como construir um menu para os nossos games, além da classe Game.java que iremos criar no nosso pacote tutorial14 dentro do projeto JAVAGAMES2D iremos também criar um uma classe chamada Menu.java.  então é o seguinte, na classe Menu.java, iremos definir como os nossos menus irá se comportar, e iramos criar um menu dentro Game.java.



No exemplo de hoje teremos três cenários, e um menu que nos levará para cada cenário(Jogar, Opções e Ajuda) e um item no menu para sair do game!

Observe com atenção a nossa classe Menu.java (Leia os comentários com atenção!)

1:  import java.awt.Color;  
2:  import java.awt.Font;  
3:  import java.awt.Graphics;  
4:  import java.awt.event.KeyEvent;  
5:  import java.awt.image.BufferedImage;  
6:  public class Menu {  
7:   int cenario = -1;  //ESSA VARIAVEL INDICA EM QUE CENÁRIO ESTAMOS, -1(NENHUM CENÁRIO) (0,1,2,3...N) OUTROS CENÁRIOS  
8:   int itemSelecionado = 0; //ESSA VARIAVEL SERVIRÁ PARA INDICAR QUAL ITEM QUE ESTÁ SELECIONADO (o atual é zero que é o primeiro item do menu)  
9:   String itens[];  //aqui vamos guardar os itens do nosso menu (jogar, opções, sair...etc)  
10:   Graphics bbg;  //como nos outros métodos da classe game.java usamos essa varialvel para desenhar elementos na tela  
11:   boolean ativo;  //indica se o menu está ativo ou não (ao inicar o jogo desativamos o menu, para o controlemos durante o jogo)  
12:   int x;   //coordenada x do menu  
13:   int y;   //coordenada y do menu  
14:   int tamanhoDaFonte = 20; //nem precisa explicar não é ?  
15:   int distanciaEntreItens = 15;//distância entre cada item do menu!  
16:   Font fonte = new Font("Arial", Font.BOLD, tamanhoDaFonte);//a fonte do nosso menu  
17:   Color corSelecionado = new Color(255, 0, 0); // COR VERMELHA para o item selecionado  
18:   Color corNaoSelecionado = new Color(0, 0, 0); // COR PRETA para o item que não está selecionado  
19:   //isso é o construtor ao criarmos o objeto do tipo Menu, teremos que informar o número de itens as coordenadas e se ele estará ativo ou não!  
20:   public Menu(int numeroDeItens, int x, int y, boolean ativo) {  
21:   itens = new String[numeroDeItens];  
22:   this.x = x;  
23:   this.y = y;  
24:   this.ativo = ativo;  
25:   }  
26:   //esse metodo só chamará o método controlaMenu se ele estiver ativo!  
27:   public void controlar(KeyEvent e) {  
28:   if (ativo) {  
29:    controlarMenu(e);  
30:   }  
31:   }  
32:   //esse método nos fará retornar ao menu ao pressinarmos "Esc"  
33:   public void voltarAoMenu(KeyEvent e){  
34:   //se tecla pressionada for igual a "Esc"  
35:   if(e.getKeyCode() == e.VK_ESCAPE){  
36:    cenario = -1; //com isso sai dos cenários em que estivermos...  
37:    ativo = true; //e reativa o menu para que o possamos controlar novamente...  
38:   }  
39:   }  
40:   //esse método controlará o nosso menu através do teclado  
41:   //ele é chamando dentro do método controla()  
42:   private void controlarMenu(KeyEvent e) {  
43:   //se pressionar a tecla "cima" diminui 1 em itemSelecionado  
44:   if (e.getKeyCode() == e.VK_UP) {  
45:    itemSelecionado -= 1;  
46:   }  
47:   //se pressionar a tecla "baixo" aumenta 1 em itemSelecionado  
48:   if (e.getKeyCode() == e.VK_DOWN) {  
49:    itemSelecionado += 1;  
50:   }  
51:   //isso aqui é para controlar os limites extrmos do menu  
52:   //caso eu esteja com 1º item selecionado e pressione para cima, ele vai para a ultima opção  
53:   //caso eu esteja com o ultimo item selecionado e pressione para baixo, ele vai para primeira opção  
54:   if (itemSelecionado >= itens.length) {  
55:    itemSelecionado = 0;  
56:   }  
57:   if (itemSelecionado < 0) {  
58:    itemSelecionado = itens.length - 1;  
59:   }  
60:   //se pressionar a tecla Enter ele muda o valor de cenario para o item que está selecionado  
61:   //isso fará mudar de cenário e desativará o menu para que ele não seja mais controlado!  
62:   if(e.getKeyCode() == e.VK_ENTER){  
63:    cenario = itemSelecionado;  
64:    ativo = false;  
65:   }  
66:   }  
67:   //esse método irá desenhar o nosso menu na tela!  
68:   //a um loop (for) que irá listar todos os itens que está guardado em itens[]  
69:   //um calculo é feito para a coordenada y de cada intem do nosso menu, para que eles fiquem  
70:   //um distante do outro, então caso y = 10, o item 0 será: 10+(0*(20+15)) = 10  
71:   //para o item 1 será: 10+(1*(20+15)) = 45  
72:   //para o item 2 será: 10+(2*(20+15)) = 80  
73:   //para o item 3 será: 10+(3*(20+15)) = 115, e assim por diante...  
74:   public void desenharMenu() {  
75:   bbg.setFont(fonte);//seta a fonte que definimos bem acima na declaração de variáveis  
76:   for (int i = 0; i < itens.length; i++) {// aqui é o inicio do nosso loop  
77:    if(itemSelecionado == i){//se ele estiver selecionado muda a cor para vermelho e desenha o item na tela  
78:    bbg.setColor(corSelecionado);  
79:    bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));  
80:    }else{//se não estiver selecionado muda a cor para preto e desenha o item na tela  
81:    bbg.setColor(corNaoSelecionado);  
82:    bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));  
83:    }  
84:   }  
85:   }  
86:  }  

Agora veja como criaremos o nosso menu dentro de Game.java, (leita os comentários com atenção!)

1:  import java.awt.*;  
2:  import java.awt.event.KeyEvent;  
3:  import java.awt.event.KeyListener;  
4:  import java.awt.image.BufferedImage;  
5:  import java.io.File;  
6:  import javax.swing.ImageIcon;  
7:  import javax.swing.JFrame;  
8:  public class Game extends JFrame implements KeyListener{  
9:   BufferedImage backBuffer;  
10:   int FPS = 30;  
11:   int janelaW = 500;  
12:   int janelaH = 500;  
13:   //AQUI DECLARAMOS O NOSSO MENU COM:  
14:   //4 itens, coordenadas x e y = 100, a ativo = true  
15:   //agora olhe esse método abaixo cenarios()  
16:   Menu menuPrincipal = new Menu(4, 100, 100, true);  
17:   //esse método vai desenhar na tela alguns possíveis cenários do nosso game  
18:   //lá em Menu.java cenario foi definido como -1  
19:   //se cenario == 0 muda a cor do fundo e mostra um texto  
20:   //se cenario == 1 muda a cor do fundo e mostra um texto  
21:   //se cenario == n muda a cor do fundo e mostra um texto...  
22:   //agora obser o nosso método desenharGraficos()  
23:   public void cenarios(){  
24:   Graphics bbg = backBuffer.getGraphics();  
25:   bbg.setFont(new Font("Arial",Font.BOLD,20));  
26:   if(menuPrincipal.cenario == 0){  
27:    bbg.setColor(new Color(255,100,100));  
28:    bbg.fillRect(0, 0, janelaW, janelaH);  
29:    bbg.setColor(Color.BLACK);  
30:    bbg.drawString("Você escolheu Jogar", 100, 200);  
31:    //aqui você pode escolher o que irá aparecer caso o usuario escolha essa item do menu!  
32:   }  
33:   if(menuPrincipal.cenario == 1){  
34:    bbg.setColor(new Color(100,255,100));  
35:    bbg.fillRect(0, 0, janelaW, janelaH);  
36:    bbg.setColor(Color.BLACK);  
37:    bbg.drawString("Você escolheu Opções", 100, 200);  
38:   }  
39:   if(menuPrincipal.cenario == 2){  
40:    bbg.setColor(new Color(100,100,255));  
41:    bbg.fillRect(0, 0, janelaW, janelaH);  
42:    bbg.setColor(Color.BLACK);  
43:    bbg.drawString("Você escolheu Ajuda", 100, 200);  
44:   }  
45:   if(menuPrincipal.cenario == 3){  
46:    System.exit(0);//esse comando fecha o nosso game!  
47:   }  
48:   }  
49:   public void atualizar() {  
50:   }  
51:   public void desenharGraficos() {  
52:   Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI  
53:   Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...  
54:   bbg.setColor(Color.WHITE);  
55:   bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO  
56:   menuPrincipal.desenharMenu();//isso desenhará nosso menu  
57:   cenarios();//isso irá desenhar os cenários que escolhermos no menu  
58:   //agora observe o método inicializar()  
59:   //==================================================================================  
60:   g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!  
61:   }  
62:   public void inicializar() {  
63:   setTitle("Titulo do Jogo!");  
64:   setSize(janelaW, janelaH);  
65:   setResizable(false);  
66:   setDefaultCloseOperation(EXIT_ON_CLOSE);  
67:   setLayout(null);  
68:   setVisible(true);  
69:   backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);  
70:   //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS  
71:   addKeyListener(this);  
72:   //aqui definimos o texto de cada item do nosso menu  
73:   menuPrincipal.itens[0] = "Jogar";  
74:   menuPrincipal.itens[1] = "Opções";  
75:   menuPrincipal.itens[2] = "Ajuda";  
76:   menuPrincipal.itens[3] = "Sair";  
77:   //aqui fazemos o método desenhaMenu() que fica lá em Menu.java  
78:   //desenhar no nosso buffer  
79:   //.. agora para finalizar observe o método de evento keyPressed() mais abaixo...  
80:   menuPrincipal.bbg = backBuffer.getGraphics();  
81:   }  
82:   public void run() {  
83:   inicializar();  
84:   while (true) {  
85:    atualizar();  
86:    desenharGraficos();  
87:    try {  
88:     Thread.sleep(1000/FPS);  
89:    } catch (Exception e) {  
90:     System.out.println("Thread interrompida!");  
91:    }  
92:   }  
93:   }  
94:   public static void main(String[] args) {  
95:   Game game = new Game();  
96:   game.run();  
97:   }  
98:   public void keyPressed(KeyEvent e) {  
99:   //aqui, chamamos os métodos que irá controlar o menu pelo teclado  
100:   menuPrincipal.controlar(e);//esse controla o menu  
101:   menuPrincipal.voltarAoMenu(e);//esse faz voltar para o menu quando pressionarmos "Esc"  
102:   }  
103:   public void keyReleased(KeyEvent e) {  
104:   }  
105:   public void keyTyped(KeyEvent e) {  
106:   }  
107:  }  

Super simples! não é?
Observem como ficou o meu:




Até o nosso próximo tutorial!
Abraços e não deixem de comentar...

Nenhum comentário:

Postar um comentário