O exemplo neste artigo descreve o código do jogo de caça e tiro implementado em Java baseado em Swing. Compartilhe com todos para sua referência.
O código de implementação específico é o seguinte:
Copie o código do código da seguinte forma:
pacote Jogo;
importar java.awt.Graphics;
importar java.awt.Image;
importar javax.swing.JPanel;
classe pública BackgroundPanel estende JPanel {
privado estático final longo serialVersionUID = 1L;
imagem de imagem privada; // imagem de fundo
public BackgroundPanel() {
setOpaque(falso);
setLayout(nulo);
}
public void setImage(Imagem da imagem) {
esta.imagem = imagem;
}
/**
* Desenhe o fundo
*/
protegido void paintComponent(Gráficos g) {
if (imagem! = nulo) {
//largura da imagem
int largura = getWidth();
//altura da imagem
int altura = getAltura();
//desenha a imagem
g.drawImage(imagem, 0, 0, largura, altura, isto);
}
super.paintComponent(g);
}
}
Copie o código do código da seguinte forma:
pacote Jogo;
importar java.awt.Container;
importar java.awt.event.*;
importar javax.swing.*;
classe pública BirdLabel estende JLabel implementa Runnable {
privado estático final longo serialVersionUID = 1L;
// Gera aleatoriamente o tempo de sono do thread, ou seja, controla a velocidade de movimento do pássaro
private int sleepTime = (int) (Math.random() * 300) + 5;
privado int y = 100;
private Thread thread // Usa thread como uma variável de membro
pai do contêiner privado;
private int score = 15;//A pontuação correspondente a este tipo de função
/**
*Método de construção
*/
public BirdLabel() {
super();
//Cria um objeto ícone de pássaro
Ícone ImageIcon = new ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon); // Define o ícone de controle
addMouseListener(new MouseAction()); //Adiciona ouvinte de evento de mouse
//Adiciona ouvinte de evento de controle
addComponentListener(new ComponentAction());
thread = new Thread(this); // Cria objeto thread
}
/**
* Ouvinte de eventos de controle do controle
*/
classe final privada ComponentAction estende ComponentAdapter {
public void componenteResized(final ComponentEvent e) {
thread.start(); // início do tópico
}
}
/**
* Ouvinte de eventos de mouse do controle
*/
classe final privada MouseAction estende MouseAdapter {
public void mousePressed(final MouseEvent e) {
if (!MainFrame.readyAmmo())// Se o marcador não estiver pronto
retornar; //Não fazer nada
MainFrame.useAmmo(); // Consome marcadores
appScore(); // Pontos bônus
destroy(); // Destrua este componente
}
}
execução void pública() {
pai = nulo;
largura interna = 0;
tentar {
while (largura <= 0 || pai == nulo) {
if (pai == nulo) {
parent = getParent(); // Obtém o contêiner pai
} outro {
width = parent.getWidth(); // Obtém a largura do contêiner pai
}
Thread.sleep(10);
}
for (int i = largura; i > 0 && parent != null; i -= 8) {
setLocation(i, y); //Move a posição deste componente da direita para a esquerda
Thread.sleep(sleepTime); //Dormir um pouco
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (pai! = nulo) {
MainFrame.appScore(-score * 10); // A destruição natural deduzirá pontos
}
destroy();// Após a conclusão da movimentação, destrói este componente
}
/**
* Método para remover este componente do contêiner
*/
destruição de vazio público() {
if (pai == nulo)
retornar;
parent.remove(this); //Remove este arquivo do contêiner pai
pai.repaint();
parent = null; // Finaliza o loop do thread através desta instrução
}
/**
* Maneiras de adicionar pontos
*/
private void appScore() {
System.out.println("O pássaro foi atingido");
MainFrame.appScore(15);
}
}
Copie o código do código da seguinte forma:
pacote Jogo;
importar java.awt.Container;
importar java.awt.event.*;
importar javax.swing.*;
classe pública PigLabel estende JLabel implementa Runnable {
privado estático final longo serialVersionUID = 1L;
// Gera aleatoriamente o tempo de sono, que é a velocidade de movimento do javali
private int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//Coordenadas verticais do controle
private int score = 10;//A pontuação correspondente a este personagem
private Thread thread // objeto de thread integrado
private Container parent; //O objeto contêiner pai do controle
/**
*Método de construção
*/
public PigLabel() {
super();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//Carregar fotos de javalis
setIcon(icon); //Define o ícone deste componente
//Adiciona adaptador de eventos do mouse
addMouseListener(new MouseAdapter() {
// Como lidar com o pressionamento do botão do mouse
public void mousePressed(final MouseEvent e) {
se (!MainFrame.readyAmmo())
retornar;
MainFrame.useAmmo(); // Consome marcadores
appScore(); // Adiciona pontos ao jogo
destroy(); // Destrua este componente
}
});
//Adiciona adaptador de eventos do componente
addComponentListener(new ComponentAdapter() {
//Ao redimensionar o componente
public void componenteResized(final ComponentEvent e) {
thread.start();//inicia o tópico
}
});
//Inicializa o objeto thread
tópico = novo tópico(este);
}
execução void pública() {
pai = nulo;
largura interna = 0;
while (width <= 0 || parent == null) {//Obtém a largura do contêiner pai
if (pai == nulo)
pai = getParent();
outro
largura = parent.getWidth();
}
//Move este componente da esquerda para a direita
for (int i = 0; i < largura && parent != null; i += 8) {
setLocation(i, y);
tentar {
Thread.sleep(sleepTime); //Dormir um pouco
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (pai! = nulo) {
MainFrame.appScore(-score * 10); // A destruição natural deduzirá pontos
}
destruir();
}
/**
* Método para remover este componente do contêiner
*/
destruição de vazio público() {
if (pai == nulo)
retornar;
pai.remove(este);
pai.repaint();
parent = null; // Finaliza o loop do thread através desta instrução
}
/**
* Maneiras de adicionar pontos
*/
private void appScore() {
System.out.println("O javali foi atingido");
MainFrame.appScore(10);
}
}
Copie o código do código da seguinte forma:
pacote Jogo;
importar java.lang.Math.random estático;
importar java.awt.*;
importar java.awt.event.*;
importar javax.swing.*;
classe pública MainFrame estende JFrame {
privado estático final longo serialVersionUID = 1L;
pontuação longa estática privada = 0;
private static Integer ammoNum = 5;//Número de marcadores
private static JLabel scoreLabel; // pontuação
fundoPanel privado backgroundPanel;
JLabel estático privado ammoLabel;
infoPane JPanel estático privado;
/**
*Método de construção
*/
public MainFrame() {
super();
setResizable(false); //Ajusta o tamanho do formulário
setTitle("Jogo de Caça");
infoPane = (JPanel) getGlassPane(); // Obtém o painel de vidro
JLabel label = new JLabel("Carregar marcadores...");//Criar componente de rótulo de prompt
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font("楷体", Font.BOLD, 32));
rótulo.setForeground(Color.RED);
infoPane.setLayout(new BorderLayout());
infoPane.add(label);//Adiciona componente de rótulo de prompt ao painel de vidro
setAlwaysOnTop(true); //O formulário permanece no nível superior
setBounds(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // Cria um painel com fundo
backgroundPanel.setImage(new ImageIcon(getClass().getResource(
"background.jpg")).getImage()); //Definir a imagem de fundo
getContentPane().add(backgroundPanel, BorderLayout.CENTER);
//Adiciona adaptador de eventos do mouse
addMouseListener(new FrameMouseListener());
scoreLabel = new JLabel(); // Componente de rótulo que exibe pontuações
scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
scoreLabel.setForeground(Color.ORANGE);
scoreLabel.setText("Pontuação:");
pontuaçãoLabel.setBounds(25, 15, 120, 18);
backgroundPanel.add(scoreLabel);
ammoLabel = new JLabel(); // Exibe o número automático de componentes do rótulo
muniçãoLabel.setForeground(Color.ORANGE);
muniçãoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("Número de marcadores: " + ammoNum);
muniçãoLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* Método de pontos extras
*/
público sincronizado estático void appScore(int num) {
pontuação += num;
scoreLabel.setText("Pontuação: " + pontuação);
}
/**
*Como consumir balas
*/
público sincronizado estático void useAmmo() {
sincronizado (ammoNum) {
ammoNum--;// Diminui o número de balas
ammoLabel.setText("Número de marcadores: " + ammoNum);
if (ammoNum <= 0) {// Determina se o marcador é menor que 0
new Thread(new Runnable() {
execução void pública() {
//Exibir painel de informações do prompt
infoPane.setVisible(true);
tentar {
// 1 segundo para carregar os marcadores
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ammoNum = 5;//Restaura o número de marcadores
// Modifica o texto do rótulo de quantidade do marcador
ammoLabel.setText("Número de marcadores: " + ammoNum);
infoPane.setVisible(false);//Ocultar o painel de informações do prompt
}
}).começar();
}
}
}
/**
* Determine se as balas são suficientes
*
*/
público sincronizado estático booleano readyAmmo() {
sincronizado (ammoNum) {
return ammoNum > 0;
}
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
execução void pública() {
tentar {
quadro MainFrame = new MainFrame();
frame.setVisible (verdadeiro);
frame.start();
} catch (Exceção e) {
e.printStackTrace();
}
}
});
}
/**
*Como iniciar o jogo
*/
public void início() {
novo PigThread().start();
novo BirdThread().start();
}
/**
* Ouvinte de eventos de mouse para o formulário
*
*/
classe final privada FrameMouseListener estende MouseAdapter {
public void mousePressed(final MouseEvent e) {
Componente em = backgroundPanel.getComponentAt(e.getPoint());
if (at instanceof BackgroundPanel) {//Se você clicar no painel, os marcadores também serão deduzidos
MainFrame.useAmmo(); // Consome marcadores
}
/*
* if (at instanceof BirdLabel) {//Se você clicar em birdMainFrame.appScore(32);//
* Pontos de bônus} if (at instanceof PigLabel) {// Se o javali for clicado
* MainFrame.appScore(11);//Pontos extras}
*/
}
}
/**
* Tópico que gera personagens porcos
*
*/
classe PigThread estende Thread {
@Substituir
execução void pública() {
enquanto (verdadeiro) {
//Cria um controle rótulo representando o javali
PigLabel porco = new PigLabel();
pig.setSize(120, 80); //Define o tamanho inicial do controle
backgroundPanel.add(pig);//Adiciona controles ao painel de fundo
tentar {
//O thread dorme aleatoriamente por um período de tempo
dormir((longo) (aleatório() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* O thread que gera o personagem pássaro
*
*/
classe BirdThread estende Thread {
@Substituir
execução void pública() {
enquanto (verdadeiro) {
//Cria um controle rótulo representando o pássaro
BirdLabel pássaro = new BirdLabel();
bird.setSize(50, 50); //Define o tamanho inicial do controle
backgroundPanel.add(bird);//Adiciona controles ao painel de fundo
tentar {
//O thread dorme aleatoriamente por um período de tempo
dormir((longo) (Math.random() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
Espero que este artigo seja útil para a programação Java de todos.