经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏、游戏设置、关于游戏、退出游戏等等,这个菜单是怎么实现的呢。

有一定桌面软件开发基础的同学可能会想到,用JButton组件就可以实现,每个选项就是一个按钮嘛。 嗯,这样做是可以的。但是,系统自带的JButton按钮,样式是已经定义好的,虽然可以设置它的颜色、背景等属性,但终归是受限制的。

我们既然是学习游戏开发,那么时刻要记住台哥在之前的一个章节里所讲的,游戏里所有的东西都是计算机画出来的,程序员的工作就是,控制计算机在什么时间,画什么东西。

那么我们现在,就用这种思路,借用画笔API来实现一个游戏主菜单。 相信大家真正领悟了以后,会对GUI有了更深入的了解,你会明白,噢,原来我们用的JButton等组件,其实也就是这么实现的。


下面进入正题,先看一下最终的效果图:

好的,图片就是这么简单了,台哥的美感比较差,所以大家凑合着看吧。

这个要实现的就是:按上下方向键时,焦点是四个菜单上切换,焦点菜单用红色显示。

是不是很简单,自己可以想一下如何实现,然后复制下面的代码,放到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);}}/*** 当键盘上的键被按下,程序会调用这个方法,来处理这个按下事件*/@Overridepublic 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;}}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic 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游戏开发杂谈,能写多少算多少,写到哪里算哪里。如果能讨几个拍砖的砖头,我就更开心了。

java游戏开发杂谈 - 实现游戏主菜单相关推荐

  1. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  2. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  3. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  4. flex 联机游戏开发 - 四国军棋游戏:(三) 核心类设计

    通过前面的练习 flex 联机游戏开发 - 四国军棋游戏:(二)棋盘棋子 我们已经成功地用不到200行的代码绘制出了一个漂亮的棋盘,现在,我们开始进入游戏的核心类设计阶段.四国军棋的游戏逻辑还是比较复 ...

  5. 基于cocos2d-x的快速的游戏开发--回合制游戏

    2019独角兽企业重金招聘Python工程师标准>>> #基于cocos2d-x的快速的游戏开发--回合制游戏 开发时间:3天 开发工具:cocos2d-x和cocostudio 开 ...

  6. Threejs系列--22游戏开发--沙漠赛车游戏【布置游戏开始场景】

    Threejs系列--22游戏开发--沙漠赛车游戏[布置游戏开始场景] 序言 目录结构 代码一览 index.js代码 Objects.js代码 Materials.js代码 materials/Fl ...

  7. 【iphone游戏开发】Iphone游戏开发之五:游戏场景切换,点阵字的实现和Hiero工具的利用

    Andy--清风 原创,转载请注明,谢谢 一.游戏场景切换 在iPhone游戏开发中,游戏之间的场景开发中有很多动画可以实现,具体实现的动画如下: CCTransitionRotoZoom//从大到小 ...

  8. libGDX游戏开发之打包游戏(十二)

    libGDX游戏开发之打包游戏(十二) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goog ...

  9. 游戏开发心得——资料篇——游戏行业的详细职位介绍与定义分析

    游戏开发心得--资料篇--游戏行业的详细职位介绍与分析(不定期更新) FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 本篇主要介绍一下博主所了 ...

最新文章

  1. linux编译动态库未定义,linux 编译动态链接库 so,避免运行时才发现函数未 ......
  2. oracle中 游标实例
  3. Python模块包中__init__.py文件的作用(转载)
  4. 支持回调处理 php函数,PHP支持回调的函数有哪些?
  5. IOT(8)---LoRa vs NB-IoT:12个角度看哪个物联网标准更具优势?
  6. 交流信号叠加直流偏置_示波器助您更好地测量直流电源轫上的纹波噪声
  7. 移动端-项目基础总结------彭记(020)
  8. 耳挂式蓝牙耳机原理_耳挂式蓝牙耳机项目总结分析报告
  9. Playing Atari with Deep Reinforcement Learning 中文 讲解3
  10. 使用AirDrop将文件从iPhone或iPad传送到Mac电脑教程
  11. 随笔20220717
  12. 软件学报zotero文献格式
  13. google谷歌登录sdk失败错误码12500
  14. java微信分享朋友圈_java怎么实现微信分享到朋友圈功能
  15. 2018年高教社杯全国大学生数学建模竞赛D题解题思路
  16. 常见颜色RGB颜色值
  17. 史上最简单:SpringCloud 集成 mybatis-plus(以若依微服务版本为例)
  18. 异常处置规则_如何负责任地处置旧计算机
  19. signature=a6cb6ce8d8e12b283f4fc618f250a727,MS12-041:Windows 内核模式驱动程序中的漏洞可能会允许特权提升:2012 年 6 月 12 日...
  20. 前5名最佳SQL数据库恢复软件

热门文章

  1. Okhttp 接入HttpDNS(支持http/https,)达到IP直连
  2. uva 12325(宝箱, 枚举问题);
  3. C++ 测试CFile读写文本
  4. JXLS生成excel填充图片设置大小
  5. datalist图片九宫显示
  6. SVN 已提交版本回退
  7. 数据类型和存储上的差别,基本数据类型,引用数据类型
  8. react-native 使用高德SDK取得位置信息
  9. Motorola S19(S-record)格式解析
  10. 高通平台Linux kernel死机解题心得-trace32的使用