- 項目:飛機大戰小遊戲之UI界面
- 項目簡介:飛機大戰小遊戲的UI界面、鼠標的點擊事件(監聽器)和動態背景的繪製(定時器)
- 開發工具:eclipse
- 語言:Java
- 知識點:JFrame、IO、監聽器、定時器
代碼架構:程序分兩個包,共兩個類,一個實現大多功能的主程序類,一個圖片讀取類
操作效果圖:
ImageUtil.java:遊戲加載圖片的工具類
package com.demo.util;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* 遊戲加載圖片的工具類
*/
public class ImageUtil {
/**
* 加載磁盤指定圖片文件進入到程序的內存中
* @param name
* @return
*/
public static BufferedImage readImage(String name){
try {
return ImageIO.read(new File("images",name));
} catch (IOException e) {
e.printStackTrace();
}
return null; //若找不到圖片返回null
}
}
GameStart.java:主程序
package com.demo.model;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.demo.util.ImageUtil;
/**
* 飛機大戰小遊戲(一):UI界面
* @author suoyue_zhan
*/
public class GameStart extends JPanel {
// 背景圖片
private BufferedImage background1 = ImageUtil.readImage("background1.jpg");
private BufferedImage backgroundA = ImageUtil.readImage("background2.png");
private BufferedImage backgroundB = ImageUtil.readImage("background2.png");
//遊戲狀態圖片
private BufferedImage start = ImageUtil.readImage("start.png");
private BufferedImage pause = ImageUtil.readImage("pause.png");
private BufferedImage gameover = ImageUtil.readImage("gameover.png");
//遊戲狀態
private static final int START = 0; //開始狀態
private static final int RUNNING = 1;//進行狀態
private static final int PAUSE = 2; //暫停狀態
private static final int GAME_OVER = 3;//結束狀態
private int state = START; //默認是開始狀態
// 重寫JPanel的繪製方法-->>所有圖片都在該方法上執行
@Override
public void paint(Graphics g) {
if(state == RUNNING) {
//繪製動態背景
this.paintBackground(g);
}
//非RUNNING狀態執行
this.paintState(g);
}
/**
* 繪製遊戲狀態
* @param g
*/
private void paintState(Graphics g){
if(state == START) {
g.drawImage(start, 0, 0, null);
}else if(state == PAUSE) {
g.drawImage(pause, 0, 0, null);
}else if (state == GAME_OVER) {
g.drawImage(gameover, 0, 0, null);
}
}
//繪製背景
private int yA = -backgroundA.getHeight();
private int yB = 0;
public void paintBackground(Graphics g) {
// 方法:將背景圖畫到畫板上
// 參數:圖片,x軸,y軸,忽略
g.drawImage(background1, 0, 0, null);
g.drawImage(backgroundA, 0, yA, null);
g.drawImage(backgroundB, 0, yB, null);
}
/**
*********遊戲邏輯方法--------------
*/
//背景移動方法-->>圖片的循環下移
private void backgroundMove(){
yA++;
yB++;
if(yB >= backgroundA.getHeight()){
yB = -backgroundA.getHeight();
}
if(yA >= backgroundA.getHeight()){
yA = -backgroundA.getHeight();
}
}
/**
* 窗口初始化
*/
public void init() {
JFrame jFrame = new JFrame("飛機大戰"); // 設置窗口標題
jFrame.add(this); // this表示類UI,也表示畫板
jFrame.setSize(400, 654); // 設置窗口大小
jFrame.setLocationRelativeTo(null); // 設置窗口居中
jFrame.setAlwaysOnTop(true); // 設置窗口總是在頂端
jFrame.setResizable(false); // 設置不允許拖拉
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 關閉窗口時退出程序
jFrame.setIconImage(new ImageIcon("./images/icon.png").getImage()); // 設置圖標
jFrame.setVisible(true); // 使窗口顯示出來
initListener(); //安裝程序監聽器
initTimer(); //設置定時器,用於實現遊戲中所有的動態邏輯效果
}
/**
* 監控鼠標的監聽器
*/
private void initListener() {
MouseAdapter adapter = new MouseAdapter() {
//鼠標移動監聽方法
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("x:"+e.getX()+"y:"+e.getY());
}
//鼠標點擊事件
@Override
public void mouseClicked(MouseEvent e) {
//鼠標點擊畫板時執行
if(state == START){
state = RUNNING;
}else if(state == RUNNING){
state = GAME_OVER;
}else if(state == GAME_OVER){
state = START;
}
}
//鼠標移出去時事件
@Override
public void mouseExited(MouseEvent e) {
if(state == RUNNING){
state = PAUSE;
}
}
//鼠標移進來時事件
@Override
public void mouseEntered(MouseEvent e) {
if(state == PAUSE){
state = RUNNING;
}
}
};
//安裝監聽器
this.addMouseListener(adapter);
this.addMouseMotionListener(adapter);
}
/**
* 定時器
*/
public void initTimer() {
Timer timer = new Timer(); //定時器對象
long delay = 10;
long period = 10;
//定時執行操作
//參數1:每隔一段時間執行的操作
//參數2:幾毫米之後執行定時器
//參數3:每個幾毫米執行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
backgroundMove(); //背景移動
repaint(); //從新繪製頁面
}
}, delay,period);
}
/*
* 程序入口main()
*/
public static void main(String[] args) {
System.out.println("遊戲開始了.....");
GameStart gameStart = new GameStart();
gameStart.init(); //顯示主界面
}
}