- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java實(shí)戰之飛機大戰小游戲(源碼加注釋)
主函數,實(shí)現類(lèi)
package ui; //主函數實(shí)現 public class Main { public static void main(String[] args) { //創(chuàng )建窗體 GameFrame frame = new GameFrame(); //創(chuàng )建面板 GamePanel panel = new GamePanel(frame); //調用開(kāi)始游戲的方法啟動(dòng)游戲 panel.action(); //將面板加入到窗體中 frame.add(panel); //設置窗體可見(jiàn) frame.setVisible(true); } }
窗體類(lèi),繪制窗體
package ui; import javax.swing.*; //創(chuàng )建窗體 public class GameFrame extends JFrame { //構造方法,初始化窗體屬性 public GameFrame(){ //設置標題,來(lái)源于JFrame setTitle("飛機大戰"); //設置大小 setSize(512,768); //設置居中 setLocationRelativeTo(null); //設置窗體可見(jiàn) //setVisible(true); //不允許玩家修改界面大小 //setResizable(false); //設置默認的關(guān)閉選項 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
畫(huà)布類(lèi),用于勾勒元素
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; //設置游戲開(kāi)關(guān) Boolean gameover=false; //設置火力 int power = 1; //Ep ep = new Ep(); public void action(){ //創(chuàng )建線(xiàn)程 new Thread(){ public void run(){ while (true){ if(!gameover){ epEnter(); //調用敵機移動(dòng)方法 epMove(); //發(fā)射子彈 shoot(); //子彈移動(dòng) fireMove(); //判斷子彈是否擊中敵機 shootEp(); //檢測敵機是否撞到主機 hit(); } //每執行一次,線(xiàn)程休眠一會(huì )兒 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //重繪界面 repaint(); } } }.start(); } //每執行n次,釋放一個(gè)敵機 int index = 0; protected void epEnter(){ index++; //創(chuàng )建敵機 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){ //創(chuàng )建子彈 Fire fire1 = new Fire(hero.x+45,hero.y,1); //將子彈存入彈藥庫中 fs.add(fire1); } else if(power==2){ //創(chuàng )建子彈 Fire fire1 = new Fire(hero.x+15,hero.y,0); //將子彈存入彈藥庫中 fs.add(fire1); //創(chuàng )建子彈 Fire fire2 = new Fire(hero.x+75,hero.y,2); //將子彈存入彈藥庫中 fs.add(fire2); } else{ //創(chuàng )建子彈 Fire fire1 = new Fire(hero.x+15,hero.y,0); //將子彈存入彈藥庫中 fs.add(fire1); //創(chuàng )建子彈 Fire fire2 = new Fire(hero.x+75,hero.y,2); //將子彈存入彈藥庫中 fs.add(fire2); //創(chuàng )建子彈 Fire fire3 = new Fire(hero.x+45,hero.y-10,1); //將子彈存入彈藥庫中 fs.add(fire3); } //使計數器歸0 findex = 0; } } //讓敵機移動(dòng) protected void epMove(){ for (int i = 0; i < eps.size(); i++) { Ep e = eps.get(i); e.move(); } } //讓子彈移動(dòng) 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); //判斷這個(gè)子彈是否擊中敵機 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++) { //獲取每一個(gè)敵機 Ep e = eps.get(i); if(e.shootBy(hero)){ //刪除敵機 eps.remove(e); //主機血量減少 hero.hp--; //火力恢復初始值 power = 1; //分數增加 score += 10; //當主機血量減少到0時(shí)游戲結束 if(hero.hp==0){ gameover = true; } } } } //構造函數 public GamePanel(GameFrame frame){ //設置背景 bg = App.getImg("/img/bg2.jpg"); //創(chuàng )建鼠標監聽(tīng) //創(chuàng )建鼠標適配器 MouseAdapter adapter = new MouseAdapter() { //點(diǎn)擊鼠標時(shí)會(huì )執行的代碼 @Override public void mouseClicked(MouseEvent e) { //游戲結束時(shí)候,點(diǎn)擊屏幕時(shí)重新開(kāi)始游戲 if(gameover){ //重新初始化主機 hero = new Hero(); //重置游戲開(kāi)關(guān) 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(); } } //確定需要監聽(tīng)的事件 @Override public void mouseMoved(MouseEvent e) { //讓主機的橫縱坐標等于鼠標的移動(dòng)坐標 //獲取鼠標的橫縱坐標 int mx = e.getX(); int my = e.getY(); //傳遞坐標 if(!gameover){ hero.moveToMouse(mx-114/2,my-93/2); } repaint(); } }; //將適配器加入到監聽(tīng)器中 addMouseListener(adapter); addMouseMotionListener(adapter); //使用鍵盤(pán)監聽(tīng) //創(chuàng )建鍵盤(pán)適配器 KeyListener kd = new KeyListener() { @Override public void keyTyped(KeyEvent e) { } //當鍵盤(pán)被按下是觸發(fā) @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) { } }; //將適配器加入窗體的監聽(tīng)器中 frame.addKeyListener(kd); } //畫(huà)圖方法 @Override public void paint(Graphics g) { super.paint(g); //畫(huà)背景 g.drawImage(bg,0,0,null); //畫(huà)敵機 for (int i = 0; i < eps.size(); i++) { Ep ep = eps.get(i); g.drawImage(ep.img,ep.x,ep.y,null); } //畫(huà)子彈 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); } //畫(huà)分數 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); //畫(huà)主機血量 for (int i = 0; i < hero.hp; i++) { g.drawImage(hero.img,380+i*35,5,30,30,null); } //畫(huà)游戲結束 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提醒你點(diǎn)擊屏幕任意位置重新開(kāi)始",10,350); } repaint(); } }
飛行物類(lèi),設定飛行物特性
package ui; import java.awt.image.BufferedImage; //具有共同特點(diǎn),故抽離成父類(lèi) public class FlyObject { BufferedImage img; int x; int y; int w; int h; }
主機類(lèi),設定游戲時(shí)候操控的飛機屬性
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; } }
敵機類(lèi)
package ui; import javax.swing.*; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import java.util.Random; //敵機類(lèi) public class Ep extends FlyObject{ int sp; //設置敵機類(lèi)型 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; } }
子彈類(lèi)
package ui; public class Fire extends FlyObject{ //子彈當前移動(dòng)方向,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; } } }
方法類(lèi)
package ui; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; //處理圖片的工具類(lèi) public class App { //static可以公用所有對象都共用該方法,并且可以不依賴(lài)對象實(shí)現 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; } }
到此這篇關(guān)于java實(shí)戰之飛機大戰小游戲(源碼加注釋)的文章就介紹到這了,更多相關(guān)Java飛機大戰小游戲內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站