常常玩遊戲的同窗,你們都知道,遊戲都會有個主菜單,裏面有多個菜單選項:開始遊戲、遊戲設置、關於遊戲、退出遊戲等等,這個菜單是怎麼實現的呢。java
有必定桌面軟件開發基礎的同窗可能會想到,用JButton組件就能夠實現,每一個選項就是一個按鈕嘛。 嗯,這樣作是能夠的。可是,系統自帶的JButton按鈕,樣式是已經定義好的,雖然能夠設置它的顏色、背景等屬性,但終歸是受限制的。程序員
咱們既然是學習遊戲開發,那麼時刻要記住臺哥在以前的一個章節裏所講的,遊戲裏全部的東西都是計算機畫出來的,程序員的工做就是,控制計算機在什麼時間,畫什麼東西。web
那麼咱們如今,就用這種思路,借用畫筆API來實現一個遊戲主菜單。 相信你們真正領悟了之後,會對GUI有了更深刻的瞭解,你會明白,噢,原來咱們用的JButton等組件,其實也就是這麼實現的。算法
下面進入正題,先看一下最終的效果圖:sql
好的,圖片就是這麼簡單了,臺哥的美感比較差,因此你們湊合着看吧。數據庫
這個要實現的就是:按上下方向鍵時,焦點是四個菜單上切換,焦點菜單用紅色顯示。編程
是否是很簡單,本身能夠想一下如何實現,而後複製下面的代碼,放到Eclipse裏執行。設計模式
package game4; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JPanel; /** * java遊戲開發雜談 * ---demo4:實現一個簡單的遊戲菜單 * * @author 臺哥編程課堂 * https://blog.csdn.net/chaohi * * @date 2019-04-12 */ public class GamePanel extends JPanel implements KeyListener{ /** 屏幕的寬和高 */ private int width,height; public GamePanel(int width, int height) { this.width = width; this.height = height; this.setSize(width, height); //設置當前畫布能夠得到焦點。 this.setFocusable(true); //設置本身爲本身的按鍵事件監聽器 this.addKeyListener(this); } /**要顯示的菜單項*/ private String[] menus = new String[]{"開始遊戲", "遊戲設置", "幫助關於", "退出遊戲"}; /**當前焦點在哪一個菜單項*/ private int focusIndex; /**菜單項位置的橫座標*/ private int menu_x = 260; /**菜單項位置的縱座標*/ private int[] menu_ys = new int[]{80, 110, 140, 170}; /** * 覆蓋paintComponent()方法 */ public void paintComponent(Graphics g) { super.paintComponent(g); //畫綠色背景 g.setColor(new Color(0x9391d6)); g.fillRect(0, 0, width, height); //繪製菜單項。焦點所在的菜單用紅色,其它爲黑色。 for (int i = 0; i < menus.length; i++) { int x = menu_x; int y = menu_ys[i]; //若是是焦點按鈕,用紅色突出 if(i == focusIndex){ g.setColor(Color.red); }else{ g.setColor(Color.black); } g.drawString(menus[i], x, y); } } /** * 當鍵盤上的鍵被按下,程序會調用這個方法,來處理這個按下事件 */ @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //根據keyCode能知道按下的是哪一個鍵 switch(keyCode) { case KeyEvent.VK_UP://往上的方向鍵 focusIndex = (focusIndex + menus.length - 1) % menus.length; //考慮%取餘的意義。 this.repaint(); //刷新畫布 break; case KeyEvent.VK_DOWN://往下的方向鍵 focusIndex = (focusIndex + 1) % menus.length; this.repaint(); break; case KeyEvent.VK_ENTER: //若是是Enter鍵 //----------------這裏就能夠根據focusIndex知道按下的是哪一個菜單項,從而進行對應操做 //----------------好比若是focusIndex爲0,則轉到遊戲界面。若是focusIndex爲2,則轉到幫助關於的界面。 System.out.println(focusIndex + " , " + menus[focusIndex]); break; } } @Override public void keyReleased(KeyEvent e) { } @Override public void keyTyped(KeyEvent e) { } }
package game4; import javax.swing.JFrame; /** * java遊戲開發雜談 * ---demo4:實現一個簡單的遊戲菜單 * * @author 臺哥編程課堂 * https://blog.csdn.net/chaohi * * @date 2019-04-12 */ public class GameFrame extends JFrame{ private int width = 600, height = 400; public GameFrame() { //設置窗體標題 this.setTitle("java遊戲開發雜談-臺哥出品"); //建立一個畫布 GamePanel panel = new GamePanel(width, height); //把畫布加入到窗體中 getContentPane().add(panel, "Center"); //設置窗體大小 this.setSize(width, height); //設置可否調整窗體大小 this.setResizable(false); //這句會使得在屏幕上居中顯示 this.setLocationRelativeTo(null); //當關閉窗體的時候退出程序 this.setDefaultCloseOperation(EXIT_ON_CLOSE); //把窗體顯示出來 this.setVisible(true); } /** * 主方法 */ public static void main(String[] args) { GameFrame frame = new GameFrame(); } }
這是本系列的第七篇文章了,不知道有沒有同窗在跟着學呢。。數據結構
這裏要特別聲明的一點是:學習java遊戲開發,可能沒有徹底對口的工做,因此若是你正準備找工做,那最好去學習JSP、Sevlet、Mysql等知識吧,對應聘web開發的工做更有直接好處。(我怕被罵誤人子弟哇。。)框架
那麼學習java遊戲開發,有什麼好處呢。我是這麼看,第一是這個很好玩,能充分體驗編程的樂趣。第二是遊戲開發更有挑戰性,對面向對象思想、數據結構、算法、設計模式等都有更高的要求,學習遊戲編程,對這些知識能有更好的理解。
臺哥十幾年工做中,常常看到一些程序員,工做多年了,仍是隻會數據庫的增刪改查,只會套用各種框架,對面向對象沒有深刻的理解和思考,究其緣由,就是由於作的項目,核心需求太單一,軟件複雜度太簡單了。
遊戲,是學習編程最好的練手項目。走在路上、坐在車上,跑在操場,忽然想到一個遊戲玩法,回到宿舍就能實現出來,而後屁顛屁顛的送給女友玩,程序員的樂趣,不過如此吧。
臺哥,一個混跡多年的老油條,猛然一天翻資料,發現本身之前寫的代碼,噢,纔想起來我之前也是程序員嘛。這幾年遊走酒場飯局,編程知識都快忘光啦。趕忙翻出個人CSDN,匆匆寫下java遊戲開發雜談,能寫多少算多少,寫到哪裏算哪裏。若是能討幾個拍磚的磚頭,我就更開心了。