GameFram類

package com.wh.game;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.Date;

public class GameFrame extends Frame {
	/**
	 * 展示窗口
	 */
	public void showFrame() {
		this.setTitle("雷火戰機");
		this.setVisible(true);
		this.setSize(Constant.FRAME_WIDTh, Constant.FRAME_HEIGHT);
		this.setLocation(600, 200);
		/**
		 * 窗口監聽器,適配器以及窗口關閉時觸發的事件
		 */
		this.addWindowListener(new WindowAdapter() {

			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}

		});
		new printThread().start();// 設置線程要啓動
		addKeyListener(new KeyMonitor());// 啓動鍵盤適配器先要在窗口增加一個鍵盤監聽
		for (int i = 0; i < shells.length; i++) {
			shells[i] = new Shell();
		}
	}

	/**
	 * main程序的入口
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GameFrame gameFrame = new GameFrame();
		gameFrame.showFrame();
	}

	/**
	 * 畫背景和飛機
	 * 
	 * @param args
	 */
	Image backgroundImg = GameUtil.getImage("image/background.png");
	Image planeImg = GameUtil.getImage("image/plane.png");
	// int x = 200;
	Plane plane = new Plane(planeImg, 350, 400);
	/**
	 * 畫出多個炮彈
	 */
	Shell[] shells = new Shell[8];

	/**
	 * 創建對象的時候開始計時
	 */
	Date startDate = new Date();
	Date endDate;
	int playTime;

	@Override
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		super.paint(g);
		// g.drawLine(100, 100, 200, 200);
		g.drawImage(backgroundImg, 0, 0, null);
		/*
		 * g.drawImage(planeImg, x, 500, null); x++;
		 */
		plane.printObject(g);
		g.setColor(Color.blue);
		Font font = new Font("宋體", Font.BOLD, 40);// 設置字體要先創建一個字體對象
		g.setFont(font);
		for (int i = 0; i < shells.length; i++) {
			shells[i].printShell(g);
			boolean crash = shells[i].getRectangle().intersects(plane.getRectangle());
			if (crash) {
				plane.live = false;

			}
			// 兩個矩形重合的時候就可以觸發事件

		}
		/**
		 * 飛機存活的時候在計時,當飛機死亡的時候計時結束
		 */
		if (plane.live) {
			endDate = new Date();
			playTime = (int) ((endDate.getTime() - startDate.getTime()) / 1000);

		}
		/**
		 * 打印時間
		 */
		if (!plane.live) {
			g.drawString("遊戲結束,挑戰用時:" + playTime+"S", 200, 400);
		}
	}

	/**
	 * 啓動多線程,內部類讓飛機動起來
	 */
	class printThread extends Thread {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				repaint();
				try {
					Thread.sleep(40);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	/**
	 * 雙緩衝解決閃爍問題,插入空圖片和背景
	 */
	private Image iBuffer = null;

	@Override
	public void update(Graphics g) {
		// TODO Auto-generated method stub
		if (iBuffer == null) {
			iBuffer = this.createImage(Constant.FRAME_WIDTh, Constant.FRAME_HEIGHT);
		}
		Graphics gBuffer = iBuffer.getGraphics();// 通過空圖片獲得圖形
		print(gBuffer);// 打印上一步獲得的圖形
		g.drawImage(iBuffer, 0, 0, null);// 把圖形畫在窗口上
	}

	/**
	 * 啓動鍵盤適配器添加按鬆時的事件
	 */
	class KeyMonitor extends KeyAdapter {
		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			plane.addDirection(e);
		}

		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			plane.delDirection(e);
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章