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方 ...
随机推荐
- 大型EMR电子病历源码三甲医院医疗信息管理系统软件网络版
详情请点击查看 开发环境 :VS2010 + C# + ORACLE系统简介:1各种记录的书写,并可保留修改痕迹 在各种记录的书写过程中,根据系统提供的首次护理记录.一般护理记录.术前术后护理记录等模 ...
- Yii2基本概念之——生命周期(LifeCycle)
人有生老病死,一年有春夏秋冬四季演替,封建王朝有兴盛.停滞.衰亡的周期律--"其兴也勃焉,其亡也忽焉".换句话说,人,季节,王朝等等这些世间万物都有自己的生命周期.同样地,在软件行 ...
- 「SQL归纳」树形结构表的存储与查询功能的实现——通过路径方法(非递归)
一.树形结构例子分析: 以360问答页面为例:http://wenda.so.com/c/ 我们通过观察URL,可以明确该页面的数据以树形结构存储,下面三块模块分别为: ①根节点 ②根节点的第一层子节 ...
- CSS弹性盒子的基本用法
.container { width: 302px; height: 302px; border: 1px solid; display: flex } .item { width: 100px; h ...
- 微信小程序的初窥实践
最近,小程序正式上线,各企业都纷纷开发,本博主看下其中奥秘, 首先得去微信公众平台(https://mp.weixin.qq.com/)注册一个小程序账号(以前注册过公众号的账号不可使用) 备注:注册 ...
- mysql的内建日期处理函数
下面的表格列出了MySQL 中最重要的内建日期函数: 函数 描述 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期 ...
- 远程文件同步详解(Remote File Sync)
1. 远程文件同步的常见方式: 1.cron + rsync 优点: 简单 缺点:定时执行,实时性比较差:另外,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输.如果文件数量达到了百万甚 ...
- Python Web(Django)与SQL SERVER的连接处理
(开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...
- VMWare Workstation虚拟机 安装Centos7 图文指南
本篇博文将讲述如何一步一步在VMWare Workstation 中安装Centos 7 1. 准备工作 VMWare Workstation Centos7 镜像 VMWare Workstatio ...
- Spider与OpenPyXL的结合
OpenPyXL的API文档 1.OpenPyXL基础操作 引入Workbook这个类,然后调用 from openpyxl import Workbook wb = Workbook() 通过ope ...