敵の移動処理

ブロック崩しと異なり敵は侵略してくる(下に移動してくる)ため、移動処理が必要になります。敵を移動させるには全ての敵の数だけ繰り返す必要があります。下に移動させるには敵のY座標を増やします。1ずつ増やしてしまうと、あっという間に侵略されてしまいますので、0.2などにして少しずつ降下するようにします。0.1にすれば、よりゆっくりと降下し、0.4にするとより速く降下することになります。

敵のどれか1つが一定のY座標値(ここでは260)を超えた場合に侵略成功とみなしゲームオーバーとなります。ゲームオーバーの際にはゲーム中であることを示すフラグをfalseにしゲームではないことを示します。その後、アラートダイアログにゲームオーバーの旨を表示し、インターバルタイマーをクリアします。

敵は単純に下に移動するだけでは面白くないので左右に揺れながら移動させるようにしています。これは、あらかじめ揺れ幅をpatDX配列に入れておきます。配列内のどの値を加算するかを示すカウンタ変数patCountを用意し、配列内の値を順番に加算していきます。カウンタが配列要素数を超えないように「patCount = patCount % patDX.length」として割り算の余りを変数に入れます。このようにすると配列数を超えない範囲でカウンタ値が繰り返されることになります。

敵に侵略されるとゲームオーバーになる

コード06

        function moveEnemy(){
            if (!gameFlag) return;  // ゲーム中でなければ処理しない
            for(var i=0; i<total; i++){
                if (!enemyFlag[i]) continue;    // 敵がいない場合は繰り返しの先頭に戻る
                enemyX[i] = enemyX[i] + patDX[patCount];
                enemyY[i] = enemyY[i] + 0.2;
                document.getElementById("enemy"+i).style.left = enemyX[i];
                document.getElementById("enemy"+i).style.top = enemyY[i];
                if (enemyY[i] > 260) {  // 侵略されたらゲームオーバー
                    gameFlag = false;   // ゲームは終了したのでフラグをオフにする
                    alert("地球は侵略されました。ゲームオーバー");
                    document.getElementById("gameForm").style.visibility = "visible";
                    clearInterval(timerID); // タイマーを解除
                    return;
                }
            }
            patCount = patCount + 1;
            patCount = patCount % patDX.length; // 動きの量を示す配列の要素数を超えないようにする
        }