常常玩游戏的同窗,你们都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏、游戏设置、关于游戏、退出游戏等等,这个菜单是怎么实现的呢。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游戏开发杂谈,能写多少算多少,写到哪里算哪里。若是能讨几个拍砖的砖头,我就更开心了。