29:キーボードの入力を処理する

◆PROCESSINGで始めるゲーム作りとコンピュータ

Thunder 29:キーボードの入力を処理する

今日の話題

 

11:キーの押下を検知する

前回の記事で、マウスの基本的な操作を検知する事ができるようになりました。アクションゲームなどではこれで十分かもしれませんね。

一方でクイズやアドベンチャーゲームのように、人間に何らかの入力を要求するようなゲームでは、キーボードの入力を検知したい事があります。

スマホなどでは論理的なキーボード(これを「ソフトウエアキーボード」と呼びます)しか持たないものがほとんどです。でもPCをお使いのみなさんであれば、大抵の場合は普通にキーボードがつながっている筈です(笑)。

ソフトウエアキーボードに対して、実際にPCやコンピュータにつながっているキーボードの事を「物理キーボード」と呼びます。

日本で売られているキーボードのキー配列には、多くの場合QWERTY(クウォーティー)配列が採用されています。諸説があるようですが、タイプライターを元に考えられたキー配列だと言われています。

Kl_qwerty(参考URL:Wiki キー配列記事 様)

QWERTタイプ以外では、欧米で用いられているDvorak(ドヴォラック)配列や、一部の国の言語に特化した特殊なキー配列のキーボードがあります。

でも、残念ながら日本で見かけることはほとんどありません。

例えば、下記はアラビア語に特化したキー配列のキーボードです。・・・なんだか凄いですよね・・・。異文化の香りが半端ありません(笑)。

901px-KB_Arabic.svg(参考URL:Wiki アラビア語キー配列記事 様)

キーボードでは「キーを押す」操作と「キーを離す」操作がありますが、PROCESSINGではこれを別々のイベントとして検知する事が可能です。

それではさっそく、キーが押された事を検知するイベントハンドラを紹介しましょう。

keyPressed():キーが押された

●種類
イベントハンドラ

●代表書式
void  keyPressed( ) {  … }

●引数
なし

●戻り値
なし

●使用例
void keyPressed() {  println(“HOGE”);  }  //キーが押されたらMSGを表示する

.

Sample05-1

<出力結果>
keyPressedSample1

上記サンプルを見て下さい。
void   keyPressed() {   }   と書かれた部分がキーの押下をキャッチするイベントハンドラになります。

実行結果ウィンドウの上にマウスカーソルをポインティングした状態で、キーボードの何かのキーを押下すると、コンソール領域にメッセージが表示されます。※

※keyPressed() では一部のキー(例:半角/全角キー、PrtScrキーなど)の押下を検知できない場合があります。

すごく簡単なプログラムですが、これでキーボードが押されたことを検知できるようになりました。楽ちんですね(笑)。

 

12:どのキーが押されたか知る

キーボードが押されたことを検知するのですから、ぜひ「どのキーが押されたのか」を知りたい所です。

PROCESSINGで、どのキーが押されたのかを知るには幾つかの方法があるのですが、最も簡単な方法を紹介しましょう。

PROCESSINGではキーが押されるたびに、押されたキーの種類をPROCESSINGが自動で用意している key という名前のグローバル変数に記録してくれます。

key変数( 画像URL:illust-AC 様:K_handsさん、ごるさん)

key はchar型(文字型)の変数で、押されたボタンの「文字」を格納しています。

ですので keyPressed() イベントハンドラの中で、key 変数の中身をチェックすれば、クリックされたキーの種類を知る事ができます。

Sample05-2

<出力結果>
keyPressed_Sample2
実行結果ウィンドウの上にマウスカーソルをポインティングした状態で、キーボードの「A」を押すと、コンソール領域にメッセージが表示されます。

やっている事は単純ですね(笑)。key の内容と文字を比較しているだけです。

