「Scratchでパズドラっぽいゲームを作ってみた」を解説してみた その2
解説その2では「Scratchでパズドラっぽいゲームを作ってみた」の「ドロップを選択できるようにする」を解説していきます。
※定義名・変数名はいくつか変更しています。
解説のためのコードはこちら
解説その1ではテーブルに6×6=36個のマスを並べて、そのマスに順番に乱数で1〜6の値を入れ、テーブルの何番目かでそこに入っている値によって6種類の色のドロップを表示させるということをやりました。
その2ではマウスで選択中のドロップをマウスのX座標・Y座標からテーブルの何列目・何行目かを計算してそこからテーブルの何番目かを計算し、同じ色のドロップをマウスのすぐ下に表示する、というのをやっています。
新しい変数

変数「選択中のドロップの位置」選択しているドロップがテーブルの何番目にあるかを表す変数です。元記事では初期値が-1になっていますが、テーブルの何番目かは1から始まるのでここでは0にしました。
変数「選択中のテーブルの値」選択しているドロップの位置のテーブルの値を表す変数です。
変数「タッチ中」ドロップにタッチ(またはクリック)しているかどうかを0と1で表すための変数です。0だったらタッチしていない、1はタッチ中を表します。
定義「ドロップの選択処理」と他の定義と変数の関係

定義「ドロップの選択処理」

もしマウスが押されていて変数「タッチ中」がまだ0(タッチ中になっていない)なら、定義「マウスの位置からタッチ中のドロップの位置を取得する マウスのX座標 マウスのY座標」で「タッチ中のドロップの位置」(テーブルの何番目か)がわかります。
定義「マウスの位置からドロップの位置を取得する マウスのX座標 マウスのY座標」

マウスのX座標とY座標からマウスを押したところにあるドロップがテーブルの何列目・何行目にあるかを計算します。
「テーブルの最初のX座標」が0だったら「マウスの座標」を「ドロップの大きさ」+隙間(40+5)で割って、小数点以下を切り下げて整数にすれば何列目かがでます。
しかし「テーブルの最初のX座標」が−100から始まっているので、「マウスの座標」ー「テーブルの最初のX座標」でテーブルの最初の左端からの長さを出して「ドロップの大きさ」+隙間で割って切り下げします。
例 マウスのX座標 -90
-90-(-100)=10 テーブルの最初の左端から10のところにマウスがある
10÷45=0.222・・・ 切り捨て0列目
例 マウスのX座標 -55
-55-(-100)=45 テーブルの最初の左端から45のところにマウスがある
45÷45=1 1列目
Y座標も同じで「テーブルの最初のY座標」が150で、Y座標はーで下がるので「テーブルの最初のY座標」ー「マウスのY座標」を「ドロップの大きさ」+隙間で割って切り下げします。
例 マウスのY座標 140
150-140=10 テーブルの最初の上端から10のところにマウスがある
10÷45=0.222・・・ 切り捨て0行目
例 マウスのY座標 105
150-105=45 テーブルの最初の上端から45のところにマウスがある
45÷45=1 1列目
定義「ドロップの位置を取得する。テーブル上の 何列目 何行目」

解説その1でもでてきましたが、上で計算した選択中のドロップが何列目・何行目かからテーブルの何番目かを計算しています。
その計算結果は定義「ドロップの選択処理」の変数「何番目を処理中か」と変数「選択中のテーブルの値」に入ります。
定義「選択中のドロップを表示する」

もし0番目より大きい何番目かを選択中なら解説その1でもでてきた定義「ドロップを表示する X Y テーブルの何番目か」を使って選択しているのと同じ色のドロップをマウスの位置より少し右下に表示します。
これは「もし タッチ中=1 なら」でマウスが押されているかどうかを常に監視しているので「ずっと」のブロックに入ります。
「ずっと」なので、マウスを移動した時にその度にマウスの位置で表示されてしまいます。
ペンは「選択中のドロップを表示する」だけを消せないので「全部消す」の命令を上でしています。
「テーブルを表示する」もここに入っているのでこのままだと順番に表示して消えるを繰り返します。
ブロック定義の「テーブルを表示する」を右クリックして「編集」で「画面を再描画せずに実行する」にチェックを入れてOKしてください。
ずっと表示されているようになります。