fc2ブログ

ミニマップの作成

ミニマップですが、別にこれもローグライク必須ってわけでもないのでTIPSの方に。
通路の壁を描画するタイプと床を描画するタイプがありますが、床を描画するタイプでつくってみます。

当然ながら、マップ座標の1マスごとに1ピクチャ使って描画していきます。
なのでマップサイズが100×100だったら、最大1万枚+αのピクチャを使うので、どこかにミニマップ用のピクチャ番号をどかんととっておくといいと思われます。

さて、とりあえず床のドットとなる小さなピクチャを用意しましょう。
1×1ピクセルだとさすがに小さいですが、2×2ピクセルとか3×3ピクセルとかでいいと思います。

で、なるべく処理を軽減させるために、ランダムダンジョンを生成した時点で、あらかじめ不透明度0で全部ミニマップを表示してしまいましょう。
マップ横サイズ×マップ縦サイズ分ループさせて、移動可能なマスには床ピクチャを描画します。320×240なら1マス16ピクセル、640×480なら1マス32ピクセルなので、ここらへんを使えば画面上の描画座標も簡単に取得できそうです。
あと、マップ座標とピクチャ番号に互換性を持たせるとのちのち便利ですね。

こうしてあらかじめ不透明度0で描画しておくことで、1ターンごとの処理が主人公とその周囲の床ピクチャをピクチャ移動で不透明度255にすることだけで済みます。
ローグライクではとにかく処理の重さに余裕がないので、極力処理量を減らす努力が必要ですね。

で、床描画ができたらオブジェクト系をその上のレイヤーに描画していきます。
こちらでもオブジェクトのIDとピクチャ番号に互換性をもたせて、移動処理のついでに自分のピクチャのミニマップを動かしたりすると楽なんじゃないかと思います。
スポンサーサイト



PC操作

1ターン処理を呼び出すトリガーとなるPC操作イベントをつくっていきます。
基本的にPC操作イベントはキー入力受付を無限ループさせるイベントですね。
並列実行のイベントでキー入力を受け付けてもできなくはないですが、自分がローグの崖を作った経験からすると、並列実行イベントはバグの温床なので、極力使うのを避けたいところです。

中身はこんな感じ。「1ターンの処理を実行」から呼び出されているイベントです。

[ループ地点]
キー入力受付:決定、キャンセル、四方向、サブetc…

条件分岐
1.決定 攻撃処理を呼び出してループ中断
2.キャンセル メニュー処理呼び出し
3.四方向 移動可能なら移動させてループ中断
4.サブとか 方向転換とかその他もろもろ呼び出し

ウェイト1フレーム
[ループ地点へ戻る]

簡略化したものですが、だいたいこんな感じです。
ようは、ループ内でキー入力を常時受け付けるようにしておいて、キー入力されたらそれに対応するイベントを呼び出し、なおかつターンを進める場合はループ中断して、このイベントを呼び出している「1ターンの処理を実行」イベントに戻ってNPC操作なんかを進める、という感じですね。
並列実行のイベントではないので、NPC操作中にキー入力を受け付けてしまってターン処理が二重に呼び出される、とかいうバグも防げます(ローグの崖ではそれで何度泣いたことか…)。

あとは状態異常で行動不能になっていたり行動制限がかかっていたりする状態なんかを追加していけば、PC操作はわりと簡単に完成するんではないかと思います。

NPC操作

ターン制を曲がりなりにも実装したので、いよいよAI構築に入っていきます。
ローグライクではこのAI行動処理を1ターンごとに、存在するオブジェクト数分ループさせるので、超高頻度で呼び出す処理になります。

そして、お分かりでしょうが、このコモンイベントの内容によってゲーム自体の処理の重さが決まってきます
自分でもローグライクを作った結果、快適速度で主人公を移動させつつ、処理の重さを気にさせない(コンマ以下のつっかかりが気にならない程度の)コマンド数はだいたい1ターンに2~3万が限度ってところでしょう。
それ以上を超えてくると、移動のたびに体感できるレベルでつっかかったりするので、とにかく無駄な処理を省くつもりで作っていきたいところです。

で、AIをつくるまえに自分なりに思ったことを書いておきますが、ここの処理は意図的に簡略化させた方がよいです
気合入れて「超高度なAIつくってやるぜー!」ってつくりだすと、かなり後悔することになります。
AIは必要最低限にしておいて、ゲームの深みは攻撃処理とかで出せばいいや、くらいの気持ちでつくっていくとちょうどいいんじゃないかと思います。

サンプルは以下の通り。
1.行動可能判定。行動不能なら終了。
2.攻撃判定。使用できる特技に応じて、特技の効果範囲内に敵がいるか判定。敵がいたら攻撃処理を呼び出して終了。
3.攻撃しなかった場合、移動判定。移動するのであれば座標関連のDBを動かして、キャラピクチャ(ないしイベント)の移動描画処理を呼び出す。

シンプルですが、だいたいこんな感じになるのではと思います。
移動判定に関しては、目的座標とか目的オブジェクトとかいう概念を活用するとつくりやすいでしょう。
目的が設定されていればその座標ないしオブジェクトに接近するように行動、目的が設定されていなければ、近くに(自分から見て)敵状態の生物がいればそいつを目的に設定、みたいな感じで。
純粋な不思議のダンジョン系ローグライクの場合は、フロアの循環のために、目的座標に部屋の入り口の座標なんかを利用することになりそうです。

AIは作り込めば作り込むほどゲームの奥深さを増す可能性がありますが、作り込んだ分だけ処理が遅くなるということを常に頭に入れておくとよいと思います。
Twitter
カテゴリ
最新コメント
月別アーカイブ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR