ゲーム製作作業をやらないとすぐに忘れて効率悪すぎるので1日1回はやるキャンペーン中です。 今日はあらゆる作業ができる一週間でただ一度の贅沢な日だったんだけど、 ラジオの収録以外をゲーム製作作業にあてたらまあはかどることはかどること…。

今日でかなりのシステム面がいい感じに仕上がったので、あとはもうそのシステムに当てはめて外見を作っていくのみです。 遺跡の中のエンカウントは全部作り終えたし、Gルート中にステータス画面を開くと「KILLS」の項目が増えていて 1匹モンスターを倒すごとにちゃんと増えていくように作ったし、本当にスムーズです。

…あ、そうだ。喉元過ぎれば熱さを秒で忘れるタイプだから忘却していたんだが、 遺跡の中のエンカウントイベントを作っているときに謎現象が起こったのだった。 今までもウディタ特有の仕様に悩んで悩んで分かってそういう仕様なのねなるほどねと学習していっています。

意外と「プレイヤー接触」のイベントは発動までに隙がある、というのもDEMO版を公開した後に気付いたものです。 プレイヤー接触イベントとはその通り、プレイヤーがそのイベントに触れていれば起こるタイプのイベント。 ウディタではそのイベントの「接触範囲拡張」ということがX方向とY方向に分けて設定できるので 同じイベントをいくつも並べなくていいからとっても便利です。

その「プレイヤー接触」のイベントで、遺跡の中のエンカウントは作っていました。 接触範囲をめっちゃ拡張してマップ全体を覆わんばかりに広げ、その範囲内を歩く=エンカウント判定が行われる、という感じ。 もちろんそれを「並列実行(マップにいる間、他のイベントと並行して実行されるタイプのイベント)」にして 主人公の位置の座標を取得して他のイベントの妨げにならない位置にいればエンカウント判定、というように 「プレイヤー接触」を使わない方法だってありそうです…が、ウディタは「接触範囲拡張」が強みの一つだから使わせていただかねばなるまい。

確か、ウディタに入っているサンプルゲームでもプレイヤー接触イベントの接触範囲拡張をした範囲で モンスターとエンカウントするイベントが作成されていたような気がする。気のせいだったら申し訳ない。

で、まあエンカウントの処理はほとんどできていたんだけどたまに謎のエラーが起こるからなんでかな、 というのを調べるために画面内に大量の変数をリアルタイムで表示させてエンカウント判定に使っている数値が それぞれどのような動きをしているか、エンカウントするときにエンカウントする条件を満たす正しい数値になっているかを見ていました。

…すると、なんだか妙なことが起こったのである…。

遺跡の中でエンカウントするマップは決まっていて、お留守番後のキャンディが置いてある部屋の下や 穴から1回落ちて登って来ないといけない部屋など、ちらほらと存在させています。 その部屋それぞれでエンカウント判定のデバッグをしていたんだが、二つのマップだけなんかその数値の推移がおかしい。

エンカウントは1歩移動したら判定がなされるもの…だろう。とりあえずテラメリテールではそうです。1歩移動するごとにエンカウントするか判定。 歩数が溜まれば溜まるほどエンカウント率は上がっていき、バトルすると歩数は0に戻る、というようなことになっています。 だが、なぜか二つのマップでだけ1歩で2回の処理が起きている事に気付いたのです。

どうせ自分のせいだろ?エンカウント処理の中でループの回数とかが間違ってて2回同じことしちゃってるだけとかだろ、と思ったんだが… 1歩で1回処理が起きているマップからそのイベントをコピって持ってきて、1歩で2回処理が起こるマップで動作させてみると 1歩で2回処理が起こる。歩数が2倍の速さで溜まってしまうのである。単純に考えて、エンカウント率が2倍だ。

そのマップの何がいけないんだ、とエンカウントイベントを縮めてみた(接触範囲拡張の数値を下げて範囲を狭くした)。 すると、1歩で1回になった。おっ、直った…?接触範囲が広いと1歩で2回処理が起こるの…??

