7.キーボード入力




『入力機器の選択』
次に電卓のボタン入力部分を作ります。数字のボタンが押された時には数字である事を、演算ボタンが押された時には演算ボタンである事を、プログラムは理解してその後の処理を決めなくてはなりません。ボタン入力部分とは押されたボタンが何であるかを決定する機能をさす。
LGPが扱える入力機器は「キーボード」「マウス」「ジョイスティック」の3種類です。キーボードで直接数字を押すもよし、マウスやジョイスティックを使い電卓画面上のボタンを押すというのも良いでしょうが、取敢えずは処理の簡単なキーボードでの操作を採用し、余力があったらマウスをサポートしてみます。

『キーボードの情報を取得する関数』
LGPではキーボードの処理に2つの関数を使用します。
1つはボタンの押下情報(ボタンが押されているか、いないかの情報)を取得する「I@KEYGET2関数」、もう一つはI@KEYGET2関数で取得したボタン情報の詳細な情報を取得する「I@KEYGET2関数」です。
キーボードのボタンを押した時と離した時に、どのボタンが押された又は離されたのかという情報、押された又は離されたのかという情報等を取得できます。

『押されたボタンを確認』
押されたボタンの番号を取得するには、次のような2行のプログラムを書きます。
(本関数はver02.00.00からサポート)
  I@KEYGET2( )
  BT = I@KEYBTN2( 0 )


I@KEYGET2( )には引数(入力値)も戻り値(結果)も必要が無いので括弧の中は空っぽ(空っぽでも括弧は省略できません)で、結果を代入する為の「=」もいりません。
I@KEYBTN2関数の引数にはボタンの番号を取得する事を指示する「0」を指定します。
結果(戻り値)として押されたボタンに割り当てられた(ハードウェア上での)番号を取得します。(各ボタンの番号はマニュアルのI@KEYBTN関数の記述にあります。)
今回のプログラムでは、数値変数BTに結果が入ります。

『動かしての確認』
では、実際にプログラムを作って確認してみます。前章までに作ったプログラムにキーボード入力の機能を追加します。

CH=I@SETUP(320,240,8,1)
CH2=I@CHRLOAD("DENTAKU.BMP")
I@CHRCOPY(CH2,CH,0,0)
LOOP
  I@KEYIET2( )
  BT=I@KEYBTN2( 0 )
  I@FLIP( )
ENDLOOP


青い部分が今回追加した部分ですので、5章でダウンロードして実行したプログラムに青い部分を追加してみてください。
このプログラムの追加で、LOOP〜ENDLOOP命令でプログラムを繰り返す度に押された(又は離された)ボタンを確認するようになります。

『動きを目で確認する』
動きましたと、言葉で書いても結果が目に見えないので、実行しても面白くもありません。そこで、変数BTの内容を画面に表示してみる事にします。プログラムを次のように変更して実行してみてください。変数BTの内容がウインドウの左上に出るます。
2個所の青い部分が変更点なのでそれぞれについて説明します。

CH=I@SETUP(320,240,8,1)
CH2=I@CHRLOAD("DENTAKU.BMP")
LOOP
  I@CHRCOPY( CH2 , CH , 0 , 0 )
  I@KEYIET2( )
  BT=I@KEYBTN2( 0 )
  I@PRINT( CH , 0 , 0 , STR( BT ) )
  I@FLIP( )
ENDLOOP


『7行目(2つ目の青い行)の説明』
7行目に「I@PRINT関数」という新しい関数が現れましたが、これは文字列を描画する関数です。同関数の仕様を次に示します。

関数名

I@PRINT
 
機能
 指定の座標に文字列を描画します。
 
書式

int I@PRINT( int CN, int X1, int Y1, char MOJI )

パラメタ 説明
int CN キャラクタ番号
int X1 矩形の左座標
int Y1 矩形の上座標
char MOJI 描画する文字列


今回は画面に直接書き込むので「int CN 」には変数CHを指定し、描画する位置は取り敢えず画面左上にするとして「int X1」「int Y1」ともに0を指定します。
そして今回描画するものですが・・・・数字変数BTなので、そのままではI@PRINT関数で描画する事は出来ません。(I@PRINTで表示するのは文字列だが、変数BTは数字なので)
そこで、数字を文字列に変換する便利な機能である「STR関数(ストリング関数)」を使う事にします。
STR関数は引数に変換したい数字や数値変数を指定すれば文字列が結果として戻ってくるものです。
ここまできてなんなんですが、以前関数の使い方を書いたときに、結果はイコール「=」を使って左辺の変数に代入すると言いきりました。だとすればSTR関数の結果をI@PRINT関数に引き渡すには次のように一度結果を変数に代入するという手段を使うべきです。

  I@KEYIET2( )
  BT = I@KEYBTN2( 0 )
  MOJI$ = STR( BT )
  I@PRINT( CH , 0 , 0 , MOJI$ )


一応補足しておくが、STR関数の結果は文字列であるので、代入する変数も文字変数となる。文字変数は変数名の後ろにドル記号「$」を付ける事になっている。


しかし、わざわざ変数に代入して引き渡さなくても、直接書けるのならばその方が扱いは楽であろうと考えるのが普通であろう。
ここで、I@KEYBTN2関数やSTR関数の行をじっくり見ていただきたい。関数の結果をイコール「=」を使って左辺に代入する作業なのだが、関数の結果が直接左辺の変数に入るのではなく、関数を同関数の結果で置き換えるという事を行っているとイメージしてもらうと、I@PRINT関数の引数に直接STR関数を指定している意味が理解しやすいだろう。
つまり、「STR(BT)」の結果が「MOJI$」に入るのならば、I@PRINT関数の「MOJI$」に直接書くのと同じ事であろうという事なのです。これは他の関数でも同じ事がいえるもので、関数の結果は同関数と置き換わって以降の処理を行うとイメージしてください。
もし私の話が、理解しずらければ、従来どおり変数を仲介させるプログラムを行ってください。CPUから見ればどちらも同じ事ですし、変数を仲介させるほうがプログラムが見やすい(一行に色々な事を押し込めるよりも、バラにして順序立てた処理のほうが理解しやすいという事)と考える事も出来るからです。

『4行目(1つ目の青い行)の説明』
次に4行目の青い部分は前回は3行目にあった電卓の画像を画面に貼り付けしている部分です。
移動させた理由は、I@PRINT関数で描画する毎に直前で画面を電卓の画像で上書きしてきれいにするためです。
貴方が紙の上に鉛筆で文字を書くとします。同じ場所に文字を書いて行けば当然文字が重なって何を書いたのか分からなくなって行くでしょう。
これと同じ事で、I@PRINT関数で同じ場所に文字を書いて行くのですから、次の文字を書く前に文字の後ろを元の画像で初期化しておこうという為の処理なのです。

この説明が良く分からなければ、4行目を元の3行目に戻してあげれば理由が分かると思います。