java遊戲開發雜談 - 實現遊戲主菜單

常常玩遊戲的同窗,你們都知道,遊戲都會有個主菜單,裏面有多個菜單選項:開始遊戲、遊戲設置、關於遊戲、退出遊戲等等,這個菜單是怎麼實現的呢。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遊戲開發雜談,能寫多少算多少,寫到哪裏算哪裏。若是能討幾個拍磚的磚頭,我就更開心了。

相關文章
相關標籤/搜索