注意点は key に格納されているのは「文字列」ではなくて「文字」だという事です。ですから
if (  key == “A”  ){  …
のようにプログラムすると、エラーとなってしまいます。

key 変数では、普通の英数字キー以外にもバックスペース(BACKSPACE)、タブ(TAB)、 エンター(ENTERまたは RETURN)、 エスケープ(ESC)、 削除(DELETE)の各キーを判定する事が可能です。

Sample05-3

<出力結果>
keyPressed_Sample3
バックスペース(BACKSPACE)やタブ(TAB)が押下された事を switch/case文で判定しています。

switch/case文については「14:順次、分岐処理の実装」で解説していますので、忘れた方は参考にしてみて下さいね。

BACKSPACE,、TAB、 ENTER、 RETURN、 ESC、 DELETE は、すべてPROCESSINGが用意している文字定数で、各キーに対応した特別な文字データとなっています。

ところで上記サンプルではエンターキーを判定する部分が

となっていることに気がついたでしょうか?。

これは key に格納されるエンターキーの文字が、OSの種類によって異なる為なのです。Windowsでは「ENTER」で判定しますが、OSX(マック)では「RETURN」で判定します。

エンターキーが押されたかどうかを「ENTER」 だけで判定していると、同じプログラムをWindowsとOSXで動かした場合に、動きが異なることになります(泣)。

どちらでも期待通り動作するように、意図してこのような書き方にしてあります。

 

13:特殊キーを判定する

上記で説明したように Key 変数だけで、大概のキーは判定する事ができます。でも残念ながらkey 変数は万能ではなく、一部の特殊キーについては判定できません。

例えば上下左右の各矢印キー、シフトキー、オルトキー(ALT)、コントロールキー、ファンクションキー(F1からF12)、インサートキー、デリートキーなどが該当します。

これらのキーを押すと keyPressed() イベントハンドラは動作しますが、key には内容が格納されないのです。

そのためPROCESSINGには、先に説明した key という変数以外に、押されたキーの情報を格納する keyCode という別の変数が用意されています。

通常のキーが押されたら key 変数で、矢印キーやコントロールキーが押されたら、keyCode 変数で、どんなキーが押されたかを判断します。

判断する変数が2種類も用意されているなんて、慣れないと少し混乱しそうですね(汗)。

key変数は文字型(char)でしたが、keyCode 変数は整数型(int)です。

勘が良い人は気が付かれたかもしれませんが、keyCode 変数にはキーボードの各キーに割り当てられている数値(キーコード)が格納されるのです。

キーコードについては前回の記事「27:マウスの入力を処理する」で説明していますので、忘れた方は参照してみてください。

keyCode変数( 画像URL:illust-AC 様:K_handsさん、ごるさん)

Sample05-4

<出力結果>
keyPressed_Sample4
上記サンプルを実行し上下の矢印キーを押下すると、コンソール領域に押された矢印キーに応じたメッセージが表示されます。

UP、DOWN、LEFT、RIGHTというのは、矢印キーのキーコードを定義したPROCESSINGが自動で用意してくれている定数です。

ところで上記結果を見ると、「65が押された」というメッセージが表示されていますよね?。

サンプルプログラムで case 文に引っかからなかった( default 部分が動作した)ようですが、65とはいったい何でしょうか?。

実は65というのは「A」キーに割り当てられているキーコードなのです。つまり keyCode が 65 ならAキーが押されたことがわかります。

ここまでの説明を聞いて、こんな事を思った方が見えるかもしれませんね。

「keyCode で普通のキー(Aなど)が押された事がわかるなら、key 変数って利用価値ないじゃん!」。・・・なかなか鋭いですね(笑)。

でも key変数にはちゃんと利用価値があるのです。

keyCode は押された「ボタンの種類」に応じたキーコードは戻してくれますが、「どんな文字が押されたか」は戻してくれません。

試してみればわかりますが、大文字のAを押した場合でも小文字のaを押した場合でも、keyCodeには 常に65 が格納されてきます。

key_keyCode( 画像URL:illust-AC 様:K_handsさん、ごるさん)

本当はコンピュータ的には、大文字のAには65、小文字のaには97という別々の番号が割り当てられているのですが、(何故か)PROCESSINGでは常に大文字扱いのコードが keyCode に格納されてきます。

つまり keyCode 変数では、押されたキーの種類はわかっても、大文字か小文字かは判別できないのです。

だからといって、常に key と keyCode 変数の両方を見なければいけないとなると、面倒くさいです(汗)。

第一、変数の中身を見るまでは「どんなキー」が押されたかわからないのに、変数を見る前にどちらの変数を見るべきか決めろ・・・だなんて、「卵が先か、鶏が先が」状態ですよね(笑)。

にわとり( 画像URL:illust-AC 様:しばころ さん、上田 ひろこ さん)

でも心配はいりません。

PROCESSINGには、押されたキー情報をどちらの変数で見るべきか判断する簡単な方法があるのです。

Sample05-5

<出力結果>
keyPressed_Sample5
上記サンプルをみてください。key 変数が CODED かどうかを判定し、どちらの変数をみるべきか決めています。

CODED というのはPROCESSINGが用意している特殊な定数で、key の中身が特殊キーがどうかを判断するのに利用します。

ですから上記サンプルで、矢印キーを押すと「矢印キーは特殊キー(CODED)」なので、「勇者は keyCode を選択した」と表示されます。

一方でAやBキーを押すと「AやBキーは特殊キー(CODED)では無い」ので、「勇者は key を選んだようだ」が表示されます。

これでスッキリです。

どんな名文(迷文)がキーボードから打たれても、あなたのプログラムでキャッチできるようになりました(笑)。

ちなみに、キーを離した時に動作するイベントハンドラは以下のようになります。

keyReleased():キーが離された

●種類
イベントハンドラ

●代表書式
void  keyReleased( ) {  … }

●引数
なし

●戻り値
なし

●使用例
void keyReleased() {  println(“離しちゃダメ”);  }  //キーが離されたMSGを表示する

.

Sample05-6

<出力結果>
keypressed_sample6
こちらは keyPressed() イベントハンドラに比べて、あまり使う機会は多くないかもしれませんね。

 

Forest今日の言葉

・ソフトウエアキーボード

ソフトウェアで実現したキーボードの事です。「やわらかいキーボード」の事ではありません(笑)。論理キーボードと呼ぶ人もいるようです。

・物理キーボード

ハードウェア(機械)のキーボードの事です。

 

scroll今日の文法

・void  keyPressed( ) {  … } イベントハンドラ

キーボードのキーが押された事を検知します。

・void   keyReleased( ) {  … } イベントハンドラ

キーボードのキーが離された事を検知します。

各キー定数

PROCESSINGには key や keyCode を判定するために用意されている便利な定数が幾つかあります。

代表的なキーと値を一覧表にしました。赤字は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:キーコード一覧 様)

 

 今日のまとめ

  • キーの押し・離しは専用のイベントハンドラで検知できる
  • どのキーが押されたかを知ることができる
  • 普通のキーは key で、一部の特殊キーは keyCode で判断する

30:文字を表示する(準備編) へ進む
28:マウスの入力を処理する へ戻る
目次へ戻る


本ページで利用している特に参照元記載のないアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。