L'exemple de cet article décrit le code du jeu de chasse et de tir implémenté en Java basé sur Swing. Partagez-le avec tout le monde pour votre référence.
Le code d'implémentation spécifique est le suivant :
Copiez le code comme suit :
jeu de paquet;
importer java.awt.Graphics ;
importer java.awt.Image ;
importer javax.swing.JPanel ;
la classe publique BackgroundPanel étend JPanel {
privé statique final long serialVersionUID = 1L ;
image d'image privée ; // image d'arrière-plan
panneau d'arrière-plan public() {
setOpaque(faux);
setLayout(null);
}
public void setImage(Image image) {
this.image = image;
}
/**
* Dessinez l'arrière-plan
*/
protected void paintComponent (Graphiques g) {
si (image != null) {
//largeur de l'image
int largeur = getWidth();
// hauteur de l'image
int hauteur = getHeight();
// dessine l'image
g.drawImage(image, 0, 0, largeur, hauteur, this);
}
super.paintComponent(g);
}
}
Copiez le code comme suit :
jeu de paquet;
importer java.awt.Container ;
importer java.awt.event.* ;
importer javax.swing.* ;
la classe publique BirdLabel étend JLabel implémente Runnable {
privé statique final long serialVersionUID = 1L ;
// Génère aléatoirement le temps de sommeil du fil, c'est-à-dire contrôle la vitesse de déplacement de l'oiseau
private int sleepTime = (int) (Math.random() * 300) + 5;
int privé y = 100 ;
fil de discussion privé ; // Utiliser le fil comme variable membre
Parent de conteneur privé ;
score private int = 15;//Le score correspondant à ce type de rôle
/**
*Méthode de construction
*/
public BirdLabel() {
super();
//Créer un objet icône oiseau
Icône ImageIcon = new ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon);//Définir l'icône de contrôle
addMouseListener(new MouseAction());//Ajouter un écouteur d'événements de souris
//Ajouter un écouteur d'événement de contrôle
addComponentListener(new ComponentAction());
thread = new Thread(this);//Créer un objet thread
}
/**
* Écouteur d'événements de contrôle du contrôle
*/
La classe finale privée ComponentAction étend ComponentAdapter {
public void composantResized (final ComponentEvent e) {
thread.start();//Début du thread
}
}
/**
* Écouteur d'événements de souris de Control
*/
la classe finale privée MouseAction étend MouseAdapter {
public void mousePressed (final MouseEvent e) {
if (!MainFrame.readyAmmo())// Si la balle n'est pas prête
revenir;//Ne rien faire
MainFrame.useAmmo(); // Consommer des balles
appScore(); //Points bonus
destroy(); // Détruit ce composant
}
}
public void run() {
parent = nul ;
largeur int = 0 ;
essayer {
while (largeur <= 0 || parent == null) {
si (parent == nul) {
parent = getParent(); // Récupère le conteneur parent
} autre {
width = parent.getWidth(); // Récupère la largeur du conteneur parent
}
Thread.sleep(10);
}
pour (int i = largeur; i > 0 && parent != null; i -= 8) {
setLocation(i, y);//Déplacer la position de ce composant de droite à gauche
Thread.sleep(sleepTime);//Dormir un moment
}
} catch (InterruptedException e) {
e.printStackTrace();
}
si (parent != null) {
MainFrame.appScore(-score * 10); // La destruction naturelle déduira des points
}
destroy();// Une fois le déplacement terminé, détruisez ce composant
}
/**
* Méthode pour supprimer ce composant du conteneur
*/
destruction publique du vide() {
si (parent == nul)
retour;
parent.remove(this);//Supprimer ce fichier du conteneur parent
parent.repaint();
parent = null; // Terminez la boucle de thread via cette instruction
}
/**
* Façons d'ajouter des points
*/
privé vide appScore() {
System.out.println("L'oiseau a été touché");
MainFrame.appScore(15);
}
}
Copiez le code comme suit :
jeu de paquet;
importer java.awt.Container ;
importer java.awt.event.* ;
importer javax.swing.* ;
la classe publique PigLabel étend JLabel implémente Runnable {
privé statique final long serialVersionUID = 1L ;
// Génère aléatoirement le temps de sommeil, qui est la vitesse de déplacement du sanglier
private int sleepTime = (int) (Math.random() * 300) + 30;
private int y = 260;//Coordonnées verticales du contrôle
private int score = 10;//Le score correspondant à ce personnage
fil de discussion privé ; // objet de fil intégré
parent du conteneur privé;//l'objet conteneur parent du contrôle
/**
*Méthode de construction
*/
public PigLabel() {
super();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//Charger des photos de sangliers
setIcon(icon);//Définir l'icône de ce composant
//Ajouter un adaptateur d'événement de souris
addMouseListener(nouveau MouseAdapter() {
// Comment gérer les pressions sur les boutons de la souris
public void mousePressed (final MouseEvent e) {
si (!MainFrame.readyAmmo())
retour;
MainFrame.useAmmo(); // Consommer des balles
appScore(); // Ajouter des points au jeu
destroy(); // Détruit ce composant
}
});
//Ajouter un adaptateur d'événement de composant
addComponentListener(nouveau ComponentAdapter() {
//Lors du redimensionnement du composant
public void composantResized (final ComponentEvent e) {
thread.start();//Démarrer le fil de discussion
}
});
// Initialise l'objet thread
fil = nouveau fil (ce);
}
public void run() {
parent = nul ;
largeur int = 0 ;
while (width <= 0 || parent == null) {//Obtenir la largeur du conteneur parent
si (parent == nul)
parent = getParent();
autre
largeur = parent.getWidth();
}
//Déplace ce composant de gauche à droite
pour (int i = 0; i < width && parent != null; i += 8) {
setLocation(je, y);
essayer {
Thread.sleep(sleepTime);//Dormir un moment
} catch (InterruptedException e) {
e.printStackTrace();
}
}
si (parent != null) {
MainFrame.appScore(-score * 10); // La destruction naturelle déduira des points
}
détruire();
}
/**
* Méthode pour supprimer ce composant du conteneur
*/
destruction publique du vide() {
si (parent == nul)
retour;
parent.remove(this);
parent.repaint();
parent = null; // Terminez la boucle de thread via cette instruction
}
/**
* Façons d'ajouter des points
*/
privé vide appScore() {
System.out.println("Le sanglier a été touché");
MainFrame.appScore(10);
}
}
Copiez le code comme suit :
jeu de paquet;
importer java.lang.Math.random statique ;
importer java.awt.* ;
importer java.awt.event.* ;
importer javax.swing.* ;
la classe publique MainFrame étend JFrame {
privé statique final long serialVersionUID = 1L ;
score long statique privé = 0 ; // score
private static Integer ammoNum = 5;//Nombre de balles
JLabel statique privé scoreLabel ; // score
panneau d'arrière-plan privé backgroundPanel ;
JLabel statique privé ammoLabel ;
Panneau d'informations JPanel statique privé ;
/**
*Méthode de construction
*/
public MainFrame() {
super();
setResizing(false);//Ajuster la taille du formulaire
setTitle("Jeu de chasse");
infoPane = (JPanel) getGlassPane(); // Récupère le panneau de verre
JLabel label = new JLabel("Charger les puces...");//Créer un composant d'étiquette d'invite
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font("楷体", Font.BOLD, 32));
label.setForeground(Color.RED);
infoPane.setLayout(new BorderLayout());
infoPane.add(label);//Ajouter un composant d'étiquette d'invite au panneau de verre
setAlwaysOnTop(true);//Le formulaire reste au niveau supérieur
setBounds(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // Crée un panneau avec un arrière-plan
backgroundPanel.setImage(new ImageIcon(getClass().getResource(
"background.jpg")).getImage());//Définir l'image d'arrière-plan
getContentPane().add(backgroundPanel, BorderLayout.CENTER);
//Ajouter un adaptateur d'événement de souris
addMouseListener(nouveau FrameMouseListener());
scoreLabel = new JLabel(); // Composant d'étiquette qui affiche les scores
scoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
scoreLabel.setForeground(Color.ORANGE);
scoreLabel.setText("Score :");
scoreLabel.setBounds(25, 15, 120, 18);
backgroundPanel.add(scoreLabel);
ammoLabel = new JLabel(); // Afficher le nombre automatique de composants d'étiquette
ammoLabel.setForeground(Color.ORANGE);
ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("Nombre de balles : " + ammoNum);
ammoLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* Méthode des points supplémentaires
*/
public synchronisé static void appScore (int num) {
score += nombre ;
scoreLabel.setText("Score : " + score);
}
/**
* Comment consommer des balles
*/
vide statique synchronisé public useAmmo() {
synchronisé (ammoNum) {
ammoNum--;// Diminuer le nombre de balles
ammoLabel.setText("Nombre de balles : " + ammoNum);
if (ammoNum <= 0) {// Détermine si la balle est inférieure à 0
nouveau fil (nouveau Runnable() {
public void run() {
//Afficher le panneau d'informations sur l'invite
infoPane.setVisible(true);
essayer {
// 1 seconde pour charger les balles
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ammoNum = 5;//Restaurer le nombre de balles
// Modifier le texte de l'étiquette de quantité de balle
ammoLabel.setText("Nombre de balles : " + ammoNum);
infoPane.setVisible(false);//Masquer le panneau d'informations d'invite
}
}).commencer();
}
}
}
/**
* Déterminez si les balles sont suffisantes
*
*/
booléen statique synchronisé public readyAmmo() {
synchronisé (ammoNum) {
return ammoNum > 0 ;
}
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
essayer {
Cadre MainFrame = new MainFrame();
frame.setVisible(true);
frame.start();
} attraper (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Comment démarrer le jeu
*/
public void start() {
new PigThread().start();
new BirdThread().start();
}
/**
* Écouteur d'événements de souris pour le formulaire
*
*/
la classe finale privée FrameMouseListener étend MouseAdapter {
public void mousePressed (final MouseEvent e) {
Composant à = backgroundPanel.getComponentAt(e.getPoint());
if (à l'instance de BackgroundPanel) {//Si vous cliquez sur le panneau, les puces seront également déduites
MainFrame.useAmmo(); // Consommer des balles
}
/*
* if (à l'instance de BirdLabel) {//Si vous cliquez sur birdMainFrame.appScore(32);//
* Points bonus} si (à l'instance de PigLabel) {// Si le sanglier est cliqué
* MainFrame.appScore(11);//Points supplémentaires}
*/
}
}
/**
* Fil qui génère des personnages de cochons
*
*/
la classe PigThread étend le fil {
@Outrepasser
public void run() {
tandis que (vrai) {
//Créer un champ label représentant le sanglier
PigLabel pig = new PigLabel();
pig.setSize(120, 80);//Définir la taille initiale du contrôle
backgroundPanel.add(pig);//Ajouter des contrôles au panneau d'arrière-plan
essayer {
//Le fil dort de manière aléatoire pendant un certain temps
dormir((long) (random() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* Le fil qui génère le personnage de l'oiseau
*
*/
la classe BirdThread étend le fil {
@Outrepasser
public void run() {
tandis que (vrai) {
//Créer un contrôle label représentant l'oiseau
BirdLabel oiseau = new BirdLabel();
bird.setSize(50, 50);//Définir la taille initiale du contrôle
backgroundPanel.add(bird);//Ajouter des contrôles au panneau d'arrière-plan
essayer {
//Le fil dort de manière aléatoire pendant un certain temps
dormir((long) (Math.random() * 3000) + 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
J'espère que cet article sera utile à la programmation Java de chacun.