なぜかファミコンのドラゴンクエストのようなゲームをつくってみたいと思ったので作ってみることにします。というか鳩でもわかるC#管理人はドラゴンクエストをしたことがありません。そこでつくるのは「ドラゴンクエストもどき」です。生暖かく見守りください。

Form1クラス

まずForm1クラスを示します。

ここでやっているのはマップを生成してキー操作をするとプレイヤーや上下左右に動くように描画処理をおこなうことです。マップはここではひとつだけつくります。後に城のなか、洞窟のなかのマップというように増やしていこうと考えています。もちろん今回はやりませんが、将来的には戦闘シーンも実装します。

Map型のフィールド変数 _mapを定義します。これをいれかえればいろいろなシーンを描画できそうです。

これは移動する方向の列挙体です。

描画の単位になるブロックをつくる

次にマップを描画する単位になるブロックを作りますが、サイズは幅、高さともに32ピクセルとします。

ブロックの種類

ブロックの種類ですが、とりあえず以下のものを作ります。

描画するイメージを取得する

ブロックに描画するイメージを取得する処理をするクラスを作成します。

画像から入手した画像ファイルから必要な部分をきりとって使うのですが、この動画のなかでどうやって画像などの素材を入手したのかと質問したら丁寧にサイト名だけでなくurlも教えてもらえました。

ぴぽや倉庫

ということでありがたく使わせていただきます。

マップチップ 32×32~ – ぴぽや倉庫からダウンロードしたファイルを解凍するとpipo-map001.pngというファイルがあるのでこれを使います。主人公はキャラクターチップのなかから選んだものを使いました。

画像には32×32のもの、64×64のもの、96×96のものがあります。右上の座標を引数にしてその部分を切り取ることができるメソッドをつくります。

上記のメソッドをつかって主人公とマップに使うBitmapを取得します。

描画する矩形を管理するクラス

次にImageRectangleクラスをつくります。コンストラクタは2つ。マップのなかで何列目何行目になるのか、表示色は何色か?ブロックの種類は何かという情報をコンストラクタに渡します。RectangleプロパティはColumnとRowとブロックのサイズからこのブロックがはいる矩形を返します。またフィールド変数のCanMoveはこのブロックのなかにプレイヤーが移動できるかどうかを示すものです。

描画のための処理を示します。マップを描画するときは主人公が中央に表示されるため、そのぶんブロック全体を平行に移動させて描画しなければなりません。最初の1行でブロックを描画すべき位置を求めています。あとはその位置に描画するだけです。

小さい石の場合、はしのほうはなにも描画されていません。そこで最初に陸地の部分には草原のイメージを書き込んでそれから山や城を書き込むことにします。

マップをつくる

それではマップをつくります。今回つくるマップはひとつだけですが、複数作成して切り替えて使うことを考えています。

基底クラスのMapクラス

これはマップの基底クラスです。フィールド変数はImageRectangleオブジェクトを格納するリストとプレイヤーの位置を格納するためのものです。

CanMoveメソッドはプレイヤーが新しい座標に移動できるかどうかを調べます。プレイヤーを矩形とみなして4つの点がすべてImageRectanglesに格納されているオブジェクトでそのフィールド変数CanMoveがtrueのもののなかに入っている場合は移動可能と判断します。また橋や狭いところをとおるとき難しくなるので2ピクセルの余裕を持たせています。

MovePlayerメソッドはプレイヤーを移動させます。

Map1クラスを作成する

最初にこのようなマップをつくる文字列を用意しておきます。

コンストラクタのなかでInitメソッドを実行します。Initメソッドが実行されるとそのなかで文字をもとにImageRectangleオブジェクトが生成されます。これをリストのなかに格納します。

これはBGMを鳴らすためのメソッドです。

マップを描画する

マップを描画する処理を示します。

実際に動かしてみるとこんな感じです。城から城へ移動するだけで敵もでてきません。