隕石がタップされた時の処理

最後に隕石がタップされた時の処理について説明します。最初にゲーム中でなければ処理を継続しないようにします。これはゲームオーバーとなった後に隕石をタップすることを防ぐためです。スコアは隕石のY座標を加算します。これにより、隕石をより都市に近い部分でタップすれば高得点になります。高得点を得るにはリスクが伴うというわけです。

隕石がタップされたら爆発処理を行うための変数bakFlag、bakX、bakYを設定します。bakFlagは爆発を示すフラグでtrueを設定すると爆発処理が行われます。bakX, bakYは爆発表示の座標で、タップされた隕石と同じ座標を設定します。隕石が破壊されたので、新たなる隕石を出現させます。新しい隕石の生成はstartMeteo()関数を呼び出します。

隕石がタップされるたびにゲームの難易度を上げていきます。ゲームの難易度は変数gameRankでカウントします。1つ破壊するごとに1加算し、8個破壊したら隕石の出現数を1つ増やします。

8個破壊したかどうかを調べるのに「if ((gameRank & 7) == 0)」として判断しています。&は先ほど説明したように論理積を示しています。& 7とすると以下の表のように0~7までの範囲の値に収めることができます。

10進数 2進数 (ビットパターン) 7と論理積をとった場合の結果()内は10進数で示した場合
0 0000 0000 (0)
1 0001 0001 (1)
2 0010 0010 (2)
3 0011 0011 (3)
4 0100 0100 (4)
5 0101 0101 (5)
6 0110 0110 (6)
7 0111 0111 (7)
8 1000 0000 (0)
9 1001 0001 (1)
10 1010 0010 (2)
11 1011 0011 (3)
12 1100 0100 (4)
13 1101 0101 (5)
14 1110 0110 (6)
15 1111 0111 (7)

コード06

        function hit(n){
            if (!gameFlag) return;  // ゲーム中でなければ以後の処理を行わない
            score = score + Math.floor(my[n]);  // スコアを加算する
            document.getElementById("dispSC").innerText = "Score "+score;
            bakFlag = true; // trueとし爆発中であることを示す
            bakCount = 10;  // 爆発される時間(カウント)
            bakX = mx[n];   // 爆発画像の横位置は現在の隕石の位置と同じ
            bakY = my[n];   // 爆発画像の縦位置は現在の隕石の位置と同じ
            document.getElementById("bak").style.left = bakX;
            document.getElementById("bak").style.top = bakY;
            startMeteo(n);  // 新たな隕石を出現させる
            gameRank++; // ゲームの難易度を上げる
            if ((gameRank & 7) == 0){   // 8個破壊するごとに、一度に表示される隕石の数を増やす
                cnt++;
                if (cnt > 10) cnt = 10; // 隕石の最大表示数を超えないようにする
                startMeteo(cnt);    // 新たな隕石を出現させる
            }
    }