【はじめてのプチコン】マスク(論理演算) | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
BUTTON関数はDSiのボタン情報を2進数で返します。
どのボタンが押されているかを判断することでプログラムの流れを変えることができます。
そこで必要なのが論理演算です。


サンプルプログラムではプレイヤが右ボタンを押せば右に移動し、左ボタンを押せば左に移動しました。
左右のボタンが押されていなければ停止しています。
このようにプログラムの流れを変える切っ掛けとしてボタン情報を判定する必要があります。

実際にサンプルでは移動の判定に使っています。
まず39行目から41行目で

K = BUTTON()
IF K AND 8 GOTO @PLY1
IF K AND 4 GOTO @PLY2

そして54行目に

IF BUTTON() AND 8 THEN RETURN

そして62行目に

IF BUTTON() AND 4 THEN RETURN

ここで使っているのは10進数ですが実は2進数なのです。
数値の8は2進数に直すと1000です。
ただこのままでは10進数なのか2進数なのか分からないので今後2進数の場合数値の前の&Bと付け加えます。
10進数の8は2進数では&B1000となります。

ちなみに&BのBはバイナリ(binary)のことで2進数のことです。


まずBUTTON関数の返す値の意味を考えてみます。

■BUTTON関数

&B000000000000
  ┃┃┃┃┃┃┃┃┃┃┃┗ 十字ボタン上
  ┃┃┃┃┃┃┃┃┃┃┗━ 十字ボタン下
  ┃┃┃┃┃┃┃┃┃┗━━ 十字ボタン左
  ┃┃┃┃┃┃┃┃┗━━━ 十字ボタン右
  ┃┃┃┃┃┃┃┗━━━━ Aボタン
  ┃┃┃┃┃┃┗━━━━━ Bボタン
  ┃┃┃┃┃┗━━━━━━ Xボタン
  ┃┃┃┃┗━━━━━━━ Yボタン
  ┃┃┃┗━━━━━━━━ Lボタン
  ┃┃┗━━━━━━━━━ Rボタン
  ┃┗━━━━━━━━━━ STARTボタン
  ┗━━━━━━━━━━━ SELECTボタン


対応する位置が0のとき押されていない
1のとき押されているということです。

たとえばBUTTON関数の値が8のとき右へ移動するようにプログラムが作られています。このとき8は&B1000なので右から4番目の桁が1となります。
上の図では左から4番目は十字ボタン右になっていますね。

だったら右ボタンの判定は次の通りでもいいんじゃないかなと思いませんか?

IF BUTTON() == 8 THEN RETURN

実はこれでも動くことはあります。
ただこの判定はボタンが十字ボタン右のみの場合だけです。

しかし、実際のゲームの場合は複数のボタンが同時押されていることが多いので難しくなります。

たとえば十字ボタン右と十字ボタン上の同時押しの場合、これは右上ななめ移動に使用することが多いのですが、このときのBUTTON関数の返す値は

■BUTTON関数

&B000000001001
  ┃┃┃┃┃┃┃┃┃┃┃┗ 十字ボタン上
  ┃┃┃┃┃┃┃┃┃┃┗━ 十字ボタン下
  ┃┃┃┃┃┃┃┃┃┗━━ 十字ボタン左
  ┃┃┃┃┃┃┃┃┗━━━ 十字ボタン右
  ┃┃┃┃┃┃┃┗━━━━ Aボタン
  ┃┃┃┃┃┃┗━━━━━ Bボタン
  ┃┃┃┃┃┗━━━━━━ Xボタン
  ┃┃┃┃┗━━━━━━━ Yボタン
  ┃┃┃┗━━━━━━━━ Lボタン
  ┃┃┗━━━━━━━━━ Rボタン
  ┃┗━━━━━━━━━━ STARTボタン
  ┗━━━━━━━━━━━ SELECTボタン


これは10進数のいくらですか?
計算方法は今度にすることにして前回の表から

■10進数→2進数変換表

10進数┃ 2進数
━━━━╋━━━━
   0┃   0
   1┃   1
   2┃  10
   3┃  11
   4┃ 100
   5┃ 101
   6┃ 110
   7┃ 111
   8┃1000
   9┃1001 ←ここですね
  10┃1010
  11┃1011
  12┃1100
  13┃1101
  14┃1110
  15┃1111


要するに9になります。
8と比較しても等しくないので結果十字ボタン右が押されていないことになります。
このような場合に論理演算のANDを使います。

論理演算の特徴は各桁ごとに計算します。
ANDの場合一桁の演算結果は
■AND(論理積)

a┃b┃a AND b
━╋━╋━━━━━━━
0┃0┃   0
0┃1┃   0
1┃0┃   0
1┃1┃   1

ANDのことを論理積といいますが2進数一桁の掛け算と思えばいいのです。
ですのでどちらとも1のときだけ結果は1でそれ以外は0となります。

ではこの場合の十字ボタン右の判定を考えてみます。

BUTTON関数の値    &B1001
IFで使った値       &B1000  右の場合8でANDしましたね
ANDしてみると      &B1000

IF文は条件式の計算結果が0のとき条件が成り立たないと判断しそれ以外は成り立ったと判断します。
だかたこの場合結果が0でないので十字ボタン右が押されたと判定します。
このようなときにANDで使う値をマスクと呼んでいます。

あとよく聞く言葉でビットってありますよね。
この2進数一桁がビットといいます