主頁 >  其他 > 飛機游戲代碼(JAVA)

飛機游戲代碼(JAVA)

2020-09-18 17:07:36 其他

MyGameFrame類:

主要的呼叫類

package sc.wh.game;

import javax.swing.JFrame;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import sc.wh.game.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;


public class MyGameFrame extends Frame {
	// 呼叫工具類的getImage方法加載圖片物件
	Image planeImg = GameUtil.getImage("images/plane.png");
	Image bg = GameUtil.getImage("images/bg.jpg");
	
	// 創建飛機,設定初始位置
	Plane plane = new Plane(planeImg,250,250);
	// 創建炮彈組
	Shell shells[] = new Shell[50];
	// 設定爆炸效果類的物件的參考
	Explode bao;
	// 游戲開始時間
	Date startTime = new Date();
	// 游戲結束時間
	Date endTime;
	// 游戲進行的時間
	int period;
	// 記錄爆炸效果顯示的圖片
	int BaoCount = 0;
	
	// 在視窗畫圖方法,由repaint方法自動呼叫
	@Override
	public void paint(Graphics g) { // 會自動被呼叫,g相當于一支畫筆
		Color c = g.getColor();
		// 畫背景
		g.drawImage(bg,0,0,null);
		// 呼叫飛機類的畫圖方法并畫飛機
		plane.drawSelf(g);
		// 畫炮彈組中的炮彈
		for (int i=0;i<shells.length;i++) {
			// 呼叫炮彈物件的draw方法
			shells[i].draw(g);
			// 獲取炮彈所在矩形位置并呼叫intersects判斷兩矩形是否相交
			boolean peng =  shells[i].getRect().intersects(plane.getRect());
			if(peng) {
				// 如果相交則設定飛機存活狀態為false
				plane.live = false;
				// 如果bao物件沒有初始化過則才初始化
				if(bao == null) {
					bao = new Explode(plane.x, plane.y);
					endTime = new Date();
					period = (int)(endTime.getTime() - startTime.getTime())/1000;
				}
				if(BaoCount <= 15) {
					// 呼叫爆炸效果顯示類的畫圖方法,每次呼叫只畫一張圖
					bao.draw(g);
					BaoCount++;
				}
				
			}
			// 如果飛機未存活則顯示游戲時間
			if(!plane.live) {
				// 創建字體物件
				Font f = new Font("宋體",Font.BOLD,50);
				// 設定字體
				g.setFont(f);
				// 設定字體顏色
				g.setColor(Color.RED);
				// 顯示游戲結束時間
				g.drawString("游戲時間:" + period + "秒", 100, 250);
			}
		}
		g.setColor(c);
	}
	
	// 繼承Thread執行緒類
	class PaintThread extends Thread{
		// 執行緒開始后會自動呼叫run方法
		@Override
		public void run() {
			while (true) {
				// 呼叫repaint視窗畫圖方法,此方法會自動呼叫paint方法
				repaint(); 
				try {
					// 控制一秒25次在視窗畫圖的方法
					Thread.sleep(40);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}
	}
	// 創建鍵盤檢測內部類,并繼承鍵盤監聽類
	class KeyMonitor extends KeyAdapter{

		// 檢測鍵盤按下事件,呼叫飛機類對應的方法
		@Override
		public void keyPressed(KeyEvent e) {
			// KeyEvent鍵盤檢測類
			plane.addDirection(e);
		}
		// 檢測鍵盤釋放事件,呼叫飛機類對應的方法
		@Override
		public void keyReleased(KeyEvent e) {
			plane.minusDirection(e);
		}
		
	}
	
	// 雙緩沖解決閃爍
	private Image offScreenImage = null;
	public void update(Graphics g) {
	    if(offScreenImage == null)
	        offScreenImage = this.createImage(Constants.WIDTH,Constants.HEIGHT);//這是游戲視窗的寬度和高度
	     
	    Graphics gOff = offScreenImage.getGraphics();
	    paint(gOff);
	    g.drawImage(offScreenImage, 0, 0, null);
	}   
	
    public void launchFrame(){
        // 標題
        this.setTitle("game fly");
        // 視窗默認不可見
        this.setVisible(true);
        // 視窗大小
        this.setSize(Constants.WIDTH,Constants.HEIGHT);
        // 視窗距離左上角的坐標位置
        this.setLocation(300,300);
        //增加關閉視窗監聽,這樣用戶點擊右上角關閉圖示,可以關閉游戲程式
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        
        // 創建在視窗中畫圖執行緒并呼叫
        new PaintThread().start();
        // 將KeyMonitor類的物件加入鍵盤監控檢測,對應的事件會自動呼叫此類對應的方法
        addKeyListener(new KeyMonitor());
        // 創建炮彈,加入炮彈陣列
        for(int i=0;i<shells.length;i++) {
        	shells[i] = new Shell();
        }
        
    }

    public static void main(String[] args) {
        MyGameFrame f = new MyGameFrame();
        // 呼叫畫視窗方法
        f.launchFrame();
    }
}

工具類(用來獲取圖片物件):

package sc.wh.game;
 
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
 
public class GameUtil {
    // 工具類最好將構造器私有化,
    private GameUtil() {
     
    } 
 
