Processing中,多个按键的键盘交互怎么实现?

理由
举报 取消

processing里面的键盘交互中,我print了key这个值,当你按下z时会打印出z,按下z的同时按x会打印出x,松开x键仍然是x,我想让它松开x键的时候(z一直按着)打印出z怎么实现???

2017年12月11日 1 条回复 1030 次浏览

回复 ( 1 )

  1. 鳥仟一·超傑
    理由
    举报 取消

    我想先将题主的问题作一个一般化:如何在 Processing 中实现按任意顺序按下和释放任意个键,在此过程中永远只输出最后按下的那个还没释放的键的键值。

    这个问题的难点首先在于在 Processing 中变量 key 保存的始终是最后一个按下或释放的那个键的值。因此按下一个键不放,再按另一个键之后,第一个键的信息如果事先没有被程序员主动保存起来的话就会「丢失」掉再也找不回来了。其次是虽然 Processing 的官方文档说布尔型变量 keyPressed 是只要有键被按下它的值就是 true,但文档里没有提到的是当同时有多个键被按下后,只要有一个 keyRelease 事件发生,keyPressed 就不再为 true 了,即使此时仍有键没被松开。

    要解决上面提到的问题,我的做法是用 IntList 数据类型做一个堆栈,可以按下任意个键,按下的键值会按先后顺序入栈,其间也可以松开任意的键,松开的键就从栈中抽走,因而栈顶的键值就永远是最后按下的那个还没有松开的键值。然后通过判断栈的高度是否非零(不是通过 keyPressed 的值,原因前面已经提到)来确定是否打印栈顶的键值。

    这是程序:

    IntList pkeys = new IntList(); //这个是用来堆栈的可变长度int型列表
    void setup(){
      size(400,300);
      background(255);
    }
    void draw(){
      printkey();
      //println(pkeys);
    }
    
    void keyPressed() {
      //当有新键被按下时在栈顶加入该键值
      if(!pkeys.hasValue(int(key)))
        pkeys.append(int(key));
    }
     
    void keyReleased() {
      for(int i=pkeys.size()-1; i>=0; i--){
        if(pkeys.get(i) == int(key)){
          pkeys.remove(i); //当有键被释放时,到栈中找到该键值,从栈中去掉它
        }
      }
    }
    
    void printkey(){
      if(pkeys.size()>0){ //当栈的高度不为零时输出栈顶的键值
        print(char(pkeys.get(pkeys.size()-1)));
      }
    }
    

我来回答

Captcha 点击图片更换验证码