今回は、Orange pico(Orangino)による、キーボードからのリアルタイム入力について説明します。
Orange BASICでは、リアルタイムキー入力を行う命令は二つ用意されています。ひとつは古くからのBASICユーザーにはおなじみのinkey() です。もうひとつはOrange BASICにしかない、kbstatus() です。
まずは、おなじみのinkey() を使ってみましょう。inkey() はリアルタイムに、キーボードからの入力を受け付けています。キーボードからの入力があると、押されたキーのコード(文字コード/アスキーコード)を返します。65なら英大文字のAが押されたことになります。押されたキーコードを、そのまま画面に表示してみましょう。
10 k=inkey()
20 print k
30 goto 10
runと入力し実行すると、押されたキーのコード(番号)が画面に表示されるはずですが、実際のところ速すぎて見えません。そこで、ウェイトを入れておきます。以下のように、プログラムを変更してから実行します。
10 k=inkey()
20 print k
30 pause 100
40 goto 10
すると、押されたキーのコードが画面に表示されていきます。なお、何もキーが押されていない場合は0になります。また、SHIFTキーやCTRLキーなどの修飾キーは、inkey() で入力されたかどうかを調べることはできません(英大文字小文字の文字コードで判別するという手はありますが)。
押されたキーのコードではなく、対応する文字にして表示することもできます。押されたキーの文字コードから、通常の文字に変換するにはchr$() を使います。古くからのユーザーには、これもおなじみの命令です。chr$() は、文字コードが0の場合は何も表示しないので、ウェイトは不要です。
10 k=inkey()
20 print chr$(k);
30 goto 10
入力されたキーに応じて、処理することもできます。カーソルキーで画面全体をスクロールさせる場合は、以下のようになります。scrollは画面全体、もしくは画面の指定した範囲をスクロールさせます。なお、IchigoLatteのように画面をリング状に(閉じられた空間。端までスクロールしたものが、反対側から出てくる)スクロールさせることはできません。
10 k=inkey()
20 if k=30 then scroll 3
30 if k=31 then scroll 2
40 if k=28 then scroll 0
50 if k=29 then scroll 1
60 goto 10
Orange BASICには、inkey()以外にkbstatus()という、リアルタイムキー入力を検知できる命令があります。SHIFTキーやCTRLキーも検知でき、さらに左右のSHIFT、CTRLキーを区別してくれるので、ゲームにはもってこいです。
特に同時キー入力を検知できるので、ゲームで使うならinkey()よりもkbstatus()の方が向いています。ちなみに、他にもジョイスティックからの入力を検知する命令もあります。
kbstatus()は同時キー入力に対応するため、ビットごとに対応キーが決まっています。最下位ビットからの対応は、以下のようになっています。なお、カッコ内は対応するビット値を10進数で表したものです。
(1)カーソルキー左
(2)カーソルキー右
(4)カーソルキー上
(8)カーソルキー下
(16)スペースキー
(32)SHIFTキー左
(64)SHIFTキー右
(128)CTRLキー左
(256)CTRLキー右
先ほどのカーソルキーで、画面をスクロールさせるプログラムを、kbstatus()を使ったものに書き換えると、以下のようになります。
10 k=kbstatus()
20 if k&4 then scroll 3
30 if k&8 then scroll 2
40 if k&1 then scroll 0
50 if k&2 then scroll 1
60 goto 10
実際に動かしてみると、一瞬で画面がスクロールしてしまいます。どうも速すぎるようです。そこで、以下のように適度にウェイトを入れます。
10 k=kbstatus()
20 if k&4 then scroll 3
30 if k&8 then scroll 2
40 if k&1 then scroll 0
50 if k&2 then scroll 1
60 pause 50
70 goto 10
kbstatus()は同時キー入力ができるので、inkey()と違いカーソルキーを同時に押すと、斜めにスクロールします。
応答速度や同時キー入力が可能な点からしても、ゲームであればkbstatus()を使う方がよいでしょう。
【古籏一浩】openspc@alpha.ocn.ne.jp
http://www.openspc2.org/
今年はコロナウイルスの関係で夏祭りは中止でした。私の地区だと夏祭りに続いて、9月に秋祭りがあります。で、今年は祭典委員なので準備をしないといけません。が、実質神事しかないので、殆ど準備するものがないという状態。
人が集まるのは駄目なので、子供相撲や子供神輿、皆で食事(弁当)するなど全部なし。祭典委員は一生に一度しか回ってこないサイクルなのですが(次は90歳とかになっちゃう)まあ、これはこれで、ずっと記憶に残りそうなお祭りになりそうです。
・創って学ぼうプログラミング
https://news.mynavi.jp/series/makeprogram
・8K/4K/ハイビジョン映像素材集
http://www.openspc2.org/HDTV/
・クリエイター手抜きプロジェクト
http://www.openspc2.org/projectX/