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

这些逻辑是怎么处理的呢?
大家先不用深究太详细的,只需要知道,当我们按下键盘时,操作系统会接收到指令,然后把指令传递给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游戏开发杂谈,台哥在工作之余抽空写的专栏,希望能给大家一点帮助。



 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信