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

    大家都知道,游戏需要跟玩家交互,需要接收玩家的鼠标、键盘发出的命令,比如在地图上点击一下,人物就自动寻路走过去;键盘上按下某个键,就弹出一个背包界面。

    这些逻辑是怎么处理的呢? 大家先不用深究太详细的,只需要知道,当我们按下键盘时,操作系统会接收到指令,然后把指令传递给java虚拟机,java虚拟机再把指令转发给当前的游戏程序。

    java定义了一些类来封装事件,比如KeyEvent对应按键事件,按下键盘,就会产生一个KeyEvent对象; 还有另外的一些接口,用来监听处理事件,比如KeyListener用来监听按键事件,并进行处理。

    接下来我们实现一个例子,是在界面上画一个方块,当按下不同方向键时,方块往不同的方向移动。同时,限制方块不能超出活动区域。

    先看下完成后的界面图:

    下面贴出这个例子的所有代码:

    package game3;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    import javax.swing.JPanel;
    /**
     * java游戏开发杂谈
     * ---demo3:事件处理
     * 
     * @author 台哥
     * @date 2019-04-09
     */
    
    public class GamePanel extends JPanel implements KeyListener{
    	/** 屏幕的宽和高 */
    	private int width,height;
    	
    	/**小方块的初始位置*/
    	private int x = 240, y = 160;
    	
    	public GamePanel(int width, int height) {
    		this.width = width;
    		this.height = height;
    		this.setSize(width, height);
    		
    		//设置当前画布可以获得焦点。
    		this.setFocusable(true);
    		//设置自己为自己的按键事件监听器
    		this.addKeyListener(this);
    	}
    
    
    	/**
    	 * 覆盖paintComponent()方法
    	 * 参数中的Graphics是画笔,使用它可以绘制出字符串、直线、矩形、圆、图片等等。
    	 */
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		
    		//画绿色背景
    		g.setColor(new Color(0x839156));
    		g.fillRect(0, 0, width, height);
    		
    		//画绿色背景
    		g.setColor(new Color(0x839156));
    		g.fillRect(0, 0, width, height);
    		
    		g.setColor(Color.black);
    		//画一个矩形活动区域
    		g.drawRect(160, 80, 200, 200);
    		//画一个小方块
    		g.fillRect(x, y, 40, 40);
    	}
    	
    	
    	/**
    	 * 当键盘上的键被按下,程序会调用这个方法,来处理这个按下事件
    	 * 
    	 * 通过键盘上的四个方向键来控制小方块的移动
    	 */
    	@Override
    	public void keyPressed(KeyEvent e) {
    		int keyCode = e.getKeyCode();  //根据keyCode能知道按下的是哪个键
    		switch(keyCode)
    		{
    		case KeyEvent.VK_LEFT:
    			if(x > 160){  //控制使得方块不能超出活动区域外
    				x = x - 1;
    			}
    			this.repaint(); //刷新一下画布,就能看到小方块位置发生了变化。
    			break;
    		case KeyEvent.VK_RIGHT:
    			if(x < 320){    //矩形活动区域最左边的横坐标为160,宽为200,所以矩形的最右边的坐标为360. 小方块宽度为40. 360 - 40 = 320.
    				x = x + 1;
    			}
    			this.repaint();
    			break;
    		case KeyEvent.VK_UP:
    			if(y > 80){
    				y = y - 1;
    			}
    			this.repaint(); 
    			break;
    		case KeyEvent.VK_DOWN:
    			if(y < 240){
    				y = y + 1;
    			}
    			this.repaint();
    			break;
    		}
    	}
    
    	@Override
    	public void keyReleased(KeyEvent e) {
    	}
    
    	@Override
    	public void keyTyped(KeyEvent e) {
    	}
    	
    	
    	
    }
    
    package game3;
    
    import javax.swing.JFrame;
    /**
     * java游戏开发杂谈
     * ---demo3:事件处理
     * 
     * @author 台哥
     * @date 2019-04-09
     */
    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游戏开发杂谈,台哥在工作之余抽空写的专栏,希望能给大家一点帮助。

  • 相关阅读:
    解题报告 百进制数
    解题报告 Loongint 的夜晚
    解题报告 树形图计数
    解题报告 一元三次方程求解
    解题报告 Loongint 的旅行安排
    解题报告 数字查找
    用C++编写简单绘图语言的词法分析器——程序清单
    C++ 连接 mysql 的一个例子(Visual Studio 2005)
    fedora 8 下JDK 6.0 配置
    IBM DB2 V9 常用命令
  • 原文地址:https://www.cnblogs.com/chaohi/p/10697986.html
Copyright © 2011-2022 走看看