今回はパックマンもどきの主役パックマンをつくります。

パックマンを移動させる

・・・といいたいところなのですが、○印で表示させます。移動させる方法を考えていたらデザイン的にいいかげんなものしかできませんでした。

まずパックマンを表示させるためにはどこに表示させるか座標を指定する必要があります。上下左右のキーがおされることで座標がかわります。

ただ動きをなめらかにするためにどちら方向に移動しているのかを管理するフラグを作成してキーが押されたらフラグの値を変更します。そしてつねにフラグで指定されている方向に移動することにします。

これは移動している方向を示す列挙体です。

移動方向を表すDirect列挙体の作成

これはパックマンが描画されるセルと座標を管理するためのフィールド変数です。

パックマンの位置の初期化

ゲームがはじまったらパックマンの位置を初期化します。最初は上から19番目、左から11番目のセルがある位置に描画します。そしてGetMazeCellメソッドをつかってセルの位置を取得してpacPosXとpacPosYに格納します。

OnKeyDownメソッドのオーバーライド

上下左右のキーがおされたらパックマンの移動方向を変えます。ただしその前にほんとうに移動できるかどうか調べる必要があります。この判定をするのがCanPacmanMoveDirectメソッドです。

移動できることが確認できた場合はpacDirectに値を格納しています。

CanPacmanMoveDirectメソッドの作成

次にその方向に移動できるかどうかの判定をするCanPacmanMoveDirectメソッドですが、このような内容になっています。

現在パックマンが存在するセルの文字を調べます。そこから移動できるかどうかを判定しています。

左から○番目、上から○番目のセルがどの文字に対応しているのかを取得するGetStringMazeCellメソッドを示します。

MovePacmanDirectメソッドの作成

その方向に移動できることがわかったら、実際にその方向に移動させます。

パックマンが存在するセルの値を移動させたい方向に変化させます。そのあとパックマンを描画する座標を調べて適切な値をセットしてInvalidateメソッドを呼んでいます。これでOnPaintメソッドのなかで描画がおこなわれます。

セルからセルへの移動がなめらかにおこなわれているように見せるために4回にわけて移動させています。そのあいだループを止めながら回すのでTask.Delayメソッドをつかっています。

実際に移動してしまったあとではなく先にpacCellXとpacCellYの値を変更しているのは、移動が完了してしまうと次の移動がはじまってしまい、方向転換をすることができなくなるからです。方向転換するためには、移動先が決まって実際に移動が完了するまでにキーを押す必要があります。

DrawPacメソッド

実際にパックマンを描画するのはDrawPacメソッドです。

画像はmame icons 03 OKINIIRIで公開しているものを使用しました。アイコンタイプです。これをリソースとして追加します。

Tickイベントを処理する

ボタンを押してもpacDirectの値が変更されるだけなので、実際にMovePacmanDirectメソッドを呼ぶ処理が必要です。

そこでタイマーをつかってTickイベントを処理しています。MovePacmanDirectメソッドの処理中、さらにMovePacmanDirectメソッドが呼ばれたときのことを考えて、ignoreTickフラグをセットしています。