处理keyPressed()

时间:2011-10-18 23:55:33

标签: listener processing key

基本上我必须对项目使用Processing(不是选择不当),并且遇到了关于同时按下多个键的问题。在keyPressed()函数中,我有多个条件,每个条件都将一个键映射到一个动作。这一切都很好,但假设我想一次按多个键?

有什么建议吗?

感谢。

3 个答案:

答案 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()期间执行操作。