Cannon.jsを使ってすいかゲームを作る(1)の続きです。今回はゲーム開始以降の処理を実装します。

ゲーム開始以降の処理

ここからはゲーム開始以降の処理を示します。

ゲーム開始時の処理

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

まず前回のプレイでフィールド上に存在するボールを取り除きます。そのあとスコアとレベルの初期化をおこない、操作ボタンを表示させてスタートボタンを非表示にします。最後に、もし更新処理が停止しているときは update関数を呼び出します。

ボールを投下する処理

ボールを投下する処理を示します。

投下されたボールが投下開始地点に存在するにもかかわらず、連続投下できてしまうとまずいので連射制限(0.5秒)をしています。またボールがデッドラインよりも上にあるときは投下処理はおこなわれません。

それ以外のときは投下処理をおこないます。nextX, Y_STARTの位置で半径 nextRadius のボールを生成して落下させます。そして次に投下するボールの半径を乱数で決定します。そのあと効果音を鳴らします。

isOverDeadLine関数は、デッドラインよりも上にあるボールがあるか調べます。

更新処理

更新処理を示します。

まず左右の移動ボタンが押下されているときは次に投下するボールのX座標を増減(左右に移動)させます。そのあと cannon_world.step(1 / 10) を実行して 0.1 秒後の状態をシミュレートします。更新処理は 1秒間に60回なので引数も 1 / 60 にすべきなのですが、これだとボールの動きが遅くなってしまうので調整をいれています。

cannon_world.stepを実行したらcheckCollision関数を呼び出して、それぞれのボールの座標がわかるので同じ半径のボールが接触していないか調べます。もし接触している場合は関数内でボールを消滅させる処理がおこなわれます。

そのあと描画処理とゲームオーバー判定をおこないます。該当する場合はゲームオーバー処理をおこないます。そうでない場合は再度 update 関数を呼び出します。ただしボールが消滅した場合は次の更新まで50ミリ秒待機します。連鎖でボールが消えたときにわかりやすくするためですが、あまりわかりやすくなっていません(今後の課題)。

ボールを消滅させる処理

同じ半径のボールが接触しているときに消滅させて加点する処理を示します。これは半径の和と中心の距離を比較しています。加点は大きな半径のボールが消滅するにつれて加速的に大きくなるようにしています。またスコアとは別にレベルという概念も取り入れています。これはもっとも大きな半径のボールの半径から算出されます。

フィールド上に存在するボールの半径からレベルを算出する関数を示します。

描画処理

描画処理を示します。canvas全体を黒で塗りつぶし、デッドライン、すでに投下されたボール、地面と周囲の壁、次に投下されるボール(投下可能な場合)、スコアの順に描画します。

clearCanvas関数はcanvas全体を黒で塗りつぶす処理をおこないます。

drawDeadLine関数は上部に赤い線を描画します。投下されたボールが動かなくなったときにこの線を超えていたらゲームオーバーです。

drawNextBall関数は次に投下されるボールを描画します。

drawScore関数はスコアとレベルを描画します。

ゲームオーバー判定とゲームオーバー処理

ゲームオーバー判定とゲームオーバー時の処理を示します。

ゲームオーバー判定

ゲームオーバー判定処理を示します。ボールが消えたときに舞い上がりこれが原因でゲームオーバー判定されてしまうこともあったため、以下の方法でゲームオーバー判定をしています。

ボールを投下したりボールが消えてから充分な時間(約1秒強)が経過している
すべてのボールの速度がほぼ 0(実際は 8 以下)

この条件を満たすときにフィールド上に存在するボールのどれかが赤い線を超えていたらゲームオーバーとしています(いい加減な方法かもしれないのですが・・・)。

ゲームオーバー時の処理

ゲームオーバー時の処理を示します。

ボールを停止させるために更新処理を停止します。そしてスコアとレベルをサーバーにPOSTしてスコアランキングに記録します。そのあと効果音を鳴らして操作ボタンを非表示にしてスタートボタンを再表示させます。

スコアとレベルをサーバーにPOSTする処理を示します。

スコアランキング

スコアとレベルがサーバーにPOSTされたらテキストファイルに記録する処理を示します。これは PHP を使用しています。

save-score.php

スコアランキングを表示する

スコアランキングを表示させます。最初に HTML を示します。

ranking.html

ranking.css

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

ページが読み込まれたら fetch API でスコアランキングが記録されているファイルを読み込み、ランキングを表示します。

ranking.js