JavaScriptでミスタードリラーもどきを作る(1)の続きです。

ページが読み込まれたときの処理

ページが読み込まれたときにおこなう処理は以下のとおりです。

canvasのサイズ調整と追加
描画で使用するイメージの初期化
PlayerオブジェクトとBlockオブジェクトの生成
プレイヤーの位置を初期位置に設定する
イベントリスナの追加
レンジスライダーでボリューム調整を可能にする
モニターのリフレッシュレートによらず1秒間の更新を60回にする
BGMがエンドレスで再生されるようにする

イメージの初期化

描画で使うイメージを画像ファイルから読み出して定数(または配列)に格納します。

ブロックを生成する

ブロックを生成する処理を示します。

配列 blocks2x2 を初期化します。そのあとランダムな色で通常のブロックを生成してこれを配列に格納し、その配列をblocks2x2に格納します(配列の配列を生成する)。

そのあと深さ4おきにランダムに選んだ1列だけエアカプセルに置き換え、その周りを破壊するとエアが激減するブロックに置き換えます。

レンジスライダーでボリューム調整を可能にする

レンジスライダーでボリューム調整を可能にする処理を示します。まあこれは毎度毎度の処理です。

イベントリスナの追加

イベントリスナを追加する処理を示します。スタートボタンが押下されたらゲームを開始する処理以外はキーやボタンが押下されたり離されたらプレイヤーを移動させるフラグをセットしたりクリアしているだけです。

ゲーム開始時の処理

ゲーム開始時の処理を示します。

スタートボタンの非表示
ディスプレイ幅が狭い場合は操作用のボタンの表示
ブロックの生成
プレイヤーの位置の初期化
スコア、残機数のリセット
isPlayingフラグのセット
BGM再生の開始

更新処理

更新処理を示します。

プレイヤーの移動フラグがセットされている場合は移動
エアの消費
エアが20%以下に低下している場合は警報音の再生、そうでない場合は警報音を停止
プレイヤーの位置に応じたスクロール量(変数:scroll_y)の設定
ブロックの更新(落下・消滅等)
プレイヤーとブロックの当たり判定
火花オブジェクトが存在する場合はその移動
オブジェクトの描画

警報音の再生と停止

警報音はフリー音源を使用しているのですが、短いのでループ再生させています。再生中に別の再生が開始しないように再生が開始されたら停止するまでisDangerフラグをtrueにして、そのあいだは新しい再生処理が開始されないようにしています。

プレイヤーの移動

プレイヤーを移動させる処理を示します。

press◯◯Keyフラグがセットされている場合はPlayer.Directにその方向の文字列をセットします。これによってPlayer.Update関数が呼び出されたらその方向に移動する処理がおこなわれます。

移動先にブロックがある場合は破壊してから移動します。ただしエアカプセルの場合はここでは破壊せず当たり判定の処理で破壊処理をおこないます(処理内容が異なるため)。

また以下の場合は移動させません。

移動先が配列の範囲外のとき
移動先に向かってブロックが移動しているとき
移動先に破壊するとエアが激減するブロックがありそのLifeが2以上のとき

Lifeが2以上のエアが激減するブロックが移動先にある場合は金属音のような効果音を鳴らします。また移動処理は更新処理のたびにおこなわれますが、これだとLifeが5のブロックはすぐに破壊できてしまうのでignoreHitフラグをセットして0.3秒経過するまではブロックのLife減少がおきないようにします。そのためエアが激減するブロックを破壊するためには最低0.3×5秒必要です。

下向きに移動しようとしたときに配列の範囲外に出てしまう場合はステージクリアです。この場合はステージクリアの処理をおこないます。

ブロックを破壊する処理

ブロックを破壊する処理を示します。

すでに破壊されたブロックであれば何もしない
対象がエアカプセル(Type == 1 のもの)のときも何もしない
通常のブロック(Type が 2 以上のもの)であれば同色のつながっているブロックすべて破壊する
スコアの加算
対象が破壊するとエアが激減するブロック(Type == 0 のもの)のときはエアを激減させる
ブロックが破壊されることで落下を開始するブロックがある場合は落下処理をする
効果音を鳴らす

効果音は短いドリルっぽい音にしたいのですが、再生時間が1秒以上のものしか見つからず、0.2秒だけ再生(新たな再生が開始されたときは中止して新たな再生を開始する)する処理をしています。

これはLifeが2以上のブロックを叩いたときの処理です。Lifeを減らして効果音を再生しています。

同色のつながっているブロックを取得する処理を示します。

第一引数で渡されたブロックを起点に上下左右につながっている同色のブロックを幅優先探索で取得しています。また一度取得したブロックを何度も繰り返し探索しないようにしています。

第二引数は同色のつながっているブロックの最低個数です。後に4つ以上つながっている場合は消す処理でもこの関数を利用します。いまは複数のブロックがつながっていなくても取得対象なので 1 を指定します。

ブロックが破壊されることで落下を開始するブロックがある場合は落下処理が必要ですが、これは次回とします。