0

0

做一名合格的 Processing 键盘侠

絕刀狂花

絕刀狂花

发布时间:2025-06-26 12:58:11

|

723人浏览过

|

来源于php中文网

原创

做一名合格的 Processing 键盘侠

此『键盘侠』非彼『键盘侠』也!

在 Processing 编程中,我们常常会遇到对键盘按键的一些处理。最近在群里,也看到一些朋友询问这方面的问题,本篇小菜介绍下 Processing 中关于键盘事件的常用处理方式。

要做,就做一名合格的『键盘侠』,稳妥处理 Processing 中键盘的按键处理!哈哈~

做一名合格的 Processing 键盘侠
键盘事件

键盘是 Processing 中最常见的数据输入方式(常见的还有鼠标、文件以及其他硬件输入等)。

在 Processing 中,关于键盘处理,需要记住 3 变量 3 函数。

3变量:key、keyCode、keyPressed

3函数:keyPressed()、keyReleased()、keyTyped()

要想应对各种输入情况,我们需要对这 3 变量 3 函数有着充分的认识。

宫本武藏:排好队,一个一个来!

做一名合格的 Processing 键盘侠

img

小菜绘制了一张图,总结了下键盘事件的一些关键知识点。

键盘事件分成了三个事件类型,keyPressed()keyReleased()keyTyped()。分别表示按住键盘键,释放键盘键,以及一次完整的键盘敲击有一个特殊的常量,CODED 值为 65535,是 2 的 16 次方减 1key:键盘敲击过程中的一个变量,使用 ASCII 码值表示,可以与代表 ASCII 码值的字符进行比较,如 key == 'a'。keyCode:key 处理不了的非 ASCII 码字符,使用 keyCode 来处理,但需要使用 key == CODED 来进行判断key

常见的键盘字符如小写的 a-z,大写的 A-Z,以及 0-9 这些,我们可以很方便的使用下面的例子来判断。特别要注意的是 ASCII 码字符表示的时候要用单引号,如 'a' 不是 "a"。

关于 ASCII 码,不太了解的读者朋友们,可以回头查看维基百科ASCII[1]。

关于 ASCII 码,可以百度搜索 "ASCII 对照表"。

做一名合格的 Processing 键盘侠
代码语言:javascript代码运行次数:0运行复制
void keyPressed() {  if (key == 'a') {    println("敲击了a");  } else if (key == 's') {    println("敲击了 s,进行图像保存");    save("myImage.png");  } else if (key == '1') {    println("敲击了1");  }}

还有一些特殊的 key,如

BACKSPACE 退格删除键TABENTER 回车键RETURN 回车键 老的 Mac 系统上可能使用的是 RETURN 回车键表示回车ESC 键盘左上角的 Escape 键DELETE 删除键

都可以直接进行比较:

代码语言:javascript代码运行次数:0运行复制
void keyPressed() {  if (key == BACKSPACE) {    println("敲击了退格删除键");  } else if (key == TAB) {    println("敲击了 TAB 键");  } else if (key == ENTER || key == RETURN) {    println("敲击了回车键");  } else if (key == ESC) {    println("敲击了 ESC 键");  } else if (key == DELETE) {    println("敲击了删除键");  }}
keyCode

key 处理不了的非 ASCII 码字符,使用 keyCode 来处理,但需要使用 key == CODED 来进行判断处理。这个CODED判断还是很重要的,像键盘 a/A ,'a' 的 ASCII 码是 97,'A' 的 ASCII 码是 65,但是这个按键敲击出来的 keyCode 都是 65。所以直接用 keyCode 判断等于某个值,会出现多个字符的可能性。我们通过判断key == CODED来首先判断是不是非 ASCII 码字符,再用keyCode判断就不容易出问题。

代码语言:javascript代码运行次数:0运行复制
void keyPressed() {  if (key == CODED) {    if (keyCode == UP) {      println("click 上");    } else if (keyCode == DOWN) {      println("click 下");    } else if (keyCode == LEFT) {      println("click 左");    } else if (keyCode == RIGHT) {      println("click 右");    } else if (keyCode == CONTROL) {      println("click Ctrl");    } else if (keyCode == ALT) {      println("click ALT");    } else if (keyCode == SHIFT) {      println("click SHIFT");    }  } else {     println("click", key);  }}
keyPressed

key 和 keyCode 是在keyPressed()keyReleased()keyTyped() 三个函数中使用,keyPressed 这个变量可以用在 draw 函数中,根据是否按下了键盘,在每帧绘制中实时地处理一些逻辑。

代码语言:javascript代码运行次数:0运行复制
void draw() {  if (keyPressed == true) {    fill(0);  } else {    fill(255);  }  rect(25, 25, 50, 50);}
keyPressed()

