画面がスクロールする2Dゲームのプログラミングについて

この記事はSYSKEN Advent Calendar 2016 4日目の記事です。
録月塩です。今年、コンフェスと弥生祭で「トレジャーハンター」(以下、「TH」と記す)というゲームを展示しました。この記事では、「TH」で実装したマップ関連のプログラムについてざっくりと書きます。

まずは開発環境から。使ったものはDXライブラリ、エディタはサクラエディタです。おわり。
それでは早速、本題に入ります。最初に説明するのは「TH」の仕様について。
「TH」は画面がスクロールするゲームです。つまり主人公の画像は常に真ん中に固定されており、動くのは背景や宝の方という感じです。
他のゲームで例えるとファミコンのマリオとかロックマンとか。ステージが大きくて1画面に表示しきれないのでスクロールさせるんですね。
「TH」をスクロールさせずに表示するとなると横4962×縦4800の画面が必要です。私が現在使用しているPCの画面が1600×900でした。まあスクロールさせましょう。
あと、これだけマップが広いと自分が今どの位置にいるのかわからなくなると思うので、画面の右下にはステージ全体を映したミニマップも表示しています。

次に説明するのは、アイキャッチ画像にもした0と1の羅列の配列について。
これがマップそのものです。0はプレイヤーが通行可能な部分、1は通行不可能な部分です。「TH」では、この1つの数字が160×160の大きさを持っています。
上から3行を見てみましょう。
%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%ef%bc%91%e4%bf%ae%e6%ad%a3
上の画像が下の画像のようにマップ化されます。
%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%ef%bc%92
配列のひとつの要素の中に、横3×縦3の9マス分のデータが入っているわけです。わかりにくいしめんどくさい。
桁の最初が0で始まる要素は最初の桁に仮の1を入れたため、9桁だったり10桁だったりします。
これ素直にマップ通りになるよう配列に入れた方が良かったと思うんですけど。何でこんな風にしたかは今の自分にはわかりません。

それでは、マップを表示する関数の説明に入ります。マップ表示関数には、自機のマップ内X座標とY座標、マップの配列、壁の画像、宝・ゴール・ミニマップ関連の変数や画像といったデータを渡しています。
ここで注意するのは、マップ内の座標を渡すということ。表示される画面内の座標とマップ内の座標は別物なのです。
例として(100,100)という座標について考えてみましょう。画面内で(100,100)というと、左上の角(0,0)から右に100、下に100ずれた座標のことです。
しかし、マップ内の(100,100)は壁の中です。先ほどの画像で言うと、大体この辺になります。
%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%ef%bc%93
マップのかなり左上の方に位置してるのがわかると思います。最も左上に位置する0に自機を置くためには、(480,480)ぐらいの座標が必要です。
ちなみに自機の初期位置は(320,4160)です。

さて、マップ表示関数では次の流れでマップを表示しています。
(1)自機の位置が配列のどの辺にあるか割り出す
自機のマップ内X座標とY座標から配列のどの部分を読めばいいか計算します。
(2)自機の位置しているマスを中心に上下左右それぞれ2マスずつ表示する
中心マスも含めて合計25マスです。1マスが160×160、マップを表示する画面が480×480なので、これだけ表示すれば画面いっぱいに表示できます。
「TH」では、配列の0に該当する部分には何も表示せず、1の部分では160×160の土の画像を表示することにしています。これで視覚的に「土のところは突破できないんだな」ってわかります。こんな感じです。画像右側にこの画像のマップデータを示します。
%e3%83%9e%e3%83%83%e3%83%97
(3)宝やゴールが画面内にあれば表示する
宝が存在するかどうかのフラグ変数や宝・ゴールの座標・画像をマップ表示関数に渡しておき、それを使います。
(4)ミニマップを表示する
マップ配列から、右下の160×160の部分に5×5の小さい画像を敷き詰めて全体のマップを表します。こんな感じです。
%e3%83%9f%e3%83%8b%e3%83%9e%e3%83%83%e3%83%97
下のやや左にある灰色の四角が自機、マップ全体に散らばっている緑・青・赤・黄の四角は取ってない宝です。

まとめ
スクロールするゲームを作るポイントは大きく分けると次の二つだと思います。
・「マップのデータを作る」
「TH」では、マップのデータは0が通行可能、1が土としました。ここに2だったら壊せるブロック、3だったら違う色の土とか色々追加できると思います。
・「マップ内の座標の管理・表示処理」
1画面のゲームだと座標は3桁ぐらい、ゲーム内部で扱う座標=画面で表示する座標でした。
しかし、スクロール制では座標が4桁、ステージの大きさによっては5桁とかいくかも知れませんし、ゲーム内部で扱う座標≠画面で表示する座標となると思いま す。
異なる二つの座標を上手く実装することが求められます。あと座標とマップデータも関連付けなければなりません。難しいですね。

大体こんな感じです。独学なところがあるので、これがセオリーだ!って自信満々に言えるわけでもありませんが、参考にしてくれると喜びます。
「TH」は2Dのゲームですが、最近は3Dのゲームが(スクロール含め)簡単に作れる系のものもあるらしいです。すごいですね。それ使うのもいいと思います。
それではこの辺で失礼します。明日のSYSKEN Advent Calendarもお楽しみに!
P.S. 未来の自分のためにもコメント文はちゃんと書きましょう。


コメントを残す

メールアドレスが公開されることはありません。