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

パックマンとモンスターのクラスをつくったので、餌のクラスもつくります。プログラムが開始されたら所定の位置に餌を配置します。そしてパックマンが通過したらIsEatenをtrueにします。IsEatenがtrueのオブジェクトは描画されません。すべてのDotオブジェクトとPowerDotオブジェクトのIsEatenがtrueになればステージクリアということになります。

また以下はDotオブジェクトを生成したり、これを描画するための関数です。

では迷路を描画して餌を配置し、パックマンとモンスターを動かしてみましょう。

まずグローバル変数を示します。

メイン関数を実行したらプログラムスタートです。

こんな感じになります。

では関連する関数をみていきましょう。

GetHTMLImageElement関数はファイルのパスからイメージを取得します。

0.015秒ごとにパックマンを移動させます。

キーが押されたらパックマンがその方向に移動できるのであれば移動できるようにします。

モンスターも同様に動かします。パワー餌を食べたときはモンスターはイジケ状態になり、移動速度は半分になります。そこでMoveMonsters関数を呼び出した回数をカウントして、イジケ状態のときは2回に1回しかmonster.Move()が実行されないようにしています。

モンスターは最初、赤色のモンスターを除いて巣のなかにいます。そこで初期状態にもどす関数も作成しました。SetMonstersStandbyCount関数は巣からでてくるまでの時間を設定するためのものです。ピンク色のモンスターは3秒後、ライトブルーは6秒後、オレンジは10秒後にでてくるようにしています。

それから描画の処理も必要です。DrawMazes関数はこのまえやりました。そのほかにパックマン、モンスター、食べられていないドット、スコアを表示します。ゲームオーバーになっているときはGame Overの文字も表示させます。

パックマンを描画する関数です。

モンスターを描画する関数です。

DrawDots関数とDrawPowerDots関数で餌とパワー餌を描画します。

スコアを描画する関数です。5桁までは左を0で埋めます。

DrawRest関数は残りのパックマンの数を描画するためのものです。パックマンは最初の状態では3です。残りのパックマンはそれよりも1つ少ない数で、これを表示します。残りのパックマンがいない状態で現在のパックマンがモンスターに捕まったらゲームオーバーです。

ゲームオーバーのときにSキーをおせばもう一度ゲームができます。3秒後にキャラクターが動き始めます。

Pacmanクラスのなかで移動したら餌を食べたか、モンスターと接触していないかを判定します。CheckEatDot関数は餌を食べたかどうかチェックする関数です。

パックマンがいる位置にまだ食べられていない餌があれば餌を食べたことになります。そのときは通常の餌であればOnEatDot関数、パワー餌の場合はOnEatPowerDot関数が呼び出されます。

普通の餌を食べたときの処理です。10点追加し、すべての餌が食べられたかを調べます。すべての餌が食べられていればステージクリアと判定します。

パワー餌を食べたときは50点追加してモンスターをイジケ状態にします。そしてモンスターの移動方向を反転します。

それからパワー餌の効果の時間をセットします。またモンスターを食べるごとに得点が200点、400点、800点、1600点と増えていくのでこれを計算できるようにeatMonsterCountを0にリセットします。

またパワー餌を食べた瞬間ステージクリアになる場合もあるのでCheckStageClear関数を呼び出しています。

パワー餌の効果が切れたらモンスターは元の状態に戻します。

ステージクリアしているかどうかはIsEatenがすべてtrueになっているかどうかで確認できます。

ステージクリアしている場合は3秒間動作を止めてパックマンとモンスターをもとの位置に戻し、餌もすべて食べられていない状態に戻してゲームを続行します。

次に当たり判定です。パックマンが移動するたびにCheckHitMonster関数が呼び出されます。ここではIsHitMonster関数を呼び出してそれぞれのモンスターと接触しているかどうかをチェックしています。

モンスターと接触したとき、イジケ状態であればパックマンに食べられます。その場合は動作を1秒間とめます。そのあいだもパワー餌の有効時間は減っていくのでそのぶん追加の処理をしています。また連続で何体のモンスターを食べたかで点数計算もしています。

イジケ状態ではないモンスターと接触してしまった場合はミスとなります。残機がひとつ減らせて、動作を3秒間止めます。もし残機0になった場合はゲームオーバーです。これ以上は動作させる必要はないのでstopingはtrueのままです。isGameOverをtrueにすることで画面にはGame Overの文字が表示されます。