Любая игра или приложение отображается в окне, которое можно реализовать следующими файлами:
Первый файл запускает наше игровое окно с параметрами.
Окно создаётся с помощью класса JFrame.
Файл GameStart.java
package kuzma;
import javax.swing.JFrame;
public class GameStart {
public static void main(String[] args) {
GamePanel panel = new GamePanel();// создаём объект панель
JFrame startFrame = new JFrame("game");// создаем окно с названием
startFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// закрытие окна при клике крестика
startFrame.setContentPane(panel); // перенос в фрейм панели с GamePanel
startFrame.setLocationRelativeTo(null);//положение фрейма по центру
startFrame.pack();//размер фрейма как и размер его компонентов
panel.start();// заускаем поток панели
// окно видемо
startFrame.setVisible(true);
}
}
Второй необходимый файл -панель на которой происходят все действия...
Файл GamePanel.java
package kuzma;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class GamePanel extends JPanel implements Runnable {
// задаём размер панели
public static int WIDTH = 400;//
public static int HEIGHT = 400;//
private Thread thread; // Создаем поток- ссылка на обьект класса Thread
private BufferedImage image; // ссылка на обьект класса
private Graphics2D g; // ссылка на обьект класса
private GameBack background;
// конструктор
public GamePanel() {
super(); // активируем консруктор родителя
setPreferredSize(new Dimension(WIDTH, HEIGHT)); // размер передаем в обьект класса Измерения
setFocusable(true); //передаем фокус
requestFocus(); // акивируем
}
// запуск потока
public void start() {
thread = new Thread((Runnable) this);
thread.start();// запускаем поток
}
//метод от интерфейса Runnable (потока)
@Override
public void run() {
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g = (Graphics2D) image.getGraphics();
background = new GameBack();
while (true) { // игровой цикл
gameUpdate(); //обновление
gameRender(); //перерисовка
gameDraw(); ////перенос изображения на панель
try {
thread.sleep(33); //засыпаем на ... мс
} catch (InterruptedException ex) { //если не удается заснуть- исключение
ex.printStackTrace();
}
}
}
//обновление
public void gameUpdate() { //обновление
background.update();// вызов метода для заднего плана
}
//рисуем задний план в виртуальном окне
public void gameRender() { //перерисовка
background.draw(g);// вызов метода для заднего плана
}
//перенос изображения на панель
private void gameDraw() {
Graphics g2 = this.getGraphics();// переоппред Graphics2d на Graphics
g2.drawImage(image, 0, 0, null);// рисуем
g2.dispose();// команда для уборщщика мусора
}
}
Файл GameBack.java
package kuzma;
/**
Задний фон игровой панели
*/
import javax.swing.*;
import java.awt.*;
public class GameBack {
private Color color;
Image img = new ImageIcon("res/dieta.jpg").getImage();//загрузка картинки
public GameBack() {
color = Color.BLUE;
}
public void update() { //обновление
}
public void draw(Graphics2D g) { //прорисовка в Graphics2D
g.setColor(color);//передаём цвет граф объекту
g.fillRect(0, 0, GamePanel.WIDTH, GamePanel.HEIGHT);//рисуем прямоугольную область
Color newColor = new Color(200, 200, 0);//созд обьект клсса цвет
g.setColor(newColor);// передаём цвет граф объекту
g.fillRect(0, 0, GamePanel.WIDTH, 10);//рисуем прямоугольную область
g.drawImage(img, 40, 40, null);//рисуем картинку
}
}
|