最近ウディタの「変数操作+」コマンドにハマっていまして、これを使って試しにミニマップを表示させるコモンを作りました。今回はこのミニマップ表示コモンについて書きます。
ミニマップ表示コモンの仕様
- ミニマップには壁(=通行不能チップ)、主人公、マップイベントの3種類を表示する。
- 表示には記号を使い、文字列ピクチャで表示する。
- 通常変数「ミニマップ表示?(※ここでは通常変数5番とする)」が1のときに起動する並列実行イベントとして実行する。
完成イメージは次の図の通りです。
コモンイベントの内容
▼ ▼ 設定 ■変数操作: CSelf20[ピクチャ番号] = 2000 + 0 ■変数操作: CSelf21[マップ表示座標X] = 10 + 0 ■変数操作: CSelf22[マップ表示座標Y] = 10 + 0 ■変数操作: CSelf25[フォントサイズ] = 3 + 0 ■変数操作: CSelf26[改行間隔] = 0 + 0 ▼ ▼ データ取得 ■変数操作+: CSelf10[マップサイズX] = マップサイズ[横] ■変数操作+: CSelf11[マップサイズY] = マップサイズ[縦] ▼ ■ループ開始 |▼ 初期化 |■変数操作: CSelf12[現在X座標] = 0 + 0 |■変数操作: CSelf13[現在Y座標] = 0 + 0 |■変数操作: CSelf14[通行可能状態] = 0 + 0 |■文字列操作:CSelf5[マップ文字列] = "\f[\cself[25]]\space[\cself[26]]" |▼ |▼ 表示フラグがONのときだけ実行 |■条件分岐(変数): 【1】 V5[ミニマップ表示?] が 0 と同じ |-◇分岐: 【1】 [ V5[ミニマップ表示?] が 0 と同じ ]の場合↓ | |■ループ中断 | |■ |◇分岐終了◇ |▼ |▼ 主人公の座標取得 |■変数操作+: CSelf16[主人公X座標] = 主人公 の X座標(標準) |■変数操作+: CSelf17[主人公Y座標] = 主人公 の Y座標(標準) |▼ |▼ マップを捜査し、通行可能状態を取得 |■回数付きループ [ CSelf11[マップサイズY] ]回 | |■回数付きループ [ CSelf10[マップサイズX] ]回 | | |▼ | | |▼ 今の座標が主人公の座標と同じなら、主人公のマークを表示 | | |■条件分岐(変数): 【1】 CSelf12[現在X座標] が CSelf16[主人公X座標] と同じ | | |-◇分岐: 【1】 [ CSelf12[現在X座標] が CSelf16[主人公X座標] と同じ ]の場合↓ | | | |■条件分岐(変数): 【1】 CSelf13[現在Y座標] が CSelf17[主人公Y座標] と同じ | | | |-◇分岐: 【1】 [ CSelf13[現在Y座標] が CSelf17[主人公Y座標] と同じ ]の場合↓ | | | | |■文字列操作:CSelf5[マップ文字列] += "\c[3]■\c[0]" | | | | |▼ | | | | |●ラベル「スキップ」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>> | | | | |■ | | | |◇分岐終了◇ | | | |■ | | |◇分岐終了◇ | | |▼ | | |▼ Evがあるかどうかをチェック | | |■変数操作+: CSelf15[座標位置EvID] = X:CSelf12[現在X座標] Y:CSelf13[現在Y座標]のイベントID | | |▼ | | |■条件分岐(変数): 【1】 CSelf15[座標位置EvID] が -1 と同じ | | |-◇分岐: 【1】 [ CSelf15[座標位置EvID] が -1 と同じ ]の場合↓ | | | |▼ Evなしなら壁の有無をチェック | | | |■変数操作+: CSelf14[通行可能状態] = X:CSelf12[現在X座標] Y:CSelf13[現在Y座標]の通行判定:タイル(○=0,×=1) | | | |▼ | | | |■条件分岐(変数): 【1】 CSelf14[通行可能状態] が 0 と同じ 【2】 CSelf14[通行可能状態] が 1 と同じ | | | |-◇分岐: 【1】 [ CSelf14[通行可能状態] が 0 と同じ ]の場合↓ | | | | |■文字列操作:CSelf5[マップ文字列] += " " | | | | |■ | | | |-◇分岐: 【2】 [ CSelf14[通行可能状態] が 1 と同じ ]の場合↓ | | | | |■文字列操作:CSelf5[マップ文字列] += "■" | | | | |■ | | | |◇分岐終了◇ | | | |■ | | |-◇上記以外 | | | |▼ Evありならイベントマークを表示 | | | |■文字列操作:CSelf5[マップ文字列] += "\c[2]■\c[0]" | | | |■ | | |◇分岐終了◇ | | |▼ | | |●ラベル地点「スキップ」 <<<<<<<<<<<<<<<<<<<<<<<<★ | | |▼ | | |■変数操作: CSelf12[現在X座標] += 1 + 0 | | |■ | |◇ループここまで◇◇ | |▼ | |■文字列操作:CSelf5[マップ文字列] += "\n" | |▼ | |■変数操作: CSelf12[現在X座標] = 0 + 0 | |■変数操作: CSelf13[現在Y座標] += 1 + 0 | |■ |◇ループここまで◇◇ |▼ |■ピクチャ表示:CSelf20[ピクチャ番号] [左上]文字列[\cself[5]] X:CSelf21[マップ表示座標X] Y:CSelf22[マップ表示座標Y] / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100] |▼ |■ウェイト:1 フレーム |■ ◇ループここまで◇◇ ▼ ▼ 終了 ■ピクチャ消去:CSelf20[ピクチャ番号] / 0(0)フレーム ▼
今回のコモンではマップを1マスずつ見ていき、その内容に応じて記号を表示するというような流れになっています。
このコモンの問題点
今回のコモンではマップの一部だけ表示する機能がないので、次のような問題があります。
- マップが大きくなるとミニマップが画面を占めて邪魔になってしまう。
- マップが大きくなると処理が重くなる。
また、他にもこんな問題があります。
- 透明なイベントなど、表示する必要のないイベントも表示してしまう。
- 記号だけで表現しているので見た目がショボい。
ちなみに…
ウディタ作者のSmokingWOLF氏はミニマップについて次のようにおっしゃっています。
【ウディタでミニマップ】 ウディタのミニマップはアイコン(i[XX])を繋げて文字列ピクチャとして作るといいですよ! 片道勇者のミニマップは、縦1列にアイコンを連結した短冊みたいピクチャを入れたり消したりして表示しています(ただし量が増えるとやっぱりちょっと重いです)
— SmokingWOLF@片道勇者2作る! (@WO_LF) February 21, 2015
なるほど…アイコンをつなげるという発想はなかったので面白いなと思いました。これなら文字列ピクチャで表示してもショボい見た目問題が簡単に解決しそうです。