Processingでキーボート入力を行う際に、複数ボタンの同時押しや長押しを行う方法です。
単純に考えたら当たり前で一般的なことなのかもしれませんが、工作趣味でプログラムを扱っている私にとっては結構苦戦しました。
今、Processingでプログラム作成しているので説明はProcessingの作法で記載してます。考え方はいろいろな所で使えるかと思います。
ちょっとづつ切り取って説明。(最後にサンプルソースの全体を掲載してます。)
▼キー操作に反応する関数▼
void keyPressed() { if (keyCode == RIGHT) { //ここに処理を記載// } } void keyReleased() { if (keyCode == RIGHT) { //ここに処理を記載// } }
キーが押されるたびにに呼び出される関数とキーを離したときに呼ばれる関数です。関数が呼ばれた際に押されたキーを判定して処理できます。(上の場合は方向キーの右側を判定してます)
この関数を使用して、同時押しや長押しの処理を行ってみたいと思います。
▼押されたキーの判定▼
void keyPressed() { if (keyCode == RIGHT) bit |= (1<<0); //00000001 if (keyCode == LEFT) bit |= (1<<1); //00000010 if (keyCode == UP) bit |= (1<<2); //00000100 if (keyCode == DOWN) bit |= (1<<3); //00001000 }
上下左右のキー入力を確認してます。関数の中に具体的な処理を記述してしまうと、同時押しや長押しの処理ができないため、ここでは押されたか押されていないかだけのフラグを立ててます。
上の例で、真偽はbit単位で行ってます。押されたキーに対してbit0~bit3でフラグ[1]を立ててます。単純にbool型などで変数準備して「true」「false」を真偽に使っても何ら問題は無いと思います。そっちの方が視認性はいいですし・・。
今回は別の作成中プログラムで、入力の情報を通信データに乗せたくて、通信量を減らすために敢えてbitで情報持たせてます。Processingのbit処理の動きも確認したかったので・・ついでです。
▼キーを離した場合▼
void keyReleased() { if (keyCode == RIGHT) bit &= ~(1<<0); if (keyCode == LEFT) bit &= ~(1<<1); if (keyCode == UP) bit &= ~(1<<2); if (keyCode == DOWN) bit &= ~(1<<3); }
押されたときの逆です。離したキーに対してフラグ[1]をクリア[0]してます。
▼ループ処理の中で具体的処理を記述▼
void draw() { if ((bit&(1<<0))>0) a+=1; if ((bit&(1<<1))>0) a-=1; if ((bit&(1<<2))>0) b+=1; if ((bit&(1<<3))>0) b-=1; }
ループ処理の中でキーが真偽で具体的処理を記述します。こうすれば同時操作や長押しの処理も可能です。
▼ソース全体(Processinng)▼
キーボード操作(上下左右)に合わせてテキスト表示してるだけのソースです。
int bit; int a, b; void setup() { size(250, 200); } void draw() { background(240); if ((bit&(1<<0))>0) a+=1; if ((bit&(1<<1))>0) a-=1; if ((bit&(1<<2))>0) b+=1; if ((bit&(1<<3))>0) b-=1; fill(30); text(binary(bit, 4), 20, 20); text(a, 20, 40); text(b, 20, 60); } void keyPressed() { if (keyCode == RIGHT) bit |= (1<<0); //00000001 if (keyCode == LEFT) bit |= (1<<1); //00000010 if (keyCode == UP) bit |= (1<<2); //00000100 if (keyCode == DOWN) bit |= (1<<3); //00001000 } void keyReleased() { if (keyCode == RIGHT) bit &= ~(1<<0); if (keyCode == LEFT) bit &= ~(1<<1); if (keyCode == UP) bit &= ~(1<<2); if (keyCode == DOWN) bit &= ~(1<<3); }
コメント