java實戰之飛機大戰小遊戲(源碼加註釋)
一.工程文件
二.Main.java
主函數,實現類
package ui; //主函數實現 public class Main { public static void main(String[] args) { //創建窗體 GameFrame frame = new GameFrame(); //創建面板 GamePanel panel = new GamePanel(frame); //調用開始遊戲的方法啟動遊戲 panel.action(); //將面板加入到窗體中 frame.add(panel); //設置窗體可見 frame.setVisible(true); } }
三.GameFrame.java
窗體類,繪制窗體
package ui; import javax.swing.*; //創建窗體 public class GameFrame extends JFrame { //構造方法,初始化窗體屬性 public GameFrame(){ //設置標題,來源於JFrame setTitle("飛機大戰"); //設置大小 setSize(512,768); //設置居中 setLocationRelativeTo(null); //設置窗體可見 //setVisible(true); //不允許玩傢修改界面大小 //setResizable(false); //設置默認的關閉選項 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
四.GamePanel.java
畫佈類,用於勾勒元素
package ui; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Random; //自定義遊戲面板 public class GamePanel extends JPanel { //定義背景圖 BufferedImage bg; BufferedImage heroImg; BufferedImage epImg; Hero hero = new Hero(); //敵機集合 List<Ep> eps = new ArrayList<Ep>(); //彈藥庫 List<Fire> fs = new ArrayList<Fire>(); //定義分數 int score; //設置遊戲開關 Boolean gameover=false; //設置火力 int power = 1; //Ep ep = new Ep(); public void action(){ //創建線程 new Thread(){ public void run(){ while (true){ if(!gameover){ epEnter(); //調用敵機移動方法 epMove(); //發射子彈 shoot(); //子彈移動 fireMove(); //判斷子彈是否擊中敵機 shootEp(); //檢測敵機是否撞到主機 hit(); } //每執行一次,線程休眠一會兒 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //重繪界面 repaint(); } } }.start(); } //每執行n次,釋放一個敵機 int index = 0; protected void epEnter(){ index++; //創建敵機 if(index>=20){ Ep e = new Ep(); //加入集合 eps.add(e); index = 0; } } int findex = 0; protected void shoot(){ findex++; if(findex>=20){ if(power==1){ //創建子彈 Fire fire1 = new Fire(hero.x+45,hero.y,1); //將子彈存入彈藥庫中 fs.add(fire1); } else if(power==2){ //創建子彈 Fire fire1 = new Fire(hero.x+15,hero.y,0); //將子彈存入彈藥庫中 fs.add(fire1); //創建子彈 Fire fire2 = new Fire(hero.x+75,hero.y,2); //將子彈存入彈藥庫中 fs.add(fire2); } else{ //創建子彈 Fire fire1 = new Fire(hero.x+15,hero.y,0); //將子彈存入彈藥庫中 fs.add(fire1); //創建子彈 Fire fire2 = new Fire(hero.x+75,hero.y,2); //將子彈存入彈藥庫中 fs.add(fire2); //創建子彈 Fire fire3 = new Fire(hero.x+45,hero.y-10,1); //將子彈存入彈藥庫中 fs.add(fire3); } //使計數器歸0 findex = 0; } } //讓敵機移動 protected void epMove(){ for (int i = 0; i < eps.size(); i++) { Ep e = eps.get(i); e.move(); } } //讓子彈移動 protected void fireMove(){ for (int i = 0; i < fs.size(); i++) { Fire f = fs.get(i); f.move(); } } //判斷子彈是否擊中敵機 protected void shootEp(){ //遍歷所有子彈 for (int i = 0; i < fs.size(); i++) { //獲取每一顆子彈 Fire f = fs.get(i); //判斷一顆子彈是否擊中敵機 bang(f); } } //判斷一顆子彈是否擊中敵機 protected void bang(Fire f){ for (int i = 0; i < eps.size(); i++) { //取出每一張敵機 Ep e = eps.get(i); //判斷這個子彈是否擊中敵機 if(e.shootBy(f)&&e.type!=15){ //判斷敵機是否擊中道具機 if(e.type==12){ //火力增加 power++; //如果火力值大於三,增加血量 if(power>3){ //恢復血量 if(hero.hp<3){ hero.hp++; } power = 3; } } //如果敵機被子彈擊中 //敵機消失 eps.remove(e); //刪除子彈 fs.remove(f); //增加分數 score += 10; } } } //檢測敵機是否撞到主機 protected void hit() { for (int i = 0; i < eps.size(); i++) { //獲取每一個敵機 Ep e = eps.get(i); if(e.shootBy(hero)){ //刪除敵機 eps.remove(e); //主機血量減少 hero.hp--; //火力恢復初始值 power = 1; //分數增加 score += 10; //當主機血量減少到0時遊戲結束 if(hero.hp==0){ gameover = true; } } } } //構造函數 public GamePanel(GameFrame frame){ //設置背景 bg = App.getImg("/img/bg2.jpg"); //創建鼠標監聽 //創建鼠標適配器 MouseAdapter adapter = new MouseAdapter() { //點擊鼠標時會執行的代碼 @Override public void mouseClicked(MouseEvent e) { //遊戲結束時候,點擊屏幕時重新開始遊戲 if(gameover){ //重新初始化主機 hero = new Hero(); //重置遊戲開關 gameover = false; //分數清0 score = 0; //清空敵機集合 eps.clear(); //隨機背景圖 Random random = new Random(); int index = random.nextInt(5)+1; bg = App.getImg("/img/bg"+index+".jpg"); //重新繪制 repaint(); } } //確定需要監聽的事件 @Override public void mouseMoved(MouseEvent e) { //讓主機的橫縱坐標等於鼠標的移動坐標 //獲取鼠標的橫縱坐標 int mx = e.getX(); int my = e.getY(); //傳遞坐標 if(!gameover){ hero.moveToMouse(mx-114/2,my-93/2); } repaint(); } }; //將適配器加入到監聽器中 addMouseListener(adapter); addMouseMotionListener(adapter); //使用鍵盤監聽 //創建鍵盤適配器 KeyListener kd = new KeyListener() { @Override public void keyTyped(KeyEvent e) { } //當鍵盤被按下是觸發 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //上鍵 if(keyCode == KeyEvent.VK_UP){ hero.y-=10; } //下鍵 else if(keyCode == KeyEvent.VK_DOWN){ hero.y+=10; } //左鍵 else if(keyCode == KeyEvent.VK_LEFT){ hero.x-=10; } //右鍵 else if(keyCode == KeyEvent.VK_RIGHT){ hero.x+=10; } repaint(); } @Override public void keyReleased(KeyEvent e) { } }; //將適配器加入窗體的監聽器中 frame.addKeyListener(kd); } //畫圖方法 @Override public void paint(Graphics g) { super.paint(g); //畫背景 g.drawImage(bg,0,0,null); //畫敵機 for (int i = 0; i < eps.size(); i++) { Ep ep = eps.get(i); g.drawImage(ep.img,ep.x,ep.y,null); } //畫子彈 for (int i = 0; i < fs.size(); i++) { Fire fire = fs.get(i); g.drawImage(fire.img,fire.x,fire.y,fire.w,fire.h,null); } //畫分數 g.setColor(Color.white); g.setFont(new Font("\u6977\u4F53",Font.BOLD,30)); g.drawString("分數:"+score,10,30); g.drawImage(hero.img,hero.x,hero.y,null); //畫主機血量 for (int i = 0; i < hero.hp; i++) { g.drawImage(hero.img,380+i*35,5,30,30,null); } //畫遊戲結束 if(gameover){ g.setColor(Color.red); g.setFont(new Font("楷體",Font.BOLD,35)); g.drawString("GAMEOVER",170,300); g.setColor(Color.green); g.setFont(new Font("楷體",Font.BOLD,29)); g.drawString("yh提醒你點擊屏幕任意位置重新開始",10,350); } repaint(); } }
五.FlyObject.java
飛行物類,設定飛行物特性
package ui; import java.awt.image.BufferedImage; //具有共同特點,故抽離成父類 public class FlyObject { BufferedImage img; int x; int y; int w; int h; }
六.Hero.java
主機類,設定遊戲時候操控的飛機屬性
package ui; import java.awt.image.BufferedImage; //主機 public class Hero extends FlyObject{ //主機血量 int hp; public Hero(){ img = App.getImg("/img/hero.png"); //確認初始位置 x = 200; y = 500; w = img.getWidth(); h = img.getHeight(); hp = 3; } public void moveToMouse(int mx,int my){ x = mx; y = my; } }
七.Ep.java
敵機類
package ui; import javax.swing.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Random; //敵機類 public class Ep extends FlyObject{ int sp; //設置敵機類型 int type; public Ep(){ Random random = new Random(); int index = random.nextInt(15)+1; type = index; String path = "/img/ep" + (index<10?"0":"")+index+".png"; img = App.getImg(path); //確定敵機圖片 w = img.getWidth(); x = random.nextInt(512-w); y = 0; //設置速度 sp = 17-index; } public void move() { if(type==5){ x -= 5; y += sp; } else if(type==6){ x += 5; y += sp; } else { y+=sp; } } public boolean shootBy(Fire f) { Boolean hit = x <= f.x+f.w &&x>f.x-w&&y<=f.y+f.h&&y>f.y-h; return hit; } public boolean shootBy(Hero f) { Boolean hit = x <= f.x+f.w &&x>f.x-w&&y<=f.y+f.h&&y>f.y-h; return hit; } }
八.Fire.java
子彈類
package ui; public class Fire extends FlyObject{ //子彈當前移動方向,0為左上角飛,1垂直飛,2右上角飛 int dir; //構造方法,初始化子彈 public Fire(int hx,int hy,int dir){ //確定子彈的圖片 img = App.getImg("/img/fire.png"); //確定圖片的大小 w = img.getWidth()/4; h = img.getHeight()/4; //確定子彈的位置 x = hx; y = hy; this.dir=dir; } public void move() { //左上角飛 if(dir==0){ x -= 1; y -= 10; } //垂直上飛 else if(dir == 1){ y -= 10; } //右上角飛 else if(dir == 2){ x += 1; y -= 10; } } }
九.App.java
方法類
package ui; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; //處理圖片的工具類 public class App { //static可以公用所有對象都共用該方法,並且可以不依賴對象實現 public static BufferedImage getImg(String path){ //io流,輸送數據的管道 try { BufferedImage img = ImageIO.read(App.class.getResource(path)); return img; } catch (IOException e) { e.printStackTrace(); } return null; } public static ImageIcon getImg2(String path){ InputStream is; is = App.class.getClassLoader().getResourceAsStream(path); try { return new ImageIcon(ImageIO.read(is)); } catch (IOException e) { e.printStackTrace(); } return null; } }
十.效果演示
到此這篇關於java實戰之飛機大戰小遊戲(源碼加註釋)的文章就介紹到這瞭,更多相關Java飛機大戰小遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!