◆PROCESSING 逆引きリファレンス
カテゴリー:キーボード・マウス処理
押された(離された)キーが何か調べるには
システム変数 key常に直前に使われた(押された、あるいは離された)キーボードのキーを保持している変数です。この変数を読み取ることで、どのキーが押された(または離された)かを知る事が可能です。
●システム変数 keyCode
基本的には key 変数と同じです。
key変数と異なるのは、押された(あるいは離された)キーがアスキー(ASC)仕様範囲内であればkeyに、範囲外であれば keyCodeに値が保存される点です。
代表例:
アスキー仕様に含まれるキー (BACKSPACE,、TAB、 ENTER、 RETURN、 ESC、 DELETE)
アスキー仕様に含まれないキー(UP、DOWN、LEFT、RIGHTの各矢印キー、SHIFT、ALT、CONTROLなど)
【注意】
keyの内容が システム定数の CODED かどうか調べることで、押されたキーがアスキー仕様に含まれるキーかどうか知る事が可能です。
ENTERキーとRETURNキーは、共に復帰改行(リターン)という同じ意味をもつキーです。しかし機種やOSによって、どちらを用いるのかが異なります。
例えば Unix系列のOSでは多くの場合 ENTERを用います。OSX(マック)ではRETURNです。
あなたが作成したPROCESSINGのプログラムが、どのOSで使われるか限定できない場合は、復帰改行キーの判定に両方を対応しておくのがベターでしょう。
【関連記事】
キーが押された事を判定するには
キーが離された事を判定するには
第3章:改定版-タイトル画面を作成しよう(その7)
●keyで判定する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void setup(){ } void draw(){ if( keyPressed == true ){ if( key != CODED ){ //ASCキーが押された switch( key ){ case ENTER: println( "ENTERキーが押された" ); break; case BACKSPACE: println( "BACKSPACEキーが押された" ); break; case TAB: println( "TABキーが押された" ); break; case DELETE: println( "DELETEキーが押された" ); break; case ' ': println( "SPACEキーがい押された"); break; default: println( key + "が押された" ); break; } } } } |
keyの内容が CODED かどうか調べることで、押されたキーがアスキー仕様に含まれるキーかどうか調べています。
アスキー仕様の場合(!= CODED)、押されたキー情報は key に格納されているので、その内容を表示しています。
●keyCodeで判定する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
void setup(){ } void draw(){ if( keyPressed == true ){ if( key == CODED ){ //ASC以外のキーが押された switch( keyCode){ case UP: println( "↑が押された" ); break; case DOWN: println( "↓が押された" ); break; case LEFT: println( "←が押された" ); break; case RIGHT: println( "→が押された" ); break; case SHIFT: println( "SHIFTが押された" ); break; case ALT: println( "ALTが押された" ); break; case CONTROL: println( "CTRが押された" ); break; case 112: println( "F1が押された" ); break; case 155: println( "INSERT押された"); break; default: println( keyCode + " CODEが押された" ); break; } } } } |
keyの内容が CODED かどうか調べることで、押されたキーがアスキー仕様に含まれるキーかどうか調べています。
アスキー仕様以外の場合(== CODED)、押されたキー情報は keyCode に格納されているので、その内容を表示しています。
一部のキー(SHIFT)などはPROCESSINGにより定数化されていますが、定数に存在しないキーもあります。本例では直接数値で判定しています。みなさんが利用する場合は、数値を自分で定数化した方が良いでしょう。
●ENTERとRETURNの両方に対応する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void draw(){ if( keyPressed == true ){ if( key != CODED ){ //ASCキーが押された switch( key ){ case ENTER: case RETURN: println("改行キーが押された" ); break; default: println( key + "が押された" ); break; } } } } |
ENTERもRETURNもPROCESSINGが定数として提供しています。case文で、そのどちらであっても良いように判定しています。
●応用:複数キー同時判定例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
ArrayList<Boolean> blKeyStat; //キーを覚える配列 int x,y; //ボール座標 //押されたキーの配列をtrueにする void keyPressed() { if (key == CODED) { switch(keyCode) { case UP: blKeyStat.set( 0, true ); break; case DOWN: blKeyStat.set( 1, true ); break; case LEFT: blKeyStat.set( 2, true ); break; case RIGHT: blKeyStat.set( 3, true ); break; } } } //離されたキーの配列をfalseにする void keyReleased() { if (key == CODED) { switch(keyCode) { case UP: blKeyStat.set( 0, false ); break; case DOWN: blKeyStat.set( 1, false ); break; case LEFT: blKeyStat.set( 2, false ); break; case RIGHT: blKeyStat.set( 3, false ); break; } } } void setup(){ //画面サイズ&ボール初期座標を画面中央に size(300,300); x = width/2; y = height/2; //配列確保&初期化 blKeyStat = new ArrayList<Boolean>(); blKeyStat.add( false ); blKeyStat.add( false ); blKeyStat.add( false ); blKeyStat.add( false ); } void draw(){ background(255); //押されたキーの方向にボール座標を移動する if( blKeyStat.get(0)==true ){ y--; if( y < 0 ){ y=0; } //上端判定 } if( blKeyStat.get(1)==true ){ y++; if( y > height ){ y=height; } //下端判定 } if( blKeyStat.get(2)==true ){ x--; if( x < 0 ){ x=0; } //左端判定 } if( blKeyStat.get(3)==true ){ x++; if( x > width ){ x=width; } //右端判定 } //ボールを描画 fill( 100,100,255); ellipse(x,y,30,30); } |
PROCESSINGでは簡単にキーボードの状態を判定できるのがメリットですが、それはあくまで単一のキー押下の場合です。複数のキー押下を同時に判定するためには、少し工夫が必要となります。
ゲームなどで、↑と→が同時に押されていたら、自機を右斜め前方に移動したいなどといった場面で必要となります。
上記を実行すると、各矢印キーの押下を同時判定し◯が斜めに移動します。
※上記のプログラムは Yahoo知恵袋 様:quickbrwnfoxjumpsoverthelazydogさん のプログラムを、ビット操作を行わずにArrayで判定するように改編したものです。
●おまけ
代表的なキーと値を一覧表にしました。赤字はPROCESSINGで定義されている予約定数です。
アルファベット | 数字 | ファンクションキー | 制御キー | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
A/a | 65/97 | O/o | 79/111 | 0 | 48 | F1(ヘルプ) | 112 | BACKSPACE | 8 | LEFT(←) | 37 |
B/b | 66/98 | P/p | 80/112 | 1 | 49 | F2 | 113 | TAB | 9 | UP(↑) | 38 |
C/c | 67/99 | Q/q | 81/113 | 2 | 50 | F3(検索) | 114 | ENTER | 10 | RIGHT(→) | 39 |
D/d | 68/100 | R/r | 82/114 | 3 | 51 | F4(アドレスバー) | 115 | SHIFT | 16 | DOWN(↓) | 40 |
E/e | 69/101 | S/s | 83/115 | 4 | 52 | F5(更新) | 116 | CONTROL | 17 | Insert | 155 |
F/f | 70/102 | T/t | 84/116 | 5 | 53 | F6(フォーカス) | 117 | ALT | 18 | DELETE | 127 |
G/g | 71/103 | U/u | 85/117 | 6 | 54 | F7 | 118 | Pause | 19 | NumLock | 144 |
H/h | 72/104 | V/v | 86/118 | 7 | 55 | F8 | 119 | 変換 | 28 | ScrollLock | 145 |
I/i | 73/105 | W/w | 87/119 | 8 | 56 | F9 | 120 | 無変換 | 29 | + | 43 |
J/j | 74/106 | X/x | 88/120 | 9 | 57 | F10(Alt) | 121 | スペース | 32 | - | 45 |
K/k | 75/107 | Y/y | 89/121 | F11(全画面) | 122 | PageUp | 33 | * | 42 | ||
L/l | 76/108 | Z/z | 90/122 | F12 | 123 | PageDown | 34 | / | 47 | ||
M/m | 77/109 | End | 35 | ||||||||
N/n | 78/110 | Home | 36 |
(参考URL:キーコード一覧 様)
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。