前回、前々回と2記事にわたって準備をしてまいりましたが、いよいよウディタでのSRPGづくり本番です。
まずは移動力の計算と表示。
こんな感じの表示が行えるように作っていきましょう。
移動力の計算
実は、基本の理屈は下の記事で説明済みだったりします(細かな規則はアレンジされていますが)。
SRPG用の移動力計算でやるべきことは、次のような流れです。
- 対象ユニットの移動力を取得し、可変データベース(CDB)の「移動力計算用」の対応位置に記憶
- 現在位置を、移動力計算コモン中のチェック座標リストにも登録
- チェック座標リストに登録されている座標の周囲4マスを調べ、残移動力から消費移動力を引いた結果をCDBに登録
- CDBに新たに登録したマスの残移動力が 1 以上なら、そのマスもチェック座標リストに登録
- 上記3~4をチェック座標リストがカラになるまで繰り返す
本体の処理を書いてみる
対象ユニットの情報と、現在のマップのサイズ(計算範囲の上限)を先に拾っておいて、あとは「リストがカラになるまでリスト内座標の周囲4方向チェックとリストへの座標追加」をくりかえします。
コモンの大枠はこんな感じ(大きなコモンになるので、前回のスクショの時から位置と名前を変えています)。
ここに、キモとなる「リスト内座標の周囲4方向チェックとリストへの座標追加」を書き足していきます。
追加の内容はこんな感じ。
チェック座標と、その周囲4マスをチェックなど、扱う変数が増えてちょっとした取り違えを起こしやすいので注意です。
付属のコモンはこんな感じ
「┃┣消費移動力チェック」コモン
■変数操作+: CSelf10[最も上のチップのタグ番号] = X:CSelf0[座標X] Y:CSelf1[座標Y]の最も上にあるタイルのタグ番号
■DB読込(ユーザ): CSelf4[結果] = ユーザDB[ 地形リスト : CSelf10[最も上のチップのタグ番号] : CSelf2[対象ユニット歩行タイプ] ] (0 : – : -)
▼ <ユニットの移動タイプが歩行なら1>となっています。飛行なら2です。
▼ これは地形のユーザーデータベースの番号と一致させておくと非常にラクに処理できます。
「地形ユーザーデータベースとの一致」というのは下図のことです。
コモンのなかでの1番と、ユーザーベースでの1番で同じ歩行タイプを意味するように規則を揃えておくと、データベースからの呼び出しが簡便になります。
「┃┗移動可範囲にパネル」コモン
■変数操作+: CSelf10[マップサイズ横] = マップサイズ[横] ■変数操作+: CSelf11[マップサイズ縦] = マップサイズ[縦] ■変数操作: CSelf12[チェックX] = -1 + 0
■回数付きループ [ CSelf10[マップサイズ横] ]回
|■変数操作: CSelf12[チェックX] += 1 + 0
|■変数操作: CSelf13[チェックY] = -1 + 0
|■回数付きループ [ CSelf11[マップサイズ縦] ]回
| |■変数操作: CSelf13[チェックY] += 1 + 0
| |■DB読込(可変): CSelf14[CDB読込] = 可変DB[ 移動力計算用 : CSelf13[チェックY] : CSelf12[チェックX] ] (0 : – : -)
| |■条件分岐(変数): 【1】 CSelf14[CDB読込] が 0 以上
| |-◇分岐: 【1】 [ CSelf14[CDB読込] が 0 以上 ]の場合↓
| | |■イベントの挿入[名]: [“┣指定座標にパネル表示”] <コモンEv 4> / CSelf12[チェックX] / CSelf13[チェックY] / 1:移動範囲
| | |■
| |◇分岐終了◇
| |■
|◇ループここまで◇◇
|■
◇ループここまで◇◇
ごく簡単にはこんな感じ。
製作が進むにつれて、さらに分岐が増えていくかもしれません。
「┣指定座標にパネル表示」コモン(過去掲載分の改良)
■変数操作: CSelf10[描画座標X] = CSelf0[座標X] * Sys118:[読]タイルサイズ
■変数操作: CSelf11[描画座標Y] = CSelf1[座標Y] * Sys118:[読]タイルサイズ
■条件分岐(変数): 【1】 CSelf2[パネル種] が 0 と同じ
-◇分岐: 【1】 [ CSelf2[パネル種] が 0 と同じ ]の場合↓
|▼ 選択中マス表示のときだけ、専用のマイナス番号
|■変数操作: CSelf12[ピクチャ番号] = -10 + 0
|■変数操作: CSelf13[R] = 100 + 0
|■変数操作: CSelf14[G] = 50 + 0
|■変数操作: CSelf15[B] = 50 + 0
|■
-◇上記以外
|▼ 通常のパネル番号検索
|■イベントの挿入[名]: CSelf12[ピクチャ番号] = [“┣空きパネル用番号検索”] <コモンEv 8>
|■変数操作: CSelf13[R] = 100 + 0
|■変数操作: CSelf14[G] = 100 + 0
|■変数操作: CSelf15[B] = 100 + 0
|■
◇分岐終了◇
▼
■条件分岐(変数): 【1】 CSelf10[描画座標X] が -1 と同じ
-◇分岐: 【1】 [ CSelf10[描画座標X] が -1 と同じ ]の場合↓
|■ピクチャ消去:CSelf12[ピクチャ番号] / 0(0)フレーム
|■イベント処理中断
|■
◇分岐終了◇
■ピクチャ表示:CSelf12[ピクチャ番号] [左上]ウィンドウ「<SQUARE>」サイズ[Sys118:[読]タイルサイズ,Sys118:[読]タイルサイズ] X:CSelf10[描画座標X] Y:CSelf11[描画座標Y] / 0(0)フレーム / パターン 1 / 透 150 / 通常 / 角 0 / 拡 100% / カラー R[CSelf13[R]] G[CSelf14[G]] B[CSelf15[B]]
さまざまな種類のパネルが出てくると思うので、そのたびに手を入れることになるでしょう。
コモン呼び出し時の入力値「パネル種」でモードを変えられるようにしてあり、ポインターと移動範囲用パネルのモードそれぞれで使うピクチャ番号や表示の色味を変えるようにしています。
移動範囲の表示をしてみる
はい、よい感じに動いてくれたようです。
地形ごとの消費移動を設定する
上の図はまわりがすべて平地で、消費移動が1のケースでした。
もっとSRPGらしくするなら、歩兵系のユニットの場合、森や水場は移動力の消費が激しくなるでしょうし、山は通行不可能のはず。
地形のユーザーデータベースで、「森や水場の消費移動力を2」、「山や城は99」としてみましょう。
できたら、主人公の初期位置も変更してみてテストプレイです。
いい感じですね。
山には完全に入れませんが、森や水場のなかならちょっとずつ進めるようになっています。
デバッグ:残移動力(CDB登録の値)を可視化する
※ここは理屈の説明と、続く「ユニットの移動」処理の下準備です。特にコモンの内容は掲載しませんし、実際に作る必要もないパートです。
さてさて、「┣指定座標にパネル表示」コモンのパネル種を増やして「残移動力」表示モードを作ってみます。
そして、「┃┗移動可範囲にパネル」での通常パネルの表示に続けて、「残移動力」モードでパネル表示コモンを続けて呼び出してみました。
数字の表示されていない範囲は、実際には「-1」です。主人公(ウルファールさん)の真下には、見えませんが基本移動力の「4」が出るはず。
主人公の足元に、主人公の基本(最大)移動力を登録して、隣り合う地形へ行く際に順次消費移動力を引いた値(残移動力)を足して、「0」になるまで周囲を探しているわけですね。「0」以上の数字が入っている範囲が、そのユニットが歩いていける範囲です(=パネルのある範囲)。
上記の移動力計算コモンで行っている内容を可視化するとこんなふうになるのですね。
さて、次回予告になりますが、移動可能な範囲がわかったとして、実際に移動をするには「移動ルートを決める」処理が必要になってきます。
ダイクストラ法というものの応用になるらしいのですが、ざっくり図示するとこんな感じです。
青い丸を置いた地点に行きたい場合
- 青丸の地点から、周囲4マスでCDBの残移動力が最も大きいマスを検索
- 最も大きいマスを中心にして、またその周囲4マスで残移動力が最大のマスを検索
- これをくりかえして移動させたいユニットが居るマス(残移動力=基本移動力のマス)を探す
- 青丸からユニットまでたどってきたルート(緑の矢印)の逆順にユニットを移動させる
では続きは次回。