基本上我必须对项目使用Processing(不是选择不当),并且遇到了关于同时按下多个键的问题。在keyPressed()
函数中,我有多个条件,每个条件都将一个键映射到一个动作。这一切都很好,但假设我想一次按多个键?
有什么建议吗?
感谢。
答案 0 :(得分:4)
创建一个数组。为要检查的每个键分配一个数值,然后在按下或释放键时打开或关闭数组中的相应值。然后在draw()中检查数组的值,以查看在任何给定时刻打开和关闭的数组。
boolean[] keys = new boolean[4];
final int A = 0;
final int D = 1;
final int W = 2;
final int S = 3;
void setup() {
}
void draw() {
if (keys[D]) {
// do something;
}
if (keys[A]) {
// do something;
}
if (keys[W]) {
// do something;
}
if (keys[S]) {
// do something;
}
} // end of draw()
void keyPressed() {
int mybutton = key; // the ascii value of the key that was pushed
switch (mybutton) {
case 101:
keys[D] = true;
break;
case 97:
keys[A] = true;
break;
case 44:
keys[W] = true;
break;
case 111:
keys[S] = true;
break;
} // end switch
} // end keyPressed
void keyReleased() {
switch (mybutton) {
case 101:
keys[D] = false;
break;
case 97:
keys[A] = false;
break;
case 44:
keys[W] = false;
break;
case 111:
keys[S] = false;
break;
} // end switch
} // end keyReleased
答案 1 :(得分:2)
您可以使用keydown事件并按下列表中的每个键(数组,堆栈等),然后在发布的键上清除它。在密钥关闭的那一刻,keydown会被触发,因此如果你将列表与你期望的列表进行比较,它就可以解决问题。类似的东西:
var arrKeys = [];
function zone_keyDown(event) {
var evt = window.event || event;
arrKeys.push(evt.keyCode);
}
function zone_keyReleased(event) {
arrKeys = [];
}
答案 2 :(得分:1)
不是单独使用keyPressed(),而是使用keyPressed()和keyReleased()并跟踪哪些键是关闭的,只在keyReleased()期间执行操作。