JavaScriptでパズドラっぽいゲームをつくります。

HTML部分

HTML部分を示します。それから効果音の音量調整に関する部分は毎度お決まりの書き方なのでHTMLのなかに書いています。

JavaScript部分

主な定数を示します。

Dropクラスの定義

ドロップを描画するためにDropクラスを定義します。

IsInside関数は引数として渡された座標がドロップの内部かどうかを返すものです。2種類あるのは1種類だけだと斜めに移動する処理がうまくいかないからです。角の近くにマウスがあるときは反応しないようにするためにIsInside関数とは別にIsInside2関数を定義しています。

初期化の処理

ページが読み込まれたら初期化をおこないます。ドロップと敵のイメージを初期化したら、ゲームに必要なグローバル変数を初期化します。

更新処理

更新処理が行なわれたときの描画処理にかんする部分を示します。1000/ 60秒おきにドロップやその他ゲームで必要な情報をcanvas上に描画します。

ゲーム開始時の処理

ゲームが開始されたら[スタート]ボタンを非表示にしてスコアやHP、制限時間を初期化してカウントダウンを開始します。タイマーを止めるときに必要なのでsetInterval関数の戻り値を保存しておきます。

ドロップをクリックしたときの処理

ドロップをクリックしたときの処理を示します。

クリックされた地点のcanvas上の座標を求め、それがドロップの内部であるならそのドロップをグローバル変数 clickedDropに格納します。

ドロップを移動させる

ドロップが選択されている状態でマウスを移動したときの処理を示します。

clickedDropとは異なるドロップのうえにマウスポインタがある場合はそれと位置を入れ替えます。また6×6のドロップが存在する矩形からマウスポインタが外れた場合は移動処理を強制的に終了させます。これは隣り合ったドロップ以外との入れ替えがおきる不具合を防ぐための苦肉の策です。

ドロップを入れ替える処理を示します。

ドロップを入れ替えは瞬時に行なわれるのではなく、回転運動をするようなアニメーションをさせます。そのため2個以上のドロップに対して移動処理がおこなわれることがあります。

オブジェクトの座標はすぐに変更します。しかしアニメーションしている最中は描画されないようにして、コピーされた別のオブジェクトを生成してそれが回転しているように移動させて描画処理をおこないます。

ドロップを消す処理

マウスボタンが離された場合、制限時間が終了した場合はドロップが3個以上並んでいる部分を消し、上から新しいドロップを落とします。また点数と敵へのダメージを計算して敵の攻撃を行なわせ、勝敗判定をおこないます。

ドロップを消す処理をおこなうために必要なDropオブジェクトの二次元配列を返す関数を定義します。

これはドロップを消す処理をおこなうときにすでにチェック済みかどうかを記憶しておくためのbool型変数の二次元配列を生成する関数です。最初はすべてfalseで初期化しておきます。

縦または横に3つ以上並んでいるドロップを消す処理を示します。4つ以上並んでいる場合、二重に処理がおこなわれないようにしています。

消えたドロップを詰める処理を示します。Dropオブジェクトの二次元配列を取得してnullの部分があったら上にあるDropオブジェクトを下に移動させます。一番上は新しいDropオブジェクトを生成してこれで埋めます。

ドロップを消す処理が終わったら敵に攻撃させる処理をおこないます。

双方の攻撃が終わったら勝敗判定をおこないます。HPが0になっている側の負けです。

プレイヤー勝利の場合はステージクリア時の効果音を鳴らしてステージ数を1増やします。敵のイメージを新しいものに変更して、ドロップを移動できる制限時間の上限を変更し、双方のHPを初期値に変更します。これでJude関数が終了したら新しいステージが開始されます。

プレイヤー敗北の場合は、ゲームオーバーの効果音を鳴らしてゲーム再開用のボタンを表示させ、playingフラグをfalseに変更します。