    public static Image getImage(String path) {
        BufferedImage bi = null;
        try {
            URL u = GameUtil.class.getClassLoader().getResource(path);
            bi = ImageIO.read(u);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bi;
    }
}

用來存盤常量的類:

package sc.wh.game;

public class Constants {
	public static int WIDTH = 500;
	public static int HEIGHT = 500;
}

所有游戲物件的父類:

package sc.wh.game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;

// 游戲父類
public class GameObject {
	Image img;  // 創建img物件
	double x,y; // 坐標
	int speed; // 速度
	int width,height; // 寬高
	// 畫圖方法
	public void drawSelf(Graphics g) {
		g.drawImage(img,(int)x,(int)y, null);
	}
	// 構造方法
	public GameObject(Image img, double x, double y, int speed, int width, int height) {
		super();
		this.img = img;
		this.x = x;
		this.y = y;
		this.speed = speed;
		this.width = width;
		this.height = height;
	}
	public GameObject(Image img, double x, double y) {
		super();
		this.img = img;
		this.x = x;
		this.y = y;
	}
	public GameObject() {
		
	}
	// 根據物體所在位置和寬度高度,回傳物體所在的矩形,便與后續的碰撞檢測
	public Rectangle getRect() {
		return new Rectangle((int)x,(int)y,width,height);
	}
	
}

飛機類:

package sc.wh.game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;

// 飛機類,繼承自游戲類,擁有游戲類對應的方法和屬性
public class Plane extends GameObject{
	// 當有鍵盤事件時,判斷飛機移動的方向
	boolean left,right,up,down;
	// 飛機移動的速度
	int speed =;
	// 用于判斷飛機是否存活
	boolean live = true;
	// 畫飛機的方法,可根據鍵盤事件設定(left,right...)布林值實時調整飛機位置
	public void drawSelf(Graphics g) {
		// 如果飛機存活,才呼叫畫圖方法
		if(live) {
			if(right) {
				x += speed;
			}
			if(left) {
				x -= speed;
			}
			if (up) {
				y -= speed;
			}
			if(down) {
				y += speed;
			}
			if (x<=0) {
				x = 0;
			}else if(x >= 460) {
				x = 460;
			}
			if(y <= 40) {
				y = 40;
			}else if(y >= 470) {
				y = 470;
			}
			// 根據位置畫圖
			g.drawImage(img,(int)x,(int)y, null);
		}
		
		
	}
	// 構造方法
	public Plane(Image img,double x, double y) {
		this.img = img;
		this.x = x;
		this.y = y;
		// 根據img物件的get..方法獲取圖片大小,用于矩形實作碰撞檢測
		this.width = img.getWidth(null);
		this.height = img.getHeight(null);
	}
	// 鍵盤按下時,會呼叫此方法來設定移動的方向
	public void addDirection(KeyEvent e) {
		// getKeyCode可以獲取按下鍵盤對應特定的值
		switch (e.getKeyCode()) {
		case KeyEvent.VK_LEFT:
			left = true;
			break;
		case KeyEvent.VK_RIGHT:
			right = true;
			break;
		case KeyEvent.VK_UP:
			up = true;
			break;
		case KeyEvent.VK_DOWN:
			down = true;
			break;
		}	
	}
	// 鍵盤松開時,會呼叫此方法來設定取消移動的方向
	public void minusDirection(KeyEvent e) {
		// getKeyCode可以獲取按下鍵盤對應特定的值
		switch (e.getKeyCode()) {
		case KeyEvent.VK_LEFT:
			left = false;
			break;
		case KeyEvent.VK_RIGHT:
			right = false;
			break;
		case KeyEvent.VK_UP:
			up = false;
			break;
		case KeyEvent.VK_DOWN:
			down = false;
			break;
		}	
	}
}

炮彈類:

package sc.wh.game;

import java.awt.Color;
import java.awt.Graphics;

// 炮彈類
public class Shell extends GameObject{
	double degree; // 炮彈移動角度
	// 構造方法
	public Shell() {
		x = 200; // 設定炮彈的初始位置
		y = 200;
		width = 10; // 設定炮彈的大小
		height = 10;
		speed = 3; // 設定炮彈的速度
		degree = Math.random() * Math.PI * 2; // 隨機設定炮彈的初始角度
	}
	
	// 畫炮彈的方法
	public void draw(Graphics g) {
		Color c = g.getColor();
		g.setColor(Color.YELLOW); // 設定顏色
		if(x <= 0|| x >= Constants.WIDTH-width-10) {
			degree = Math.PI - degree; // 當碰撞水平地圖邊界后,反轉角度
		}
		if(y<=40 || y >= Constants.HEIGHT-height) {
			degree = -degree; // 當碰撞垂直地圖后,反轉角度
		}
		// 填充一個圓作為炮彈
		g.fillOval((int)x, (int)y, width, height);
		// 根據角度設定炮彈移動的位置
		x += speed*Math.cos(degree);
		y += speed*Math.sin(degree);
		g.setColor(c);
	}
	
}

顯示爆炸效果的類:

package sc.wh.game;

import java.awt.Graphics;
import java.awt.Image;

public class Explode {
	// 記錄爆炸位置
    double x,y;
    // 創建爆炸陣列,static保證圖片只加載一次
    static Image[] imgs = new Image[16];
    // 靜態初始化塊,初始化類的時候會自動呼叫
    static {
        for(int i=0;i<16;i++){
        	// 挨個將爆炸圖片物件獲取到,并加入陣列
            imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");
            imgs[i].getWidth(null);
        }
    }
    // 用來記錄當前加載的圖片
    int count;
    // 畫爆炸效果
    public void draw(Graphics g){
        if(count<=15){
        	// 輪播逐個畫爆炸的圖片
            g.drawImage(imgs[count], (int)x, (int)y, null);
            count++;
        }
    }
    
    // 構造方法設定爆炸位置
    public Explode(double x,double y){
        this.x = x;
        this.y = y;
    }
}

游戲效果圖

在這里插入圖片描述
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/75242.html

標籤:其他

上一篇:Unity一鍵生成MVC框架

下一篇:LintCode 394. 硬幣排成線 JavaScript演算法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more