色いろ

BASIC入門編

ひろじいべーしっくch(旧:ひろじいチャンネル)  第四回の動画の解説・補足。(0-004)

結論

RND、RGB、GFILLの命令などを紹介するよ。

RND 整数の乱数を発生させます。

RGB 色を変化させます。

GFILL 塗りつぶす四角形を描きます。

プログラム

今回のプログラムはこちら。(公開キー44425K433、LOAD“N04_IRO”)

命令の説明

このブログにおいてはなるべく専門用語を使用せずに非常に短く簡潔に説明しています。

詳細を知りたい方は公式リファレンス等も参照してください。

(注)色コードついて

ここで扱うコード(CODE)とは、電源コードのコード(CORD)や、楽器の「ドミソの和音はCコード」という時のCHORDとは当然に別物です。

CODEという英語の意味は、名詞として①法律用語としての法典、条例、②作法、行動規範、③記号、符号、プログラムという意味、動詞として①符号化する、暗号化する、②コーディングする、プログラムする、とあります。

CODEという英語の本質的な意味には「ブレない部分を発生させないために全てに番号を付ける」ということでしょう。

動画内(3分8秒あたり)でまりさ が「CODEを行うということの最終目的は整理して管理することだ」と言わせました。それは0と1という数値が最小単位であるプログラミングにおいて、扱える物事の全てを数値に記号化させた方が管理しやすい、という私の解釈です。

ここで16進数を突然解説しますが、電圧が無いOFF(0)、電圧があるON(1)でコンピュータは2進数が得意であり、人間が10進数を得意とするのは5本指の両手で10あることから、少なくとも人間が理解しやすい妥協点は10以上で2以外の素数を含まない最小の倍数(コンピュータは2進数以外は苦手だから)は16だった、という説明でとどめておきます。

一般的なコンピュータでの色コードについては光の3原色である赤と緑と青の強度具合をそれぞれ0から16進数のFF(10進数で255)でほとんどの色を網羅できます。(なお、紙の印刷については赤と青と黄色(黒を追加することもある)で扱われています。)

詳細は「色コード」で検索していただくと具体的な説明がありますのでそちらも参考にしてください。

公式リファレンスにある「定数」の欄にプチコン4の「色コード(RGB値)」の一覧があります。

RND

RND(値)

読み方は「ランダム」。英語randomの省略。0~値-1までのランダムな整数。

(公式リファレンスでは「値」を「最大値」と説明していますが、最大値という表現だとその最大値がそのまま乱数の一つとして扱われるような勘違いもあるのかも、ということで「RND(種類)」という表現も考えましたが、最終的にここでは単に「値」としました。また、シードIDの説明については省略します。)

RGB

RGB(R,G,B)

読み方は「アールジービー」。Rは赤の値、Gは緑の値、Bは青の値。それぞれの値の範囲は0から255まで。

GFILL

GFILL 始点X,始点Y,終点X,終点Y,色コード

読み方は「ジーフィル」。始点から終点を対角線とする四角形で、中身を塗りつぶします。前回説明したGIRCLE、GLINE、GBOXについても最後に色コードを追加して色を指定できます。

動作の説明

前回までと今回のBUTTONの命令の違いについて説明します。

14行目で全てのボタンの情報を入手しています。

この情報を#Bで始まるボタンID(定数)の値と比較して判定しています。

なお、前回まで説明をしていませんでしたが「!=」は「≠」と同じ意味(不等号)です。

さて、BUTTON命令の返り値(戻り値)Bにはどんな数値が入ってくるのかというと

次のサンプルプログラムで試してみると

@BU

B=BUTTON0

?B

GOTO @BU

全てのボタンが押されていない時は0

Aボタンが押されている時は81928と表示されます。

実はここの返り値は2進数なのです。

よって

@BU

B=BUTTON(0)

BIN$(B)

GOTO @BU

と2進数に変換する命令BIN$を用いて変更してみましょう。

すると

Aボタンが押されている時は1 0100 0000 0000 1000と表示されます。

ボタンIDである#B_RRIGHT、これを

#B_RRIGHT

と実行してみると3と表示されます。

↓BUTTONで拾う情報とそのボタンIDとの対応の一覧(一部)

