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游戏开发杂谈,台哥在工作之余抽空写的专栏,希望能给大家一点帮助。

 

没有更多推荐了,返回首页