O documento descreve um jogo de bingo desenvolvido em Java com as seguintes funcionalidades: 1) gera números aleatórios para o bingo; 2) usa síntese de voz para ler os números sorteados; 3) armazena imagens utilizadas no jogo. Além disso, apresenta classes utilitárias e exemplos iniciais para desenvolvimento de jogos, incluindo formas geométricas e frameworks.
4. Bingo
private void adicionaComponentes() {
getContentPane().setLayout(new BorderLayout());
painelSuperior.add(lblTamanho);
painelSuperior.add(txtTamanho);
painelInferior.add(botao);
getContentPane().add(painelSuperior, BorderLayout.NORTH);
getContentPane().add(painelInferior, BorderLayout.SOUTH);
getContentPane().add(lblNumero, BorderLayout.CENTER);
}
private void inicializaComponentes() {
painelSuperior = new JPanel();
painelInferior = new JPanel();
botao = new JButton("Sortear novo nœmero");
lblNumero = new JLabel(" ");
lblNumero.setFont(new Font("Arial", Font.BOLD, 60));
lblTamanho = new JLabel("Quantidade de nœmeros");
txtTamanho = new JTextField("100", 20);
}
private void adicionaActionListener() {
botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
imprimeNumeroAleatorio();
};
});
}
5. Bingo
private void imprimeNumeroAleatorio() {
lblNumero.setText("" + proximoNumeroAleatorio());
// Bloco de código do Sintetizador de voz
}
private int proximoNumeroAleatorio() {
int tamanho = Integer.parseInt(txtTamanho.getText());
return new Random().nextInt(tamanho);
}
public static void main(String[] args) {
new Bingo("Bingo");
}
}
6. Sintetizador de Voz
• FreeTTS é um sintetizador de voz escrito em
Java.
• Pode ser baixado em
http://freetts.sourceforge.net ou
http://marcoreis.net/freetts.zip.
• Acrescente as bibliotecas freetts.jar e
cmutimelex.jar nas referências do projeto.
7. Sintetizador de Voz
• Acrescente o seguinte código na classe
Bingo.
• Todas as classes estão no pacote
com.sun.speech.freetts.*.
Voice[] voices = VoiceManager.getInstance().getVoices();
Voice v = voices[2];
v.allocate();
v.speak(lblNumero.getText());
v.deallocate();
8. Diretório de imagens
• Crie um diretório para guardar as imagens.
• Esse diretório deve ficar na raíz do projeto.
• Algumas imagens de teste podem ser
encontradas em
http://marcoreis.net/imagens.zip
9. Utilitários
•
•
•
•
Tarefas repetitivas devem estar separadas em uma classe utilitária.
Qualquer tipo de conversão deve estar fora de suas classes de
negócio, porque geralmente essas operações se repetem em outros
lugares.
No exemplo a seguir temos a UtilImagem, com apenas um método que
retorna uma imagem no respectivo diretório da aplicação.
Este método certamente não poderia estar em uma classe de negócio
da aplicação, pois será usado em várias situações diferentes.
10. UtilImagem
package com.javagames.util;
import java.awt.*;
import java.io.*;
public class UtilImagem {
private static String diretorioDeImagens = new File("").getAbsolutePath();
public static Image getImagem(String imagem) {
String caminho = diretorioDeImagens + "/imagens/" + imagem;
File f = new File(caminho);
if (f.exists()) {
return Toolkit.getDefaultToolkit().getImage(caminho);
} else {
throw new RuntimeException("Erro ao carregar a imagem.");
}
}
}
11. Moldura
• Na sequência temos uma classe que
exemplifica o uso da UtilImagem.
• A imagem é desenhada duas vezes. Uma em
tamanho natural, outra com um tamanho fixo
(50, 50).
12. Moldura
package com.javagames.aplicacoesgraficas;
import java.awt.*;
import javax.swing.*;
import com.javagames.util.*;
public class Moldura extends JFrame {
private String nomeDaImagem;
public Moldura(String nomeDaImagem) {
setTitle("Moldura");
this.nomeDaImagem = nomeDaImagem;
setSize(Toolkit.getDefaultToolkit().getScreenSize());
setVisible(true);
}
public void paint(Graphics g) {
Image imagem = UtilImagem.getImagem(nomeDaImagem);
int posicaoX = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight() / 2;
int posicaoY = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2;
g.drawImage(imagem, posicaoY, posicaoX, 50, 50, this);
g.drawImage(imagem, posicaoY, posicaoX, this);
}
public static void main(String[] args) {
new Moldura("yoda-tux-256.png");
}
}
13. Forma geométrica
• A primeira classe do framework de
desenvolvimento de jogos.
• Framework é um conjunto de classes com
funcionalidades e escopo bem definido.
• Além disso, deve ter um padrão a ser seguido
para facilitar o desenvolvimento de novas
classes.
14. FormaGeometrica
package com.javagames.circulos;
import java.awt.*;
import javax.swing.*;
public class FormaGeometrica extends JFrame implements Runnable {
//Definicao dos tamanhos e dimensoes
private int dimensaoX = 4;
private int dimensaoY = 4;
private int posicaoX = 10;
private int posicaoY = 100;
private int tamanhoX = 30;
private int tamanhoY = 30;
private double angulo = 10;
private JPanel painel;
//Criacao do frame principal
public FormaGeometrica(Color cor) {
setBackground(cor);
painel = new JPanel();
getContentPane().add(painel);
setVisible(true);
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
15. FormaGeometrica
//Inicio da thread principal da aplicacao.
public static void main(String[] args) {
FormaGeometrica bola = new FormaGeometrica(Color.WHITE);
Thread t = new Thread(bola);
t.start();
}
//Enquanto (true) move a forma geometrica, espera 500ms e faz tudo novamente
public void run() {
while (true) {
move();
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
}
}
}
16. FormaGeometrica
//Desenha a primeira forma geometrica.
public void desenha() {
Graphics g = painel.getGraphics();
g.fillOval(posicaoX, posicaoY, tamanhoX, tamanhoY);
}
//Move a forma geometrica na diagonal – tente outras valores
public void move() {
Graphics g = painel.getGraphics();
g.drawOval(posicaoX, posicaoY, tamanhoX,tamanhoY);
posicaoX += dimensaoX;
posicaoY += dimensaoY;
}
//Chamado na primeira vez que o painel é carregado
@Override
public void paint(Graphics g) {
desenha();
}
}