HEART★6基板を、コントローラにするワザ

ルーレットタイマーで使用している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
BTNBTN() BTN(0)10

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.プログラムを改造する

  1. まず、HEART★6基板のどのボタンをどのように使うかきめます。
    IN4を左IN1を右、のように使うのが一番よさそうです。
  2. つぎに、元プログラムからカーソル操作の個所を探します。
    36行目のBTN命令を使っているところが、そのようです。
     36 X=X-BTN(28)+BTN(29)
    .
  3. こんどは、BTN命令の使い方を理解します。
    これは、プログラミングする人によって考え方(仕様)が異なりますので、プログラマーがどのように使おうとしたのかを知る必要があるのです。
    元プログラムでは、BTN(28)は←キーを押した時、BTN(29)は→キーを押したときに値が1になること、押していないときに0になることを利用しています。
    変数Xには、じぶんキャラの横方向の位置が入っているので、Xを+-1することで動きをつくっています。
     36 X=X-BTN(28)+BTN(29)
    .
  4. これであれば、BTN(28)はIN(4)、BTN(29)はIN(1)に書き直してあげれば、ボタン操作で動きそうです。
     36 X=X-IN(4)+IN(1)
    .
  5. しかし、IN命令の値はBTN命令の値と動きが逆でした。
     ボタンを押す=0、離す=1
    .
  6. こんなときに使える式が、BASICには用意されており、「NOT(省略形 ! )」という式があります。
    つぎのような意味になります。
     NOT 式 : 式が0なら値を1に 、 式が0以外なら値を0にする
    .
  7. したがって、プログラムの修正は次のようになります(通常は省略形の!を使う)。
     36 X=X-!IN(4)+!IN(1)
    または
     36 X=X-NOT IN(4)+NOT IN(1)
    .
  8. 完成したプログラムは次のようになります。
    さらに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 3
36 ‘ 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 3
36 ‘ 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 ほっかいどう