El ejemplo de este artículo describe el código del juego de caza y tiro implementado en Java basado en Swing. Compártelo con todos para tu referencia.
El código de implementación específico es el siguiente:
Copie el código de código de la siguiente manera:
paquete Juego;
importar java.awt.Graphics;
importar java.awt.Imagen;
importar javax.swing.JPanel;
La clase pública BackgroundPanel extiende JPanel {
serialVersionUID largo final estático privado = 1L;
imagen de imagen privada;// imagen de fondo
Panel de fondo público() {
setOpaque(falso);
setLayout(nulo);
}
setImage público vacío (Imagen imagen) {
esta.imagen = imagen;
}
/**
* Dibuja el fondo
*/
Componente de pintura vacío protegido (Gráficos g) {
si (imagen! = nulo) {
//ancho de la imagen
int ancho = getAncho();
// altura de la imagen
int altura = getAltura();
//haz el dibujo
g.drawImage(imagen, 0, 0, ancho, alto, esto);
}
super.paintComponent(g);
}
}
Copie el código de código de la siguiente manera:
paquete Juego;
importar java.awt.Container;
importar java.awt.event.*;
importar javax.swing.*;
la clase pública BirdLabel extiende JLabel implementa Runnable {
serialVersionUID largo final estático privado = 1L;
// Genera aleatoriamente el tiempo de sueño del hilo, es decir, controla la velocidad de movimiento del pájaro
privado int sleepTime = (int) (Math.random() * 300) + 5;
int privado y = 100;
hilo privado hilo; // Usar hilo como variable miembro
padre contenedor privado;
puntuación int privada = 15;// La puntuación correspondiente a este tipo de rol
/**
*Método de construcción
*/
Etiqueta de pájaro pública() {
súper();
//Crea un objeto de icono de pájaro
Icono ImageIcon = nuevo ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon);//Establecer el icono de control
addMouseListener(new MouseAction());//Agregar detector de eventos del mouse
//Añadir detector de eventos de control
addComponentListener(nueva AcciónComponente());
thread = new Thread(this);//Crear objeto de hilo
}
/**
* Oyente de eventos de control del control.
*/
ComponentAction de clase final privada extiende ComponentAdapter {
componente vacío públicoResized(final ComponentEvent e) {
thread.start();//Inicio del hilo
}
}
/**
* Oyente de eventos del mouse del control
*/
clase final privada MouseAction extiende MouseAdapter {
public void mousePressed(final MouseEvent e) {
if (!MainFrame.readyAmmo())// Si la bala no está lista
volver;//no hacer nada
MainFrame.useAmmo(); // Consumir balas
appScore(); // Puntos de bonificación
destruir(); // Destruye este componente
}
}
ejecución pública vacía() {
padre = nulo;
ancho entero = 0;
intentar {
mientras (ancho <= 0 || padre == nulo) {
si (padre == nulo) {
parent = getParent(); // Obtener el contenedor principal
} demás {
width = parent.getWidth(); // Obtener el ancho del contenedor principal
}
Hilo.dormir(10);
}
for (int i = ancho; i > 0 && padre != nulo; i -= 8) {
setLocation(i, y);//Mover la posición de este componente de derecha a izquierda
Thread.sleep(sleepTime);//Dormir un rato
}
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
si (padre! = nulo) {
MainFrame.appScore(-score * 10); // La destrucción natural restará puntos
}
destroy();// Una vez completado el movimiento, destruye este componente
}
/**
*Método para eliminar este componente del contenedor
*/
destrucción del vacío público () {
si (padre == nulo)
devolver;
parent.remove(this);//Eliminar este archivo del contenedor principal
padre.repintar();
parent = null; // Termina el ciclo del hilo a través de esta declaración
}
/**
* Formas de sumar puntos
*/
puntuación de aplicación nula privada() {
System.out.println("El pájaro fue alcanzado");
Marco principal.appScore(15);
}
}
Copie el código de código de la siguiente manera:
paquete Juego;
importar java.awt.Container;
importar java.awt.event.*;
importar javax.swing.*;
la clase pública PigLabel extiende JLabel implementa Runnable {
serialVersionUID largo final estático privado = 1L;
// Genera aleatoriamente tiempo de sueño, que es la velocidad de movimiento del jabalí
privado int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//Coordenadas verticales del control
private int score = 10;//La puntuación correspondiente a este personaje
hilo privado hilo; // objeto de hilo incorporado
padre contenedor privado;//El objeto contenedor padre del control
/**
*Método de construcción
*/
etiqueta de cerdo pública() {
súper();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//Cargar imágenes de jabalíes
setIcon(icon);//Establecer el icono de este componente
//Agregar adaptador de eventos de mouse
addMouseListener(nuevo MouseAdapter() {
// Cómo manejar las pulsaciones de los botones del ratón
public void mousePressed(final MouseEvent e) {
si (! MainFrame.readyAmmo())
devolver;
MainFrame.useAmmo(); // Consumir balas
appScore(); // Agrega puntos al juego
destruir(); // Destruye este componente
}
});
//Agregar adaptador de eventos de componente
addComponentListener(nuevo ComponentAdapter() {
//Al cambiar el tamaño del componente
componente vacío públicoResized(final ComponentEvent e) {
thread.start();//Iniciar el hilo
}
});
//Inicializa el objeto hilo
hilo = nuevo hilo (este);
}
ejecución pública vacía() {
padre = nulo;
ancho entero = 0;
while (ancho <= 0 || padre == nulo) {// Obtener el ancho del contenedor principal
si (padre == nulo)
padre = getParent();
demás
ancho = parent.getWidth();
}
//Mueve este componente de izquierda a derecha
for (int i = 0; i < ancho && padre != nulo; i += 8) {
establecerUbicación(i, y);
intentar {
Thread.sleep(sleepTime);//Dormir un rato
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
si (padre! = nulo) {
MainFrame.appScore(-score * 10); // La destrucción natural restará puntos
}
destruir();
}
/**
*Método para eliminar este componente del contenedor
*/
destrucción del vacío público () {
si (padre == nulo)
devolver;
padre.remove(esto);
padre.repintar();
parent = null; // Termina el ciclo del hilo a través de esta declaración
}
/**
* Formas de sumar puntos
*/
puntuación de aplicación nula privada() {
System.out.println("El jabalí fue alcanzado");
Marco principal.appScore(10);
}
}
Copie el código de código de la siguiente manera:
paquete Juego;
importar java.lang.Math.random estático;
importar java.awt.*;
importar java.awt.event.*;
importar javax.swing.*;
MainFrame de clase pública extiende JFrame {
serialVersionUID largo final estático privado = 1L;
puntuación larga estática privada = 0;
Entero estático privado ammoNum = 5;//Número de balas
JLabel estático privado scoreLabel;// puntuación
panel de fondo privado panel de fondo;
ammoLabel JLabel estático privado;
Panel de información JPanel estático privado;
/**
*Método de construcción
*/
Marco principal público() {
súper();
setResizable(false);//Ajustar el tamaño del formulario
setTitle("Juego de caza");
infoPane = (JPanel) getGlassPane(); // Obtener el panel de vidrio
JLabel label = new JLabel("Cargar viñetas...");//Crear componente de etiqueta de solicitud
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(nueva fuente("楷体", Font.BOLD, 32));
label.setForeground(Color.ROJO);
infoPane.setLayout(nuevo BorderLayout());
infoPane.add(label);//Agregar componente de etiqueta de solicitud al panel de vidrio
setAlwaysOnTop(true);//El formulario permanece en el nivel superior
establecer límites (100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // Crea un panel con un fondo
backgroundPanel.setImage(nuevo ImageIcon(getClass().getResource(
"background.jpg")).getImage());//Establecer la imagen de fondo
getContentPane().add(fondoPanel, BorderLayout.CENTER);
//Agregar adaptador de eventos de mouse
addMouseListener(new FrameMouseListener());
scoreLabel = new JLabel(); // Componente de etiqueta que muestra las puntuaciones
scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
scoreLabel.setForeground(Color.NARANJA);
puntuaciónLabel.setText("Puntuación:");
puntuaciónLabel.setBounds(25, 15, 120, 18);
backgroundPanel.add(scoreLabel);
ammoLabel = new JLabel(); // Muestra el número automático de componentes de la etiqueta
ammoLabel.setForeground(Color.NARANJA);
ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("Número de balas: " + ammoNum);
municiónLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* Método de puntos extra
*/
appScore vacío estático sincronizado público (int num) {
puntuación += número;
scoreLabel.setText("Puntuación: " + puntuación);
}
/**
* Cómo consumir balas
*/
uso vacío estático sincronizado públicoMunición() {
sincronizado (numeromunición) {
ammoNum--;// Disminuir el número de balas
ammoLabel.setText("Número de balas: " + ammoNum);
if (ammoNum <= 0) {// Determinar si la bala es menor que 0
nuevo hilo (nuevo ejecutable() {
ejecución pública vacía() {
//Mostrar panel de información del mensaje
infoPane.setVisible (verdadero);
intentar {
// 1 segundo para cargar balas
Hilo.dormir(1000);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
ammoNum = 5;//Restaurar el número de balas
// Modifica el texto de la etiqueta de cantidad de viñetas
ammoLabel.setText("Número de balas: " + ammoNum);
infoPane.setVisible(false);//Ocultar el panel de información del mensaje
}
}).comenzar();
}
}
}
/**
* Determinar si las balas son suficientes.
*
*/
público sincronizado estático booleano readyAmmo() {
sincronizado (numerodemunición) {
devolver número de munición > 0;
}
}
público estático vacío principal (String args []) {
EventQueue.invokeLater(nuevo Ejecutable() {
ejecución pública vacía() {
intentar {
Marco principal = nuevo marco principal();
frame.setVisible (verdadero);
marco.start();
} captura (Excepción e) {
e.printStackTrace();
}
}
});
}
/**
* Cómo iniciar el juego
*/
inicio público vacío() {
nuevo PigThread().start();
nuevo BirdThread().start();
}
/**
* Oyente de eventos del mouse para el formulario.
*
*/
clase final privada FrameMouseListener extiende MouseAdapter {
public void mousePressed(final MouseEvent e) {
Componente en = backgroundPanel.getComponentAt(e.getPoint());
if (en el caso de BackgroundPanel) {// Si hace clic en el panel, también se deducirán las viñetas
MainFrame.useAmmo(); // Consumir balas
}
/*
* if (en instancia de BirdLabel) {//Si haces clic en birdMainFrame.appScore(32);//
* Puntos de bonificación} si (en el caso de PigLabel) {// Si se hace clic en el jabalí
* MainFrame.appScore(11);//Puntos extra}
*/
}
}
/**
* Hilo que genera personajes de cerdo.
*
*/
clase PigThread extiende el hilo {
@Anular
ejecución pública vacía() {
mientras (verdadero) {
//Crear un control de etiqueta que represente al jabalí
PigLabel cerdo = new PigLabel();
pig.setSize(120, 80);//Establece el tamaño inicial del control
backgroundPanel.add(pig);//Agregar controles al panel de fondo
intentar {
//El hilo duerme aleatoriamente durante un período de tiempo.
dormir((largo) (aleatorio() * 3000) + 500);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
}
}
/**
* El hilo que genera el personaje del pájaro.
*
*/
clase BirdThread extiende el hilo {
@Anular
ejecución pública vacía() {
mientras (verdadero) {
//Crear un control de etiqueta que represente al pájaro
BirdLabel pájaro = nuevo BirdLabel();
bird.setSize(50, 50);//Establece el tamaño inicial del control
backgroundPanel.add(bird);//Agregar controles al panel de fondo
intentar {
//El hilo duerme aleatoriamente durante un período de tiempo.
dormir((largo) (Math.random() * 3000) + 500);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
}
}
}
}
Espero que este artículo sea útil para la programación Java de todos.