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

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

java游戏开发杂谈 - 事件处理的更多相关文章

  1. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  2. java游戏开发杂谈 - 游戏物体

    现实生活中,有很多物体,每个物体的长相.行为都不同. 物体存在于不同的空间内,它只在这个空间内发生作用. 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理. 需要它的时候,就把它造出来,不需 ...

  3. java游戏开发杂谈 - 有限状态机

    在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...

  4. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  5. java游戏开发杂谈 - 画布和画笔

    在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...

  6. java游戏开发杂谈 - 创建一个窗体

    package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...

  7. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  8. java游戏开发杂谈 - java是什么

    java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了)      j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...

  9. java游戏开发杂谈 - 界面刷新、坐标系

    之前几篇博客里的例子,大家运行过的话,就能看出来,界面是需要刷新的. JPanel里的绘制方法是paintComponent,界面上的东西都是这个方法画出来的. JPanel对象有一个repaint方 ...

随机推荐

  1. JAVA库函数总结【持续更新】

    生成随机数: Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. Random rand = newRandom(); rand.nextInt( ...

  2. 凸包问题——Graham Scan

    Graham Scan 概述: 对于凸多边形的定义不在这里做详细叙述,这里给出算法的实现原理. Step 1: 找出x值最小的点的集合,从其中找出y值最小的点作为初始点 Step 2: 获得新序列后, ...

  3. Python 基础【二】 下

    str()的方法 字符串练习 1.str.capitalize str.capitalize #返回首字母大写,其他字母小写的字符串 >>> a = 'gwdsr' >> ...

  4. Tomcat和JavaWeb目录和流程

    Tomcat主要目录结构 bin 二进制可执行文件,包含启动和关闭tomcat文件  conf 配置文件,其中包含了server.xml.context.xml.web.xml等  webapps 存 ...

  5. java算法之超级丑数

    问题描述: 写一个程序来找第 n 个超级丑数. 超级丑数的定义是正整数并且所有的质数因子都在所给定的一个大小为 k 的质数集合内. 比如给你 4 个质数的集合 [2, 7, 13, 19], 那么 [ ...

  6. Collection、List、Set集合概括

    1.Collection是一个接口,定义了集合相关的操作方法,其有两个子接口List和Set. 2.List和Set的区别    List是有序的可重复集合,Set是无序的不可重复集合. 3.集合持有 ...

  7. error: src refspec XXX matches more than one

    error: dst refspec v1. matches more than one. error: failed to push some refs to '' 错误原因是 branch名和ta ...

  8. repr调试python程序

    一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断.例如: a = 5 b = ' print(a) print(b) 结果为: 5 ...

  9. 跨域问题实践总结!下( [HTML5] postMessage+服务器端(反向代理服务器+CORS Cross-Origin Resource Sharing))

    4. [HTML5] postMessage 问题: 对于跨域问题,研究了一下html5的postMessage,写了代码测试了一下,感觉html5新功能就是好用啊.此文仅使用html5的新特性pos ...

  10. 你不知道的JavaScript--Item9 call(),apply(),bind()与回调

    1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定 ...