ルーレットやタイマーで使用しているHEART★6基板のボタンを、キーボード代わりのコントローラー(操作用)として使うためのプログラミング方法です。
1.なにをコントロールする?
プログラムの例として、IchigoJam定番の「かわくだり」ゲームを、キーボードのカーソルキー(←,→)の操作から、HEART★6基板のボタンでキャラクターを動かすように改良してみます。
1 ‘KAWAKUDARI 2018 http://fukuno.jig.jp/2194
10 CLS:X=16
20 LC X,5:?”O”
30 LC RND(32),23:?”*”
35 WAIT 3
36 X=X-BTN(28)+BTN(29)
40 IF SCR(X,5)=0 GOTO20
1.ボタンの秘密
まずHEART★6基板のボタンが、どのような動きをするのか、次のプログラムで確かめます。
10 PRINT IN(4),IN(3),IN(2),IN(1),””,IN(9),BTN()
20 WAIT 5
30 GOTO 10
ボタン | 命令 | 押した時 の値 | 離した時 の値 |
IN1 IN2 IN3 IN4 BTN | IN(1) IN(2) IN(3) IN(4) IN(9) | 0 | 1 |
BTN | BTN() BTN(0) | 1 | 0 |
IN()命令とBTN()命令では、ボタンを押したときの値が違うことに注意してください。
特にIN(9)とBTN()は、どちらも同じIchigoJam基板の付属ボタンSW2の値を取得しますが、値は逆です。
-参考-
HEART★6基板では、スイッチを押したときは値は0、スイッチを離しているときは値は1になります。
このように、ONのときは0、OFFのときは1、という考え方をコンピュータの世界では負論理といいます。
逆にBTN()命令では、ONのときは値が1,OFFのときは値が0になります(正論理)。
※IN(0)とIN()も、付属ボタンの値を取得しますが、0,1ではありません。
2.プログラムを改造する
- まず、HEART★6基板のどのボタンをどのように使うかきめます。
IN4を左、IN1を右、のように使うのが一番よさそうです。 - つぎに、元プログラムからカーソル操作の個所を探します。
36行目のBTN命令を使っているところが、そのようです。
36 X=X-BTN(28)+BTN(29)
. - こんどは、BTN命令の使い方を理解します。
これは、プログラミングする人によって考え方(仕様)が異なりますので、プログラマーがどのように使おうとしたのかを知る必要があるのです。
元プログラムでは、BTN(28)は←キーを押した時、BTN(29)は→キーを押したときに値が1になること、押していないときに0になることを利用しています。
変数Xには、じぶんキャラの横方向の位置が入っているので、Xを+-1することで動きをつくっています。
36 X=X-BTN(28)+BTN(29)
. - これであれば、BTN(28)はIN(4)、BTN(29)はIN(1)に書き直してあげれば、ボタン操作で動きそうです。
36 X=X-IN(4)+IN(1)
. - しかし、IN命令の値はBTN命令の値と動きが逆でした。
ボタンを押す=0、離す=1
. - こんなときに使える式が、BASICには用意されており、「NOT(省略形 ! )」という式があります。
つぎのような意味になります。
NOT 式 : 式が0なら値を1に 、 式が0以外なら値を0にする
. - したがって、プログラムの修正は次のようになります(通常は省略形の!を使う)。
36 X=X-!IN(4)+!IN(1)
または
36 X=X-NOT IN(4)+NOT IN(1)
. - 完成したプログラムは次のようになります。
さらに50行目に、IN3ボタンを押したら再ゲームするようにプログラムを追加してみました。
1 ‘KAWAKUDARI 2018
10 CLS:X=16
20 LC X,5:?”O”
30 LC RND(32),23:?”*”
35 WAIT 3
36 X=X-!IN(4)+!IN(1)
40 IF SCR(X,5)=0 GOTO20
50 IF IN(3)=1 CONT ELSE RUN
3.INKEY命令を改造するワザ
元プログラム
10 CLS:X=16
20 LC X,5:?”O”
30 LC RND(32),23:?”*”
35 WAIT 3
36 K=INKEY():CLK
39 X=X-(K=28)+(K=29)
40 IF SCR(X,5)=0 GOTO20
INKEY命令は、キーボードから1文字を入力して、その文字コード値を返す命令です。
元プログラムでは、
←キーを押したときは28を、
→キーを押したときは29を、
変数Kの値にしています。
したがってINKEYの代わりに、
IN4のときは28を、
IN1のときは29を、
変数Kに代入するよう修正すればよいのです。
INKEY命令もCLK命令も不要になるので、元プログラムから36行目は削除します。
修正例1
10 CLS:X=16
20 LC X,5:?”O”
30 LC RND(32),23:?”*”
35 WAIT 336 ‘ K=INKEY():CLK
37 IF IN(4)=0 K=28
38 IF IN(1)=0 K=29
39 X=X-(K=28)+(K=29)
40 IF SCR(X,5)=0 GOTO20
なお、次のようにすれば、変数Kも不要になります。
修正例2
10 CLS:X=16
20 LC X,5:?”O”
30 LC RND(32),23:?”*”
35 WAIT 336 ‘ K=INKEY():CLK
39 X=X-(IN(4)=0)+(IN(1)=0)
40 IF SCR(X,5)=0 GOTO20
※IN命令の結果は0か1なので、次の書き方でもOK
39 X=X-!IN(4)+!IN(1)
この教材は「Creative Commons — CC BY-SA 4.0」の下に提供されています。
NPO法人NEXTDAY with TEAM IchigoJam ほっかいどう