每次按下一个键时都会调用一次 keyPressed() 函数。按下的键存储在 key 变量中。

对于非 ASCII 键,我们需要使用 keyCode 变量。

Shakespeare
Shakespeare

一款人工智能文案软件,能够创建几乎任何类型的文案。

下载

如果我们的程序需要在多平台如 Windows、Unix、Linux、Mac 上运行,还需注意 ENTER 键在 Windows 和 Unix 上常用,而 RETURN 键在 Mac 上使用。小菜测试自己的 Mac 电脑(Monterey 系统)用的其实是 ENTER 键来表示的回车,猜测在之前的系统上可能使用的是 RETURN 键表示。

由于操作系统处理键重复的方式,按住一个键可能会导致多次调用 keyPressed()。重复率由操作系统设置,并且可能在每台计算机上配置不同。关于这点的阐述可以看本文『按键的连续触发问题』

keyReleased()

每次释放键时都会调用一次 keyReleased() 函数。

keyTyped()

每次按下一个键时都会调用一次 keyTyped() 函数,但忽略 Ctrl、Shift 和 Alt 等操作键。和 keyPressed() 一样,该函数也会受到操作系统按键处理重复频率的控制。按住一个键可能会导致多次调用 keyTyped()。重复率由操作系统设置,并且可能在每台计算机上配置不同。

按键的连续触发问题 代码语言:javascript代码运行次数:0运行复制
void keyPressed() {  if (key == '1') {     println("按下1");   }}void keyReleased() {  if (key == '1') {     println("松开1");   }}

大家看下这段代码,如果我们按下1马上松开,就会输出

代码语言:javascript代码运行次数:0运行复制
按下1松开1

但是如果我们按下1不松开呢?正常情况下就会不停的输出

代码语言:javascript代码运行次数:0运行复制
按下1按下1按下1按下1按下1按下1按下1按下1...

由于操作系统处理键重复的方式,按住一个键可能会导致多次调用 keyPressed()。重复率由操作系统设置,并且可能在每台计算机上配置不同。

比如 Mac 电脑上的键盘的按键重复设置,如果关闭了按键重复,那么按住1不放,就只会输出一次。

做一名合格的 Processing 键盘侠

调整按键重复的速度,可以看到控制台打印的 『按下1』的频率也会不同。小菜电脑配置的按键重复是最快,是因为经常有时候删除代码,要按住退格删除键不松开,让光标更快的进行移动删除。

我们的程序依赖电脑的『按键重复』配置是否关闭来控制按住键盘按键只触发一次,显然不太合理。每台电脑的配置可能是不同的,有的开启,有的关闭,且按键重复频率也可能有差异,这样就会导致程序在不同的电脑上表现不太一致。

而程序要做到通用性,该怎么处理呢?

我们很容易借助一个[HashMap](https://processing.org/reference/HashMap.html[2])来解决这个问题。

HashMap 的用法很简单,这个数据结构和数组有所不同,简单理解,一个坑(键)对应一个值(值),如 {"name": "小菜与老鸟", "sex": "男"}。

这里我们的 HashMap 字典的键的类型是 Character 字符类型,值是 Boolean 布尔类型。

思路:

如果按住了某个键,就将这个键的 key 当成字典的一个键存储起来,对应的值是 TRUE,表示我已经按住了这个键当第二次按键要进行重复的时候,检测 HashMap 中这个字母的键是否已经已经设置了为 TRUE,如果有,则什么也不做,不会执行按压事件处理(下面例子中的按压事件处理仅仅是打印下按下的键)当松开按键的时候,要将 HashMap 中的该键的值还原成 FALSE,表示该键已经停止了按压代码语言:javascript代码运行次数:0运行复制
import java.util.Map;HashMap keys;void setup() {  size(400, 400);  keys = new HashMap();}void draw() {  background(0);}void keyPressed() {  // 如果已经敲击了键盘某个键,且字典里已经存在该 key 的值为 TRUE,则什么也不做  if (keys.getOrDefault(key, Boolean.FALSE)) {    // 啥也不做  } else {    keys.put(key, Boolean.TRUE);    println("click " + key);  }}void keyReleased() {  keys.put(key, Boolean.FALSE);  println("release " + key);}

OK。关于键盘的常用处理就说到这,后续有其他补充的,再继续更新。

参考资料

[1]ASCII: https://zh.wikipedia.org/wiki/ASCII

[2]HashMap: https://processing.org/reference/HashMap.html

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

556

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

733

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

414

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

658

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

553

2023.09.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTTP协议
HTTP协议

共10课时 | 1.4万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.4万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号