В примере в этой статье описывается код игры «охота и стрельба», реализованный на Java на основе Swing. Поделитесь этим со всеми для справки.
Конкретный код реализации выглядит следующим образом:
Скопируйте код кода следующим образом:
пакет игры;
импортировать java.awt.Graphics;
импортировать java.awt.Image;
импортировать javax.swing.JPanel;
публичный класс BackgroundPanel расширяет JPanel {
частный статический окончательный длинный серийныйVersionUID = 1L;
изображение частного изображения; // фоновое изображение
общественная BackgroundPanel() {
setOpaque (ложь);
setLayout (нуль);
}
public void setImage (изображение изображения) {
это.изображение = изображение;
}
/**
* Нарисуйте фон
*/
protected void PaintComponent(Graphics g) {
если (изображение != ноль) {
//ширина изображения
int ширина = getWidth();
// высота изображения
int высота = getHeight();
// рисуем картинку
g.drawImage(изображение, 0, 0, ширина, высота, это);
}
супер.paintComponent(г);
}
}
Скопируйте код кода следующим образом:
пакет игры;
импортировать java.awt.Container;
импортировать java.awt.event.*;
импортировать javax.swing.*;
публичный класс BirdLabel расширяет JLabel и реализует Runnable {
частный статический окончательный длинный серийныйVersionUID = 1L;
// Случайным образом генерируем время сна потока, то есть контролируем скорость перемещения птицы
частный int SleepTime = (int) (Math.random() * 300) + 5;
частный интервал у = 100;
частный поток потока // Использование потока в качестве переменной-члена;
частный родительский контейнер;
Private int Score = 15;//Оценка, соответствующая этому типу роли
/**
*Метод строительства
*/
общественная BirdLabel() {
супер();
//Создаем объект значка птицы
Значок ImageIcon = новый ImageIcon(getClass().getResource("bird.gif"));
setIcon(icon);//Установим иконку управления
addMouseListener(new MouseAction());//Добавляем прослушиватель событий мыши
//Добавляем прослушиватель событий управления
addComponentListener (новый ComponentAction());
thread = new Thread(this);//Создаем объект потока
}
/**
* Прослушиватель событий управления элементом управления
*/
частный конечный класс ComponentAction расширяет ComponentAdapter {
public void компонентResized(final ComponentEvent e) {
thread.start();//Начало потока
}
}
/**
* Прослушиватель событий мыши управления
*/
частный конечный класс MouseAction расширяет MouseAdapter {
public void mousePressed (final MouseEvent e) {
if (!MainFrame.readyAmmo())// Если пуля не готова
вернуться;//Ничего не делать
MainFrame.useAmmo(); // Расходуем пули
appScore(); // Бонусные баллы
уничтожить(); // Уничтожить этот компонент
}
}
общественный недействительный запуск () {
родитель = ноль;
ширина интервала = 0;
пытаться {
while (ширина <= 0 || родительский == null) {
если (родитель == ноль) {
родитель = getParent(); // Получаем родительский контейнер
} еще {
width = Parent.getWidth(); // Получаем ширину родительского контейнера
}
Thread.sleep(10);
}
for (int i = ширина; i > 0 && родительский != null; i -= 8) {
setLocation(i, y);//Перемещаем положение этого компонента справа налево
Thread.sleep(sleepTime);//Поспим немного
}
} catch (InterruptedException e) {
е.printStackTrace();
}
если (родительский != ноль) {
MainFrame.appScore(-score * 10); // При естественном разрушении будут вычитаться очки.
}
уничтожить();//После завершения перемещения уничтожаем этот компонент
}
/**
* Метод удаления этого компонента из контейнера
*/
публичное уничтожение пустоты() {
если (родительский == ноль)
возвращаться;
Parent.remove(this);//Удалить этот файл из родительского контейнера
родитель.перекрасить();
родитель = null // Завершаем цикл потока с помощью этого оператора;
}
/**
* Способы добавления баллов
*/
частный недействительный appScore() {
System.out.println("Птица сбита");
MainFrame.appScore(15);
}
}
Скопируйте код кода следующим образом:
пакет игры;
импортировать java.awt.Container;
импортировать java.awt.event.*;
импортировать javax.swing.*;
публичный класс PigLabel расширяет JLabel и реализует Runnable {
частный статический окончательный длинный серийныйVersionUID = 1L;
// Случайным образом генерируем время сна, которое представляет собой скорость движения кабана
частный int SleepTime = (int) (Math.random() * 300) + 30;
Private int y = 260;//Вертикальные координаты элемента управления
Private int Score = 10;//Оценка, соответствующая этому символу
частный поток потока // встроенный объект потока;
частный родительский контейнер;//Родительский объект-контейнер элемента управления
/**
*Метод строительства
*/
общественная PigLabel() {
супер();
ImageIcon icon = new ImageIcon(getClass().getResource("pig.gif"));//Загрузка изображений кабана
setIcon(icon);//Установим иконку этого компонента
//Добавляем адаптер событий мыши
addMouseListener (новый MouseAdapter () {
// Как обрабатывать нажатия кнопок мыши
public void mousePressed (final MouseEvent e) {
если (!MainFrame.readyAmmo())
возвращаться;
MainFrame.useAmmo(); // Расходуем пули
appScore(); // Добавляем очки в игру
уничтожить(); // Уничтожить этот компонент
}
});
//Добавляем адаптер событий компонента
addComponentListener (новый ComponentAdapter () {
//При изменении размера компонента
public void компонентResized(final ComponentEvent e) {
thread.start();//Запускаем поток
}
});
//Инициализируем объект потока
нить = новая тема (это);
}
общественный недействительный запуск () {
родитель = ноль;
ширина интервала = 0;
while (width <= 0 || родительский == null) {//Получить ширину родительского контейнера
если (родительский == ноль)
родитель = getParent();
еще
ширина = родительский.getWidth();
}
//Перемещаем этот компонент слева направо
for (int i = 0; i < width && родительский != null; i += 8) {
setLocation (я, у);
пытаться {
Thread.sleep(sleepTime);//Поспим немного
} catch (InterruptedException e) {
е.printStackTrace();
}
}
если (родительский != ноль) {
MainFrame.appScore(-score * 10); // При естественном разрушении будут вычитаться очки.
}
разрушать();
}
/**
* Метод удаления этого компонента из контейнера
*/
публичное уничтожение пустоты() {
если (родительский == ноль)
возвращаться;
родитель.удалить(это);
родитель.перекрасить();
родитель = null // Завершаем цикл потока с помощью этого оператора;
}
/**
* Способы добавления баллов
*/
частный недействительный appScore() {
System.out.println("Кабан сбит");
MainFrame.appScore(10);
}
}
Скопируйте код кода следующим образом:
пакет игры;
импортировать статический java.lang.Math.random;
импортировать java.awt.*;
импортировать java.awt.event.*;
импортировать javax.swing.*;
публичный класс MainFrame расширяет JFrame {
частный статический окончательный длинный серийныйVersionUID = 1L;
частная статическая длинная оценка = 0 // оценка;
Private static Integer ammoNum = 5;//Количество пуль
частный статический JLabel ScoreLabel;// оценка
частная BackgroundPanel backgroundPanel;
частный статический JLabel ammoLabel;
частная статическая информационная панель JPanel;
/**
*Метод строительства
*/
общественный MainFrame() {
супер();
setResizable(false);//Отрегулируйте размер формы
setTitle("Охота");
infoPane = (JPanel) getGlassPane(); // Получаем стеклянную панель.
JLabel label = new JLabel("Загрузить маркеры...");//Создать компонент метки приглашения
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font("楷体", Font.BOLD, 32));
label.setForeground(Color.RED);
infoPane.setLayout(новый BorderLayout());
infoPane.add(label);//Добавляем компонент метки подсказки на стеклянную панель
setAlwaysOnTop(true);//Форма остается на верхнем уровне
setBounds(100, 100, 573, 411);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundPanel = new BackgroundPanel(); // Создаем панель с фоном.
backgroundPanel.setImage(new ImageIcon(getClass().getResource(
"background.jpg")).getImage());//Установим фоновое изображение
getContentPane().add(backgroundPanel, BorderLayout.CENTER);
//Добавляем адаптер событий мыши
addMouseListener (новый FrameMouseListener());
ScoreLabel = new JLabel(); // Компонент метки, отображающий результаты.
ScoreLabel.setHorizontalAlignment(SwingConstants.CENTER);
ScoreLabel.setForeground(Color.ORANGE);
ScoreLabel.setText("Оценка:");
ScoreLabel.setBounds(25, 15, 120, 18);
backgroundPanel.add(scoreLabel);
ammoLabel = new JLabel() // Отображение автоматического количества компонентов этикетки
ammoLabel.setForeground(Color.ORANGE);
ammoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
ammoLabel.setText("Количество пуль: " + ammoNum);
ammoLabel.setBounds(422, 15, 93, 18);
backgroundPanel.add(ammoLabel);
}
/**
* Метод дополнительных баллов
*/
общедоступная синхронизированная статическая сила appScore(int num) {
оценка += число;
ScoreLabel.setText("Оценка: " + оценка);
}
/**
* Как потреблять пули
*/
общедоступная синхронизированная статическая сила useAmmo() {
синхронизировано (ammoNum) {
ammoNum--;//Уменьшаем количество пуль
ammoLabel.setText("Количество пуль: " + ammoNum);
if (ammoNum <= 0) {// Определяем, меньше ли пуля 0
новый поток (новый Runnable () {
общественный недействительный запуск () {
//Отображение панели подсказки с информацией
infoPane.setVisible(истина);
пытаться {
// 1 секунда на загрузку пуль
Thread.sleep(1000);
} catch (InterruptedException e) {
е.printStackTrace();
}
ammoNum = 5;//Восстанавливаем количество пуль
// Изменяем текст метки количества маркеров
ammoLabel.setText("Количество пуль: " + ammoNum);
infoPane.setVisible(false);//Скрываем панель подсказки
}
}).начинать();
}
}
}
/**
* Определите, достаточно ли пуль
*
*/
общедоступная синхронизированная статическая логическая функция ReadAmmo() {
синхронизировано (ammoNum) {
вернуть аммонум > 0;
}
}
public static void main(String args[]) {
EventQueue.invokeLater(новый Runnable() {
общественный недействительный запуск () {
пытаться {
Кадр MainFrame = новый MainFrame();
Frame.setVisible(истина);
кадр.старт();
} catch (Исключение е) {
е.printStackTrace();
}
}
});
}
/**
* Как начать игру
*/
общественный недействительный старт () {
новый PigThread().start();
новый BirdThread().start();
}
/**
* Прослушиватель событий мыши для формы.
*
*/
частный конечный класс FrameMouseListener расширяет MouseAdapter {
public void mousePressed (final MouseEvent e) {
Компонент at = backgroundPanel.getComponentAt(e.getPoint());
if (at instanceof BackgroundPanel) {//Если вы нажмете на панель, пули также будут вычтены
MainFrame.useAmmo(); // Расходуем пули
}
/*
* if (в экземпляре BirdLabel) {//Если вы нажмете на BirdMainFrame.appScore(32);//
* Бонусные баллы} if (в экземпляре PigLabel) {// Если щелкнуть кабана
* MainFrame.appScore(11);//Дополнительные баллы}
*/
}
}
/**
* Тема, генерирующая персонажей-свиней.
*
*/
класс PigThread расширяет поток {
@Override
общественный недействительный запуск () {
в то время как (истина) {
//Создаем элемент управления меткой, представляющий кабана
PigLabel pig = новая PigLabel();
pig.setSize(120, 80); //Устанавливаем начальный размер элемента управления
backgroundPanel.add(pig);//Добавляем элементы управления на фоновую панель
пытаться {
//Поток случайно засыпает на некоторое время
Sleep((long) (random() * 3000) + 500);
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
}
/**
* Поток, генерирующий персонажа-птицу
*
*/
класс BirdThread расширяет поток {
@Override
общественный недействительный запуск () {
в то время как (истина) {
//Создаем элемент управления меткой, представляющий птицу
BirdLabel птица = новая BirdLabel();
bird.setSize(50, 50);//Устанавливаем начальный размер элемента управления
backgroundPanel.add(bird);//Добавляем элементы управления на фоновую панель
пытаться {
//Поток случайно засыпает на некоторое время
Sleep((long) (Math.random() * 3000) + 500);
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.