前回は敵の追尾を実装しました。今回はローラーを使った反撃と当たり判定を実装します。

ローラーを描画する

まずローラーを表示させます。ローラーの位置情報を管理するためのクラスをつくります。

XとYは現在のローラーの座標、InitXとInitYは初期座標です。LeftEndX、RightEndX、TopEndY、BottomEndYはローラーが移動できる左右上下の限界値です。

Rollerオブジェクトを生成します。ページが読み込まれたらローラーが初期座標の位置に描画されるようにコンストラクタに適切な値を渡します。初期座標は東西にかかる橋の左端と南北にかかる橋の下端です。

インスタンスを生成したらグローバル変数rollerNSとrollerWEに格納しておきます。

次にローラーを描画するための関数を作成します。

既存の関数を修正します。

ローラーを移動させる

上記の処理でローラーが描画されるようになりましたが移動させることができません。そこで移動させる処理を追加します。

ローラーが移動するのはプレイヤーがローラーの移動可能範囲内で押している場合です。押しているかどうかはローラーの座標とプレイヤーの座標を比較することで判断できます。プレイヤーがローラーを押しているかどうかを格納するフラグを作成し、以下のような関数を作成します。

座標を比較するときにC#だと変数をint型にすると端数は丸められて整数になるのですが、JavaScriptの場合はそうはならないのでMath.floor関数で整数に変換してから比較します。

それからローラーを押しているときに効果音を鳴らします。

プレイヤーの加速

ローラーを押しているときはプレイヤーの速度をアップさせ、ローラーを押し終わるまで方向転換ができないようにします。

キャラクタを移動させるためにタイマーを使っていますが、MovePlayer2関数はもうひとつ別に作っているタイマーによって呼び出されます。ローラーを押しているときにMovePlayer2関数でもプレイヤーを移動させるとそのときだけ加速している処理ができるようになります。

既存の関数を修正します。

当たり判定とそのあとの処理

ローラーが移動するようになりましたが、いまは当たり判定が実装されていないので敵に接触してもなにも起きません。ローラーを押しているときに敵に接触したら敵を撃退し、そうでないときに敵に接触したらミス時の処理がおこなわれるようにします。

敵を倒したとき

まず敵を倒したときの処理をする関数を作成します。

ミス時の処理

以下はミスをしたときの処理です。

加算される点数の表示

敵を倒したときは近くに加算される点数を表示させます。それからスコアや残機、ゲームオーバー時にはその表示もここでやってしまいましょう。関連の関数を示します。

残機の表示

ゲームオーバー表示

既存のDraw関数を修正します。

ステージクリア判定

ステージクリア時には次のステージへ進むことになりますが、ステージクリア判定の処理が必要です。

ステージクリアの条件は通路をすべて塗りつぶしたときです。通路であって二次元配列 isVisits がすべてtrueになっているとき・・・と言いたいのですが、実際にはちょっと違います。交差点の部分はisVisits[y][x]がfalseでも交差点を通過していれば色が塗られているように見えてしまうのです。

そこでisVisits[y][x]がfalseでも近くにtrueの座標があればtrueと見なすことにします。そうでないとすべて塗り潰れているのになぜかステージクリア判定されないという問題がおきてしまうので…。

これは引数の座標に相当するisVisits[y][x]はtrueか、trueでなくてもtrueと見なすべきなのかを返す関数です。

これはステージクリアかどうかを判定する関数です。POSITION.POSITION_NONEではないすべての座標でIsVisitSurroundingPosittions関数を実行してひとつもfalseが返されなかった場合はステージクリアです。

Update関数が実行されたときにステージクリアかどうかをチェックします。ステージクリア時はそのときにする処理をおこないます。

既存の関数を修正します。

またGameStart関数も修正が必要です。