プログラム講座 上級編5
直接キーコードを読み込む(キーコード表の半自動生成)
上級編5です。
今回はゲームでは必須となる「直接キーコードを得る」という処理を行います。これ自体は簡単ですので、キーコード表を作成する事にしましょう。キーコード表はHTML形式でテーブルタグを使用する事にします。
◆キーコード
Macでキーの入力を調べるには「キー入力イベント」で取得するのが普通です。Future BASICであれば、もっと簡単にINKEY$を使用する方法もあります。
ところが、リアルタイム性を求めるような処理、特にゲームではご丁寧にイベントを取得していたのでは処理速度が低下してしまいます。そこでゲーム等の場合直接キーコードを得る必要が出てきます。
このキーコードですが、「32ビット×4」=128ビットで返ってきます。Future BASICで処理する場合は、ロング変数の配列を4つ用意しておき入力コードを読み込んでどのキーが押されたか調べる事になります。
◆キーコードの取得方法と判定
キーコードを得るには、配列を用意しツールボックスを呼び出します。実際には以下の用になります。
DIM keys&(4)
CALL GETKEYS(keys&(0))
これでkeys&の配列にキーコードが入ります。簡単に取得できますがキーが入力されたかを判定する場合は注意が必要です。というのはキー入力イベントと異なり「複数のキー入力も受け付けている」という部分です。これは押されたキーに対応するビットが1(オン)になります。つまりキー1つ1つに1ビット割り当てられている事になります。取得したいキーコードが2番で3ビット目(ビットは右から0ビット〜といった具合に数えます)の場合、
flag = keys&(2) AND &H8
となります。flagが0以外であればキー入力があった事になります。
ANDは論理積といって
0と0なら0
0と1なら0
1と0なら0
1と1なら1
という具合に両方のビットが1以外0になります。上記の&H8を2進数に直すと、
000000000001000
となります。つまり右から3ビット目を1にして他を0にしマスクしているわけです。
◆入力されたキーからHTMLタグを生成する
今度はHTML文書に変換する部分です。これはとにかくキー入力を待ちます。キー入力があった時点でキーコードを取得しテーブルタグを取得していきます。キーを押す度にタグを生成していきます。キーが押されたかどうかはINKEY$で調べています。
作った後で不都合を発見してしまいました・・・。勉強と言うことで修正するとよいでしょうf(^^;
◆終わりに
これでゲームでキー入力を行うための最低限の土台ができました。ゲームはジャンルにもよりますが、直接キーを読むだけでなく直接画面を書き換える場合もあります。これはMacが遅いから、QuickDrawが低速だからという部分が原因です。リアルタイムゲームの場合は、自分で描画ルーチンを作成した方が良いでしょう。
◆今回のプログラムリスト
DIM keys&(4)
DEF OPEN "TEXTttxt"
OPEN "O",#1,"keys.html"
DEFSTR LONG
PRINT #1,"Key Map"
PRINT #1,""
PRINT #1,"Key Map
"
PRINT #1,""
WHILE FN BUTTON = _false
CALL GETKEYS(keys&(0))
k$=""
WHILE k$=""
k$ = INKEY$
WEND
IF ASC(k$)<= &H20 THEN k$=HEX$(ASC(k$))
PRINT k$,
PRINT #1,"";k$;" | ";
FOR i=0 TO 3
PRINT HEX$(keys&(i)),
LONG IF keys&(i) <> 0
PRINT #1,"";HEX$(keys&(i));" | ";
XELSE
PRINT #1,"";HEX$(keys&(i));" | ";
END IF
NEXT
PRINT
PRINT #1,"
"
WEND
PRINT #1,"
"
PRINT #1,""
CLOSE #1