前回、「移動力範囲の計算」という、非常にSRPGらしい処理をこなしました。ここまでくればあと一息。自由にユニットを動き回らせることができるようになります。
移動編が終わったら、行動(攻撃)パートです。
移動ルートの検索
なぜ検索が必要なのか
前回の処理で「そのユニットが移動可能な範囲」は計算ができました。
移動先の座標(目的地)がわかれば、「移動ルートの検索」なんて面倒なことはしないで目的地まで突っ走っていけそうなものです。キャラクターの動作指定にも任意のマスへ接近させる命令がありますし。
ところが、そうもいいかないのです。
こんな状態のとき、青い丸の場所へ移動したいとします。
下のように「赤い矢印のルート」と「緑の矢印のルート」があったとして、自然な移動は「緑の矢印のルート」ですよね。
通れない地形を「迂回」しているわけで、こうした自然な移動の見せ方を行うためにも「移動ルートの検索」が必要となります。
ルート検索の方法
実は前回記事の次回予告で、やることはすべて語ってしまいました。
上図の青い丸を置いた地点に行きたい場合、次のような処理を行います。
- 青丸の地点から、周囲4マスでCDBの残移動力が最も大きいマスを検索
- これをくりかえして移動させたいユニットが居るマス(残移動力=基本移動力のマス)を探す
- 青丸からユニットまでたどってきたルート(緑の矢印)の逆順にユニットを移動させる
「山」は移動不可(残移動力”-1″)なので、移動ルートとしては無視されるため、自動的に迂回してもらえるわけですね。
ルート検索も「指定のマスの周囲4マスを探していく処理」なので、移動処理計算の処理と部分部分が似ています。
チェックしたマスを移動するときに、その方向に対応するルートを文字列変数に記憶しておきます。
実際にユニットを移動させる時には、別のコモンが「動いた順と逆さにユニットを移動させる」ので、次のように工夫します。
- 採用した方向と逆の方向を記憶する
- リストへのルート追加は、すでにある文字列の先頭に追加文字が来るように
2468はテンキーの向きに対応した方向なので、2下、4左、6右、8上ですね。4方向のチェックもこの順番で行われるので、「右と左どちらに行っても同じケース」などは、この処理だと先にチェックされる左が優先されます。
とくにソースは載せませんが、デバッグ用に「┣マウスクリック検知&対応」も一時書き換えて、「主人公がいるマスをクリックしたとき、出発地(3,7)から目的地(3,9)で「┣■ルート検索」コモンを呼び出すようにしてみました。
結果はこう。
2行目がルート検索コモンからの返り値です。
4226は左下下右のことなので、うまく山を迂回して目的地に行ってくれることがわかります。
検索結果に沿ってユニットを動かす
ルート登録時にややこしい文字列変数の操作をせず、毎回ユニットの移動をさせてもよさそうなものです。
しかし、あとあとイベント演出などで決まったコースのユニットの移動命令を出すことも考えると、「移動ルートのリストを作る処理」と「リストをもらって実際にユニットを動かす処理」は分けておいた方がよいでしょう。
リスト通りに動かすだけなら簡単ですね。
リストの頭から1文字ずつ切り出して、対応方向に主人公を動かすだけ。
「┃┗リスト通りにユニットを移動」
■ループ開始
|■条件分岐(文字): 【1】 CSelf5[ルート内容]が “” と同じ
|-◇分岐: 【1】 [ CSelf5[ルート内容] “” と同じ ]の場合↓
| |■イベント処理中断
| |■
|◇分岐終了◇
|■文字列操作:CSelf6[切り出し受け] =<1文字切出> CSelf5[ルート内容] |■条件分岐(文字): 【1】 CSelf6[切り出し受け]が “2” と同じ 【2】 CSelf6[切り出し受け]が “4” と同じ 【3】 CSelf6[切り出し受け]が “6” と同じ 【4】 CSelf6[切り出し受け]が “8” と同じ
|-◇分岐: 【1】 [ CSelf6[切り出し受け] “2” と同じ ]の場合↓
| |■動作指定:[ウェイト] 主人公 / すり抜けON / 下
| |■
|-◇分岐: 【2】 [ CSelf6[切り出し受け] “4” と同じ ]の場合↓
| |■動作指定:[ウェイト] 主人公 / すり抜けON / 左
| |■
|-◇分岐: 【3】 [ CSelf6[切り出し受け] “6” と同じ ]の場合↓
| |■動作指定:[ウェイト] 主人公 / すり抜けON / 右
| |■
|-◇分岐: 【4】 [ CSelf6[切り出し受け] “8” と同じ ]の場合↓
| |■動作指定:[ウェイト] 主人公 / すり抜けON / 上
| |■
|◇分岐終了◇
|■
◇ループここまで◇◇
実際のユニット移動処理を作る
では、実際に主人公を好きな場所に歩いていけるようにしていきましょう。
ユニット操作の大枠を作る(仮)
「┣マウスクリック検知&対応」コモンをこんなふうにしてみましょう。
このコモンの呼び出し元である「★操作受付」からもクリック時の座標を入力してもらうようにしておきます。
■変数操作: Sys73:文・選択肢のマウス入力(1なら受付) = 1 + 0
▼
■変数操作+: CSelf10[左クリック] = マウス左クリック状態
■変数操作+: CSelf11[右クリック] = マウス右クリック状態
■条件分岐(変数): 【1】 CSelf10[左クリック] が 2 と同じ 【2】 CSelf11[右クリック] が 2 と同じ
-◇分岐: 【1】 [ CSelf10[左クリック] が 2 と同じ ]の場合↓
|■デバッグ文:左クリックした
|■条件分岐(変数): 【1】 CSelf0[ユニット] が 0 超
|-◇分岐: 【1】 [ CSelf0[ユニット] が 0 超 ]の場合↓
| |■デバッグ文:主人公がいるマスを左クリックした
| |■イベントの挿入[名]: [“┣■ユニット操作”] <コモンEv 17> / CSelf0[ユニット] / CSelf1[クリック座標X] / CSelf2[クリック座標Y] | |■
|◇分岐終了◇
|■
-◇分岐: 【2】 [ CSelf11[右クリック] が 2 と同じ ]の場合↓
|■デバッグ文:右クリックした
|■
◇分岐終了◇
そしてユニット(今は主人公のみ)の居るマスを左クリックしたら、「ユニット操作」用のコモンを呼び出します。
実際のユニット操作では、「攻撃」「移動」「待機」「アイテム」など、いろいろコマンドが出るはずですが、今は移動をするだけの仕組みとします。つまり、「┣■ユニット操作」コモンは今のところ、その下のコモン「┃┣移動先選択」コモンを呼び出すだけ。
ユニット操作中の「移動処理」部分を作る
「┃┣移動先選択」コモンの骨子はこんな感じ。まだ未完成です。
■変数操作: Sys73:文・選択肢のマウス入力(1なら受付) = 1 + 0
▼
■変数操作+: CSelf10[左クリック] = マウス左クリック状態
■変数操作+: CSelf11[右クリック] = マウス右クリック状態
■条件分岐(変数): 【1】 CSelf10[左クリック] が 2 と同じ 【2】 CSelf11[右クリック] が 2 と同じ
-◇分岐: 【1】 [ CSelf10[左クリック] が 2 と同じ ]の場合↓
|■デバッグ文:左クリックした
|■条件分岐(変数): 【1】 CSelf0[ユニット] が 0 超
|-◇分岐: 【1】 [ CSelf0[ユニット] が 0 超 ]の場合↓
| |■デバッグ文:主人公がいるマスを左クリックした
| |■イベントの挿入[名]: [“┣■ユニット操作”] <コモンEv 17> / CSelf0[ユニット] / CSelf1[クリック座標X] / CSelf2[クリック座標Y] | |■
|◇分岐終了◇
|■
-◇分岐: 【2】 [ CSelf11[右クリック] が 2 と同じ ]の場合↓
|■デバッグ文:右クリックした
|■
◇分岐終了◇
このコモン中のループで、あらためて選択中のマスにポインターを表示しつつ、有効な移動先の指示(左クリック)があるか、移動のキャンセル(右クリック)をされるかを待っています。
左右クリック時の処理の他、他にも細かなケアが必要を足していきましょう。
完成図がこれ。
ループ前の演出がなにげに重要です。
マウス操作の場合、特に一瞬前の無関係な処理でのクリックがひっかかりやすいです。新たな操作受付処理の直前にウェイトを少し置くとよいでしょう。
これでSRPG式の移動が完成です。