原始碼
> [飛機大戰游戲原始碼及圖片檔案(有超詳細的注釋呦)]
https://www.aliyundrive.com/s/Qob1UhDgCLo
點擊鏈接保存,或者復制本段內容,打開「阿里云盤」APP ,無需下載極速在線查看,視頻原畫倍速播放,
游戲介紹

游戲操作比較簡單,運行代碼后,點擊“開始游戲”既可以進入游戲,通過滑鼠移動實作我方飛機的移動,我方飛機自動發射子彈,敵方飛機在十二個軌道隨機生成,如果我方飛機與之碰撞,則游戲結束;如果我方飛機發射的子彈與敵方飛機相撞,則積分加一,敵方飛機消失,當敵方飛機出現相對應的數量之后,敵方BOSS出現,敵方BOSS可以發射子彈,并在游戲界面最上端來回移動,當我方飛機發射的子彈射中敵方飛機時,敵方BOSS生命值減少,直至生命值為零,則我方勝利!!!
結構介紹
包和類的關系見下圖

主要代碼實作
- 飛機的主視窗類(原始碼上方鏈接自取)
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import com.sxt.util.GameUtil;
import obj.BgObj;
import obj.BossObj;
import obj.BulletObj;
import obj.EnemyObj;
import obj.ExplodeObj;
import obj.PlaneObj;
import obj.ShellObj;
public class GameWin extends JFrame {
// 創建背景圖的物件,用物件繪制自身
BgObj bgObj = new BgObj(GameUtil.bgImg, 0, 0, 2, this);
// 創建我方飛機的物件
public PlaneObj planeObj = new PlaneObj(GameUtil.PlaneImg, 22, 33, 290, 550, 0, this);
// 我方子彈的集合
public static List<ShellObj> shellObjList = new ArrayList<ShellObj>();
// 我方子彈的集合
public static List<BulletObj> bulletObjList = new ArrayList<BulletObj>();
// 敵方飛機的集合
public static List<EnemyObj> enemyObjsList = new ArrayList<EnemyObj>();
EnemyObj enemyObj = new EnemyObj(GameUtil.enemyImg, 49, 39, 0, 0, 5, this);
// 爆炸圖物體類集合
public static List<ExplodeObj> explodeObjList = new ArrayList<ExplodeObj>();
// 敵方Boss的物件
public BossObj bossObj =null;
// public BossObj bossObj = new BossObj(GameUtil.bossImg, 56, 100, 220, 50, 5, this);
// 隨機種子
Random random = new Random();
// 計數器
int paintCount = 1;
// 敵方出現飛機數
int enemyCount = 0;
// 積分計數器
public int sorce = 0;
// 定義臨時圖片,防止畫面閃爍
Image tempImg = null;
public void initWin() {
// 設定寬高
this.setSize(600, 600);
this.setSize(600, 600);
// 設定標題
this.setTitle("飛機大戰 ");
// 設定視窗居中
this.setLocationRelativeTo(null);
// 點擊關閉按鈕關閉程式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 設定視窗是否可見
this.setVisible(true);
// 點擊滑鼠按鈕開始游戲
this.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == 1&&GameUtil.state==0) {
System.out.println("游戲開始了");
// 改變游戲狀態
GameUtil.state = 1;
repaint();
}
}
});
// 添加鍵盤事件
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
// 如果空格鍵被點擊
if (e.getKeyCode() == 32) {
switch (GameUtil.state) {
case 1:
// 游戲中,點擊空格暫停
GameUtil.state = 2;
// repaint();
break;
case 2:
// 暫停中,點擊空格開始
GameUtil.state = 1;
break;
default:
break;
}
}
}
});
// 不斷呼叫paint方法,讓畫面實作影片效果,讓paint方法每隔1秒鐘呼叫一次
while (true) {
if (GameUtil.state == 1) {
repaint();
createObj();
}
try {
Thread.sleep(40);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
// 繪制視窗內容 Graphics是畫筆
@Override
public void paint(Graphics g) {
if (tempImg == null) {
// 防止重復 初始化圖片
tempImg = this.createImage(600, 600);
}
// 新圖片的畫筆
Graphics gImage = tempImg.getGraphics();
gImage.fillRect(0, 0, 600, 600);
// 繪制背景圖
bgObj.paintSelf(gImage);
// 游戲未開始
if (GameUtil.state == 0) {
// 繪制字串
GameUtil.drawStr(Color.green, 50, "點擊開始游戲", 140, 300, gImage);
// 游戲開始時,先參考一下爆炸圖
gImage.drawImage(GameUtil.explodeImg, planeObj.getX()+9999, planeObj.getY(), this);
}
// 游戲進行中
if (GameUtil.state == 1) {
// 繪制我方飛機
planeObj.paintSelf(gImage);
// 繪制我方子彈
for (int i = 0; i < shellObjList.size(); i++) {
shellObjList.get(i).paintSelf(gImage);
}
// 繪制敵方飛機
for (int i = 0; i < enemyObjsList.size(); i++) {
enemyObjsList.get(i).paintSelf(gImage);
}
// 繪制敵方子彈
for (int i = 0; i < bulletObjList.size(); i++) {
bulletObjList.get(i).paintSelf(gImage);
}
// 繪制爆炸效果圖
for (int i = 0; i < explodeObjList.size(); i++) {
explodeObjList.get(i).paintSelf(gImage);
}
// 繪制Boss
if(bossObj!=null) {
bossObj.paintSelf(gImage);
}
// 移除多余的爆炸圖物件
if (explodeObjList.size() >= 15) {
for (int i = 0; i < 10; i++) {
explodeObjList.remove(0);
}
}
}
// 游戲暫停
if(GameUtil.state==2) {
GameUtil.drawStr(Color.BLUE, 50, "點擊空格繼續", 180, 300, gImage);
}
if (GameUtil.state == 3) {
// 游戲結束了
gImage.drawImage(GameUtil.explodeImg, planeObj.getX() - 10, planeObj.getY() - 30, this);
GameUtil.drawStr(Color.RED, 50, "GAME OVER", 180, 300, gImage);
}
if (GameUtil.state == 4) {
gImage.drawImage(GameUtil.explodeImg, bossObj.getX() + 40, bossObj.getY() + 20, this);
GameUtil.drawStr(Color.GREEN, 50, "游戲通關", 200, 300, gImage);
}
// 積分面板
GameUtil.drawStr(Color.YELLOW, 20, sorce + "分", 10, 60, gImage);
// 將臨時圖片繪制到視窗
g.drawImage(tempImg, 0, 0, null);
// System.out.println("集合長度"+shellObjList.size()) ;
paintCount++;
}
// 制造游戲物體的方法
public void createObj() {
if (paintCount % 3== 0) {
// 每呼叫15次paint方法執行下面代碼一次
ShellObj shellObj = new ShellObj(GameUtil.shellImg, 14, 29, planeObj.getX() + 4, planeObj.getY() - 30, 5,
this);
shellObjList.add(shellObj);
}
if (paintCount % 5== 0) {
// 每呼叫15次paint方法執行下面代碼一次
EnemyObj enemyObj = new EnemyObj(GameUtil.enemyImg, 49, 39, random.nextInt(12) * 50, 0, 5, this);
enemyObjsList.add(enemyObj);
enemyCount++;
}
if(enemyCount>50) {
if(bossObj==null) {
bossObj = new BossObj(GameUtil.bossImg, 56, 100, 220, 50, 5, this);
}
if (paintCount % 10 == 0) {
// 每呼叫15次paint方法執行下面代碼一次
bulletObjList.add(new BulletObj(GameUtil.bulletImg, 14, 25, bossObj.getX() + 78,
bossObj.getY() + bossObj.getHeight(), 5, this));
}
}
}
public static void main(String[] args) {
GameWin gameWin = new GameWin();
gameWin.initWin();
}
//@Override
//public void paint(Graphics g) {
// bgObj.paintSelf(g);
// if(GameUtil.state==0) {
// GameUtil.drawStr(Color.GREEN, 50, "點擊開始游戲", 150, 300, g);
// }
//}
}
2.工具類代碼實作
package com.sxt.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class GameUtil {
//定義游戲的狀態 0——未開始 1——游戲中 2——暫停 3——失敗 4——勝利
public static int state=0;
//定義背景圖片
public static Image bgImg =Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
//定義我方飛機圖片
public static Image PlaneImg =Toolkit.getDefaultToolkit().getImage("imgs/plane.png");
//定義我方子彈圖片
public static Image shellImg=Toolkit.getDefaultToolkit().getImage("imgs/shell.png");
//定義敵方飛機圖片
public static Image enemyImg=Toolkit.getDefaultToolkit().getImage("imgs/enemy.png");
//定義飛機爆炸圖
public static Image explodeImg=Toolkit.getDefaultToolkit().getImage("imgs/explode/e6.gif");
//定義Boss圖片
public static Image bossImg=Toolkit.getDefaultToolkit().getImage("imgs/boss.png");
//定義敵方子彈圖片
public static Image bulletImg=Toolkit.getDefaultToolkit().getImage("imgs/bullet.png");
/**
* 繪制字串的方法
* @param color
* @param size
* @param str
* @param x
* @param y
* @param g
*/
//封裝一個回執字串的方法
public static void drawStr(Color color,int size,String str,int x ,int y,Graphics g) {
g.setColor(color);
g.setFont(new Font("宋體",Font.BOLD,size));
g.drawString(str,x,y);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413625.html
標籤:其他
