【ウディタ講座】SRPGをつくろう! 敵全体の射程「危険範囲」の表示

過去の記事でユニット個々の移動・攻撃の範囲表示は実装できましたが、最近の気の利いたSRPGでは敵軍なら『敵軍の全ユニットの移動・攻撃の範囲』も見えるようになっています。

仮に「危険範囲」などと呼んで進めていきましょう。

MEMO

SRPG Studio(DLsiteへ)では環境設定内で「敵の行動範囲表示」と呼んでるものです。

まずは操作フローを整える

長押しコモンを用意する

1つのコモンで左右クリックが長押しされたか通常のクリックなのかを区別するなら、たとえばこんなコモンになります。

■変数操作: CSelf4[結果] = 0 + 0
■条件分岐(変数): 【1】 CSelf0[左0右1] が 0 と同じ 【2】 CSelf0[左0右1] が 1 と同じ
-◇分岐: 【1】 [ CSelf0[左0右1] が 0 と同じ ]の場合↓
|■変数操作+: CSelf10 = マウス左クリック状態
|■条件分岐(変数): 【1】 CSelf10 が 0 以外
|-◇分岐: 【1】 [ CSelf10 が 0 以外 ]の場合↓
| |■変数操作: CSelf4[結果] = 2 + 0
| |■回数付きループ [ 8 ]回
| | |■変数操作+: CSelf10 = マウス左クリック状態
| | |■条件分岐(変数): 【1】 CSelf10 が 1 以外
| | |-◇分岐: 【1】 [ CSelf10 が 1 以外 ]の場合↓
| | | |■イベント処理中断
| | | |■
| | |◇分岐終了◇
| | |■ウェイト:1 フレーム
| | |■
| |◇ループここまで◇◇
| |■変数操作: CSelf4[結果] = 3 + 0
| |■
|◇分岐終了◇
|■
-◇分岐: 【2】 [ CSelf0[左0右1] が 1 と同じ ]の場合↓
|■変数操作+: CSelf10 = マウス右クリック状態
|■条件分岐(変数): 【1】 CSelf10 が 0 以外
|-◇分岐: 【1】 [ CSelf10 が 0 以外 ]の場合↓
| |■変数操作: CSelf4[結果] = 2 + 0
| |■回数付きループ [ 8 ]回
| | |■変数操作+: CSelf10 = マウス右クリック状態
| | |■条件分岐(変数): 【1】 CSelf10 が 1 以外
| | |-◇分岐: 【1】 [ CSelf10 が 1 以外 ]の場合↓
| | | |■イベント処理中断
| | | |■
| | |◇分岐終了◇
| | |■ウェイト:1 フレーム
| | |■
| |◇ループここまで◇◇
| |■変数操作: CSelf4[結果] = 3 + 0
| |■
|◇分岐終了◇
|■
◇分岐終了◇

返り値の設定はよいように。

参考

【ウディタ講座】長押し判定とドラッグの作り方

マウス操作で表示/非表示を切り替える

「┣マウスクリック検知&対応」で、右クリックは「ユニットのステ―タス表示」か「メニュー呼び出し」でした。

長押し判定のコモンも足して「右クリックの長押しなら、危険範囲表示を切り替える」としましょう。

そして、マウスクリック検知コモンのなかで、右長押しのたびに「非表示」→「敵軍の範囲」→「友軍の範囲」→「敵軍と友軍の範囲」→「非表示」……とループするようにします。それから危険範囲表示のコモンを呼び出し、という流れ。

これはユニット操作関係でCDBに作った「多目的メモ」に項目を足して、その数値で表示状態を管理するとよさそうです。

存在しない勢力を含むケースは飛ばすようにすると、より利便性が上がりますね。

危険範囲表示を表示しっぱなしで操作していくケース

自軍のユニットを動かして、他のユニットの進路をさまたげたり、また別のユニットを倒したりすれば、当然、危険範囲表示もリアルタイムに毎回書き換わります。

ユニット操作コモンの終わりにでも表示の更新処理を呼び出すようにするとよいでしょう。

しかし、つまりこれは「全ユニットぶんの移動力計算を、1ユニット行動するたびにやりなおす」のに近い状況です。非常に重たい処理となりますので、あらかじめ細かな負荷軽減の工夫を行っていきましょう。

また、敵軍や友軍が行動するAI(COM)の行動ターンでは自動的に危険範囲表示をオフにするのが無難かと思います。

危険範囲表示のおおまかな理屈と実作

対象の勢力(所属/軍)の全ユニットの移動力計算を行う

生存者カウントの要領で、任意の勢力の生存ユニットすべてに「移動力計算」を行い、残移動力登録があったマスに対してフラグを立てます。

フラグを立てるのは、こんな感じの新設CDB。

最大50×50マスに対応する項目数・データ数で、すべて文字列変数です。

敵軍ユニットのフラグを登録する場合は文字列変数に「敵」、友軍なら「友」と入力していくわけですね。

たとえば危険範囲表示用のCDBの座標(5,6)に「友」とあれば、それは友軍の攻撃が及ぶマスということになります。「敵」と「友」の両方があれば、両勢力共通の攻撃可能範囲です。

MEMO

自軍の範囲フラグも立てることで、AIが「攻撃を受けないマスをたどって移動する」というような賢い挙動も作れるかもしれません。おそらく相当な処理負荷となりますが……

コモンにするとこんな感じ。

「■危険範囲表示」コモンを中心に、複数のコモンからできています。

「┣危険範囲用移動力計算」コモンは、移動力計算のコモンをコピーして不要な記述を削ったものです。

 

 

専用CDBに登録のある範囲にパネルをおく

ラスト、「┗危険範囲パネル表示」コモンの説明です。

対象勢力の計算が終わったら、ユニット個別の移動力表示の要領で、CDBをチェックしてパネルを置いていけばOKですね。ユニット個別のパネルと区別する意味で、通常パネルよりも下側に出るピクチャ番号を用いて、<SQUARE>による真四角なパネルを出すようにするとよいでしょう。

せっかく<SQUARE>でタイルサイズきっちりにパネルを置いていますので、「いまパネルを置こうとしているマス」の「ひとつ前のマス」でパネルが設置済の場合は、ひとつ前のマス用のパネルの縦拡大率を+100%することで、ピクチャ枚数を抑えることができるでしょう。

下記の記事でも「マス伸ばし」の方法として紹介した小技ですね。

【ウディタ講座】超低負荷ミニマップ

 

できあがり

 

 

【ウディタ講座】SRPGをつくろう! まとめ