Java飛機大戰小遊戲(一):UI就是這麼玩

  • 項目:飛機大戰小遊戲之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(); //顯示主界面
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章