java游戏开发杂谈 - 事件处理

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

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

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

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

先看下完成后的界面图:

java游戏开发杂谈 - 事件处理

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

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

java游戏开发杂谈 - 事件处理