BIN$(B)対応ボタンボタンIDボタンIDの実態である整数値
0 0000 0000 0000 0000 (すなわち値は0)(ボタンを押していない時)(ボタンを押していない時)(実態が無い状態なので決められない)
1 0100 0000 0000 0001#B_RUP0
1 0100 0000 0000 0010#B_RDOWN1
1 0100 0000 0000 0100#B_RLEFT2
1 0100 0000 0000 1000#B_RRIGHT3
1 1000 0000 0001 0000#B_LUP4
1 1000 0000 0010 0000#B_LDOWN5
1 1000 0000 0100 0000#B_LLEFT6
1 1000 0000 1000 0000#B_LRIGHT7
1 0000 0001 0000 0000L1#B_L18
1 0000 0010 0000 0000R1#B_R19
1 0000 0100 0000 0000L2#B_L210
1 0000 1000 0000 0000R2#B_R211

次に、「<<」は演算子(左シフト(整数演算子))です。(符号ビットを考慮する。)

ビットシフト演算については しひこチャンネルさんの動画「プチコン4入門 シューティングゲーム編 第14回 属性指定パーツを置く」の8分29秒あたりにもあります。

もう一度15行目を見てみましょう。

15行目は1ビットを#B_RRIGHT分左にずらす。

すなわち、上の一覧表に照らし合わせると、#B_RRIGHTはほぼ3という定数の意味なので15行目は1ビットを3つ分左にずらす、ということです。

その結果は2進数で1を1つ分左にずらす→10

1を2つ分左にずらす→100

1を3つ分左にずらす→1000

ANDの左側部分、「1<<#B_RRIGHT」は2進数で「1000」と同義であり、置き換えて考えることができるということです。

また、ANDの右側である変数Bについては一覧表に基づいて置き換えられるので

15行目は、

・ボタンが押されていない時は

 IF (0 AND 1000)!=0 THEN @BOTAN_END

・Aボタンが押されている時は

 IF (1 0100 0000 0000 1000 AND 1000)!=0 THEN @BOTAN_END

ということです

そして論理積であるAND(両方とも1であれば1、それ以外は0)文でIF~THENの中の条件として0か1か分岐していきます。

ボタンが押されていない時は0と1000のANDとなり、
      0000
AND   1000
------------
      0000  →いずれの桁も両方とも1の時は無いので0000、つまり最終結果は0 

   

Aボタンが押されている時は 1 0100 0000 0000 1000と1000のANDとなり、

      1 0100 0000 0000 1000
AND   0 0000 0000 0000 1000
---------------------------
      0 0000 0000 0000 1000  →右から4桁目は両方とも1なので最終結果は1000(2進数)→すなわち0ではない。

15行目は、

・ボタンが押されていない時は

IF (0)!=0 THEN ・・・・これは成立しないのでTHEN以下は実行されない。

・Aボタンが押されている時は

IF (2進数で1000)!=0 THEN @BOTAN_END

ということで(GOTO)@BOTAN_ENDが実行されます。(THENのすぐ次に@ラベルがある場合には、GOTO文を省略することができます。)

前回まではこちらでした(N03_MARU_HOKA)

14行目BUTTON(0,ボタンID)としてボタンの情報をAボタンに限定して入手しています。

こちらの方がシンプルですが、複数のボタンを採用する時に、同じタイミングで判定した方が誤動作を防ぐ意味でも良いです。

今後は今回のBUTTONの命令やIFの判定を用いることが多くなります。

このボタン判定はよく利用しますので、そのうち慣れてくると思います。

今は中途半端でもいいですから頭の片隅に入れておいてください。

なお、プチコン4の初心者ガイド12「自由に動かす」というのがあります。次回の動画「ウォーキング」でもでてくるSPSETやSPOFSという命令もありますが、ここで扱っているBUTTONの命令は前回までの命令に近い扱いで採用されています。参考までにこちらも試してみてください。

まとめ

RND 整数の乱数を発生させます。

RGB 色を変化させます。

GFILL 塗りつぶす四角形を描きます。

色コードは色を記号化したもの。

今回は特別に左シフトとか論理積とかありましたが、これからのよく使われるBUTTON命令の紹介をしました。これは参考程度ということで、次回もよろしくお願いします。

コメント

タイトルとURLをコピーしました