動作確認はこちらからどうぞ。

←↑→↓キーで移動、Zキーで穴を堀り、Xキーで埋めます。黄色いやさぐれひよこは落とせば死にますが、ピンク色のものは2段、青いやさぐれひよこは3段連続で落とさないと死にません。

前回はPlayerクラスを作成しましたが、今回はEnemyクラスを作成します。

Enemyクラス

最初にプロパティを示します。

コンストラクタ

コンストラクタを示します。引数は最初のX座標とY座標です。コンストラクタ内で上下の階に移動できるハシゴの座標を取得しています。

描画する

敵を描画するための関数を示します。描画のたびにDrawCountを増やして使用するイメージを変えて動いているように見せかけています。ただし穴に落ちているときはびっくりしているようなイメージを使用します。

移動させる

次に移動の処理を考えます。

上下左右に移動できるか確認するために、まずハシゴの座標を取得します。以下は上端の座標を取得する関数です。下端はコンストラクタ内でGameManagerクラスから取得します。

敵を移動させる関数を示します。敵はプレイヤーがいる階に向かって移動します。同じ階にいる場合はフロアを左右に往復します。移動先に穴があるときはハマりますが、他の敵がハマっていると穴の前で引き返します。

敵をプレイヤーと同じ階に移動するために進行方向を変更させる関数を示します。別の階に移動するためにはハシゴを使うしかありません。

水平移動している敵がプレイヤーが自分よりも下の階にいる場合、ハシゴの上端に来たのであれば下に方向転換します。プレイヤーが上の階にいる場合でハシゴの下端にいる場合は上に方向転換します。

ハシゴを下りてきた敵がハシゴの下端に来たらハシゴがさらにつながっているのであればそのまま下に移動します。そうでない場合は水平移動に切り替え、プレイヤーがいる方向に方向転換します。

ハシゴを上って敵がハシゴの上端に来たらハシゴがさらにつながっているのであればそのまま上に移動し、そうでない場合は水平移動に切り替えます。

別の敵がすでにハマっている穴があったら引き返します。そのための関数を示します。

最初にその階の敵がハマっている穴のリストを取得します。もし現在のX座標がすでに敵がハマっている穴の縁よりも内側である場合は進行方向を逆方向に変更します。

穴にハマる

敵の現在位置にどの敵もハマっていない穴がある場合はその穴にハマります。そのときに穴にハマる前のY座標を記憶しておきます。そしてsetTimeout関数を実行し、指定された時間が経過したにもかかわらず埋められなかった場合は穴から這い出ることができるようにしておきます。またゲームの進行上、setTimeoutを無効にする場合に備えてTimeoutIDを保存しておきます。

穴から這い出す

一定時間が経過したのに埋められなかった穴から敵が這い出す処理をする関数を示します。

自分がハマっていた穴の深さを調べてループを回して座標を上に移動させます。GameManager.CharctorSizeが3で割り切れない場合があるので誤差をなくすため、最後に記憶しておいたOldYをY座標に指定します。また敵は一ランク上の敵に昇格します。

穴から落ちる

敵が落ちる処理をする関数を示します。

落とされた敵を倒すことができるかどうかは敵のLifeによります。Lifeと同じか高いところから落とさないと敵を倒すことはできません。

穴は縦に連続して掘られているかもしれません。またその穴に別の敵がハマっている場合は、何段落とされたかに関わりなく相手も巻き込んで一緒に死ぬことになります。また敵を倒したときの点数を計算するとともに、それを表示させるために敵が死んだ位置を記憶しておきます。

敵を倒したときの点数を計算するための関数を示します。雑魚敵は100点、ボスは300点、ドンは800点ですが、高いところから落とした場合はさらに高得点になります。

当たり判定

プレイヤーとの当たり判定をする関数を示します。敵とプレイヤーの座標同士の距離がCharctorSize以下なら接触していると判定します。この関数がtrueを返すということはミスをしたことになります。

ミス時の処理

ミスをしたらゲームを再開する前に敵をもとの位置に戻します。そのための関数を示します。

敵を最初の位置・状態に戻すだけでなく、穴にハマった状態であればその状態も解消します。これと同じタイミングで穴におちた敵が這い上がるとY座標がズレてしまいます。そこでsetTimeout関数が実行されていた場合はclearTimeout関数を実行することでこれを無効化します。