Processing中,多個按鍵的鍵盤交互怎麼實現?

processing裡面的鍵盤交互中,我print了key這個值,當你按下z時會列印出z,按下z的同時按x會列印出x,鬆開x鍵仍然是x,我想讓它鬆開x鍵的時候(z一直按著)列印出z怎麼實現???


我想先將題主的問題作一個一般化:如何在 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)));
}
}

(這個程序理論上是對任意個按鍵都適用的,但實際情況下鍵盤上某些鍵一起按時是會發生硬體衝突的,經常是同時按下六個鍵後第七個鍵就無法起作用了。)


推薦閱讀:

如何學習 Procesing 語言?
關於processing和犀牛的問題?
這種效果用processing怎麼做?
有哪些利用 processing 創作出來的優秀作品?
這種圖片是怎麼做出來的,PS還是AI,具體怎麼做呢(紋理和顏色)?

TAG:Processing編程語言 |