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

java游戏开发杂谈 - 事件处理的更多相关文章
- java游戏开发杂谈 - 线程
线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...
- java游戏开发杂谈 - 游戏物体
现实生活中,有很多物体,每个物体的长相.行为都不同. 物体存在于不同的空间内,它只在这个空间内发生作用. 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理. 需要它的时候,就把它造出来,不需 ...
- java游戏开发杂谈 - 有限状态机
在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...
- java游戏开发杂谈 - 实现游戏主菜单
经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...
- java游戏开发杂谈 - 画布和画笔
在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...
- java游戏开发杂谈 - 创建一个窗体
package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...
- java游戏开发杂谈 - 游戏编程浅析
每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...
- java游戏开发杂谈 - java是什么
java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了) j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...
- java游戏开发杂谈 - 界面刷新、坐标系
之前几篇博客里的例子,大家运行过的话,就能看出来,界面是需要刷新的. JPanel里的绘制方法是paintComponent,界面上的东西都是这个方法画出来的. JPanel对象有一个repaint方 ...
随机推荐
- ns3构建2 core fat tree出错
我用ns3构建fat tree以下是我的拓扑结构: 在我用ns3构建完这个拓扑结构,并且加上此行代码: 但是运行的时候报错了.报的错误是: 解决办法是:进入到/src/internet/model/g ...
- Vue.js实现下拉无限刷新分页
<!doctype html> <html class="no-js"> <head> <meta charset="utf-8 ...
- 阿里Java架构师谈谈架构和如何成为一个Java架构师
架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...
- 微信小程序开发问题汇总
前言 经过将近一个多月的开发,我们团队开发的微信小程序 "出发吧一起" 终于开发完成,现在的线上版本为 2.2.4-beta 版 本文档主要介绍该小程序在开发中所用到的技术,已经在 ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- 用Promise实现:带延时功能的链式调用
// 1) 调用方式 new People('whr').sleep(3).eat('apple').sleep(5).eat('durian'); // 2) 打印结果 'hello, whr' - ...
- SSM-SpringMVC-04:SpringMVC深入浅出理解HandleMapping(源码刨析)
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先从概念理解,从中央调度器,携带参数request,调度到HandleMapping处理器映射器,处理器映射器 ...
- JavaScript-//FOR/IN循环。当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处。
<script> //FOR/IN循环.当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处. function getvalue(portfolio){ var ...
- Spring Cloud authentication with JWT service
@RequestMapping(value = "/authenticate", method = RequestMethod.POST) public ResponseEntit ...
- Servlet到底是单例还是多例你了解吗?
为一个Java Web开发者,你一定了解和学习过Servlet.或许还曾在面试中被问到过Servelt是单例还是多例这个问题. 遇到这个问题,你是否曾深入了解过,还是百度或者Google了一下,得到答 ...