レビニアです! 今回作るのは「近づくと起動して離れると停止するコモン」よ。マップイベントの接触範囲に入ったら処理が実行、接触範囲から出ると処理が停止するようなコモンを作るという事ね。
近づくと起動するっていうのはウディタじゃ日常茶飯事な処理でしょうけど、接触範囲から離れた場合にも何かしら処理を行うっていうのはめずらしいかもしれないわね。
近づくと起動コモンを作成する
作成するコモンの仕様だけど、呼出元マップイベントの接触範囲の中にいるのか外にいるのか判別して、以下のように結果を返り値として呼出元イベントのセルフ変数に返すという形にするわ。
- 接触範囲外(停止)=0
- 接触範囲内(起動)=1
- 接触範囲内で既に起動している(起動済み)=2
起動時と停止時の処理をコモンに直接書くよりもこの方が、行わせたい処理を呼出元の方で指定できて便利だからね。
それじゃコモンを作っていくわ。
→コモンイベント作成:名前「〇近づくと起動」、起動条件「呼び出しのみ」
セルフ変数はこのように設定してね。4番は返り値として使うのよ。他は呼出元マップイベントや主人公の座標、接触範囲なんかの取得用ね。
ちなみに「どうやって呼出元マップイベントの接触範囲なんか取得するんだ」というと、実はものすごく簡単。
イベントコマンド「変数操作+」にそのものズバリな項目があるわ。主人公やマップイベントの座標が取得できることは知っているかもしれないけど、接触範囲はあまり知られていないかもしれないわね。
というわけで変数操作+で必要な情報を取得していくわ、主人公とマップイベントの座標、マップイベントの接触範囲を取得して、イベントと主人公の距離を算出するのよ。
→■変数操作+: CSelf30[接触範囲X] = このマップイベント の 接触範囲拡張X
→■変数操作+: CSelf31[接触範囲Y] = このマップイベント の 接触範囲拡張Y
→■変数操作+: CSelf32[呼出元X] = このマップイベント の X座標(精密)
→■変数操作+: CSelf33[呼出元Y] = このマップイベント の Y座標(精密)
→■変数操作+: CSelf34[主人公X] = 主人公 の X座標(精密)
→■変数操作+: CSelf35[主人公Y] = 主人公 の Y座標(精密)
→■変数操作: CSelf36[Evとの距離X] 絶対値= CSelf34[主人公X] – CSelf32[呼出元X]
→■変数操作: CSelf37[Evとの距離Y] 絶対値= CSelf35[主人公Y] – CSelf33[呼出元Y]
イベントとの距離と接触範囲が取得できれば、主人公が接触範囲の中にいるか外にいるかは解るわね。
算出した呼出元マップイベントとの距離と接触範囲とを条件分岐で比較して、範囲の外にいるかをチェック。もし接触範囲外なら返り値に「0(停止)」を返して処理中断させるわ。
→■条件分岐(変数): 【1】 CSelf36[Evとの距離X] が CSelf30[接触範囲X] 以上 【2】 CSelf37[Evとの距離Y] が CSelf31[接触範囲Y] 以上
→-◇分岐: 【1】 [ CSelf36[Evとの距離X] が CSelf30[接触範囲X] 以上 ]の場合↓
→|■変数操作: CSelf4[起動/停止] = 0 + 0
→|■イベント処理中断
→-◇分岐: 【2】 [ CSelf37[Evとの距離Y] が CSelf31[接触範囲Y] 以上 ]の場合↓
→|■変数操作: CSelf4[起動/停止] = 0 + 0
→|■イベント処理中断
→◇分岐終了◇
次だけど、「接触範囲外でなかった」ということは当然「範囲内にいる」ということよね。この下に記述するのは「接触範囲内に入った場合の処理」になるわ。
まずは「接触範囲に入ったばかりかすでに入って起動済みなのか」を条件分岐で判別するわ。
→■条件分岐(変数): 【1】 CSelf4[起動/停止] が 0 と同じ 【2】 CSelf4[起動/停止] が 1 以上
接触範囲に入ったばかりなら返り値に「1(起動」を、既に入って一度起動しているなら「2(起動済み)」を返す。こうしないと接触範囲内で動くたびに何度も起動し続けちゃうからね。
→◇分岐: 【1】 [ CSelf4[起動/停止] が 0 と同じ ]の場合↓
→■変数操作: CSelf4[起動/停止] = 1 + 0
→◇分岐: 【2】 [ CSelf4[起動/停止] が 1 以上 ]の場合↓
→■変数操作: CSelf4[起動/停止] = 2 + 0
→◇分岐終了◇
これでコモンの作成は完了。コメントを入れてもたった30行ほどの短いコモンだったわね。
近づくと起動コモンを試してみる
それじゃ作成したコモンをマップイベントから呼び出して試してみましょう。
起動条件は当然「プレイヤー接触」、接触範囲は「4」でテスト。起動停止させる処理はマップイベント側で自由に設定できるから、今回は「近づくと画面が暗く」「離れると元に戻る」「起動済みの場合は何もしない」ようにしてみましょうか。
→起動条件:プレイヤー接触
→接触範囲拡張:X4Y4
→■イベントの挿入[名]: このEvのセルフ変数0 = [“〇近づくと起動”] <コモンEv 260>
→■条件分岐(変数): 【1】 このEvのセルフ変数0 が 0 と同じ 【2】 このEvのセルフ変数0 が 1 と同じ 【3】 このEvのセルフ変数0 が 2 と同じ
→-◇分岐: 【1】 [ このEvのセルフ変数0 が 0 と同じ ]の場合↓
→|■色調変更: R100 G100 B100 / 0フレーム
→-◇分岐: 【2】 [ このEvのセルフ変数0 が 1 と同じ ]の場合↓
→|■色調変更: R25 G25 B25 / 0フレーム
→-◇分岐: 【3】 [ このEvのセルフ変数0 が 2 と同じ ]の場合↓
→|■
→◇分岐終了◇
※「プレイヤー接触」だとうまく動作しない場合があるようです。その場合は「イベント接触」でやってみてください。
※返り値をマップイベント側のセルフ変数に代入するのも忘れないでね。
ちなみにこのコモンだけど、実際の接触範囲と処理が起動停止する範囲が1マスだけずれてしまう(指定した接触範囲より1マス狭くなる)の。
だから今回は接触範囲を「4」に指定したけど、実際近づいて起動したり停止したりするのは「3マス」になるのよ(いろいろ試したけど接触範囲と同じにはできなかったわ……)。1マス大きく設定すればいいだけだし、大した実害はないとは思うけどね。
それじゃコモンのテストに入りましょう。作成したマップイベントに接近してみると、
「近づくと起動コモン」を活用してセーブポイントを作る
このコモンは前述の通り「呼出元マップイベント側で行わせたい処理を設定できる」から、画面エフェクト以外にもいろんな活用ができるわ。
一例として「セーブ不可マップにセーブ可能ポイントを作る」ということをやってみましょう。以前の解説では「セーブ禁止のマップイベントで取り囲む」なんていう雑な方法で実現させていたけど……、
「近づくと起動コモン」のおかげでマップイベント1つだけで済むようになるわ。
魔法陣の上(イベントの接触範囲内)ならセーブが可能になって、
範囲外に出ればまたセーブ不可に。以前と違ってとてもスマートな方法で実現できたわね。
※ゲーム設定(移動幅や当たり判定)によってはうまく動作しない場合があるわ。その場合は接触範囲を増やすなどして調整してみて頂戴。
他にも、以下のような活用方法もできるわね。いろいろ試してみると面白そう。
- モンスターシンボルに近づくと不穏な音楽が流れる、離れると元に戻る
- NPCに近づくと吹き出しでメッセージが表示、離れると消える
- ロウソクに近づくと画面が明るく、離れると元に戻す
「近づくと起動して離れると停止するコモン」の作成解説は以上よ。よければ活用して頂戴。
コメント
この発想はなく、すごく参考になりましたありがとうございます。
接触範囲がずれる様に感じるのは。
接触範囲の内周で範囲外になり、内周より内側で範囲内になるからで間違っていません
近づくとポップアップは、どの様に作っているか悩んでいたので助かりました。
ありがとうございます。
近づくとポップアップや吹き出しが表示されるっていうのはRPGツクールだとよく見かけるし、ウディタでもやってみたかったのがコモン作成の理由だった気がします。
応用というか利用の幅がある処理なので、いろいろと面白い使い方がありそうですよね。
セーブポイント以外にも、サブクエストの目印とか、ホラーゲームの演出とか、色々使えそうですね!
ちょっと試してみたところ、起動条件をプレイヤー接触にするとたまに停止されないことがあるのですが、イベント接触だとそこら辺も解消されました。
こちらのサイト様は凄く分かりやすい説明なのでありがたいです!
ありがとうございます。起動条件については追記させていただきました。
ウディタは「コモンを自分で作れるようになる」というところに高い壁があるツールなのだけど、作れるようになると一気にやれることも楽しさも増しますからね。
その辺り「難しいことをなるべく分かりやすく」を心掛け、助けになればとの思いで執筆しております。