zoukankan      html  css  js  c++  java
  • java游戏开发杂谈

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

    有一定桌面软件开发基础的同学可能会想到,用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);
    		}
    	}
    
    
    	
    	/**
    	 * 当键盘上的键被按下,程序会调用这个方法,来处理这个按下事件
    	 */
    	@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游戏开发杂谈,能写多少算多少,写到哪里算哪里。如果能讨几个拍砖的砖头,我就更开心了。

  • 相关阅读:
    ROS安装过程与常遇问题
    Linux中Vim工具的使用
    秋招总结
    SpringBoot项目打包war包步骤
    hiredis windows静态库编译
    Access去除字段值后面空格
    AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
    AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
    AspNetCore容器化(Docker)部署(二) —— 多容器通信
    AspNetCore容器化(Docker)部署(一) —— 入门
  • 原文地址:https://www.cnblogs.com/chaohi/p/10697985.html
Copyright © 2011-2022 走看看