もっともっとイベントを縮めてみた。1歩で1回。じゃあ元の位置に戻して元の接触範囲にしてみた。1歩で2回になった。なんでだ。

だがこれにより、1歩で2回になるのは自分が使いたい接触拡張範囲か、イベントを置きたい位置のせいだということが分かった。 今度は接触拡張範囲をそのままに、イベントの位置をずらしてみた。たまに1歩に1回になる。この違いは何だっていうんだ…?!

最初の1歩で2回の処理が起きていることに気付いたのは、左から来て穴に落ちて下の段から上に戻ってきて右に進む、 絶対に1回は穴に落ちないと進めないエリア。ここは、穴に落ちている間に通る部分はマップチップはなくて真っ暗です。 主人公の動きとしては、穴に乗ると半透明になって壁をすり抜ける状態になって方向も固定されて下に何マス移動する、 というプログラムになっています。つまりそのエリアは上半分と下半分に分かれている縦に長めのエリアで、 マップ中央部分は真っ暗なのです。

かなりかなりあれこれ試行錯誤した結果、もしかしてと気づいた。エンカウント判定の「プレイヤー接触」のイベントが 「置かれている位置」に事件のカギが隠されている。「接触拡張範囲」の変更によりめっちゃ広がっているそのエンカウント判定のイベントだが、 そのイベントを移動させるのにクリックするのは中央の1マス部分のみ。それが置かれている部分のマップチップを1マスだけ、床にしたらどうなる…?

直った。1歩で1回の処理になった。な、な、なんだそりゃ…??


ご覧下さい、こちらは遺跡の中のエンカウントが起こる一部屋です。ここでも1歩で2回処理が起こっていました。 エンカウント判定のイベントは画面中央、赤い下向き矢印が付いている「EV」のマスですが、 「接触拡張範囲」の変更によりその1マスを中心にとっても大きく赤い線が四角く広がっています。

その赤い線の内側を歩くと中央に置かれている「EV」の内容のイベントを等しく起こせるのです。 …だが、この状態ではその範囲内を1歩移動するとイベントに2回触れた扱いになり、 処理が2回起きてしまっていました。長きにわたる検証の末、イベントを置く位置に問題があると分かり…。


このように変更するだけで処理は1回になります。上の画像と何が違うのか? パっと見分かりにくいですが、中央にあるエンカウントのイベントの「接触拡張範囲」の サイズはそのままに、1マスだけ下にずらしてあるのです。

上の画像との違い、それは「プレイヤー接触」のイベントが壁の中にあるか否かということ。 壁というか、通行不可能なマップチップ上にあるか、ということ。通行可能なマップチップ(床など)の 上にイベントが置かれていたら、触れた際に起きる処理は1歩で1回になります。

……。

………。

…なんでやねん。

「プレイヤー接触」タイプのイベントが壁の中にあると、触れた際の処理が2回行われる。 試しに試してやっとたどり着いた結論ですが、真剣に謎です。 そうする必要があるのだろうか。それとも、そうなってしまうものなのだろうか。 あえてそのようになっているのだろうか。もう解決したからいいけど、謎だ…。

何度も言っているが、無料でソフトを使わせていただいているのだから意見する権利などありません。 そのソフトの仕様の中で、その範囲内で、ソフトをありがたく使わせていただく。 黙って使わせていただく。それこそが自分のすべきこと…!

…というわけで、意外なところからまた一つウディタの「プレイヤー接触」イベントの仕様を知ったのでした。 これでもう同じことが起きても悩まなくて済むぞ。

そのエンカウント判定が完成してから、やっと雪道で戦うモンスターとのバトルを作り始めました。 とは言っても雪道で会う一般モンスターって結構少ないのでザコエンカはすぐに作り終えそうです。


今日作った敵がコレ。こんな低クオリティならすぐ作り終えるわな…。 ルビサファのうろ覚え企画やってたはずなのに、結局BWでまかなうっていう…!
2021年10月21日


◆目次に戻る◆






inserted by FC2 system