クリエイター手抜きプロジェクト[633]IoT Orange pico編 LEDディスプレイモジュールを使う
── 古籏一浩 ──

投稿:  著者:



今回は、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/