SparePages

ツクール2000→ウディタ→ツクールMV・MZと乗り換えてのゲーム制作とかの備忘録

wp20210924n

ツクールMZで自作エンカウントとかの「1歩歩くごとに実行するイベント」を作るためのメモ

 

経緯

最新作「ヤメタイン」では自作戦闘(※)を組んでいる関係でエンカウントも自作エンカウントにする必要がありました。
(※ツクールのデフォルト戦闘を使用するのではなく、イベントやピクチャ、時にはキャラチップを駆使して自作で戦闘システムを作ること。プラグインを導入してデフォルト戦闘を変更するのとは別物。恐らくMV・MZでは非主流の手法……)

(参考)
YADOT 自作戦闘とは?
http://yado.tk/2k/13_jisen/001_kiso/

試行錯誤1

初めに、ツクール2000時代の組み方で試してみたのですがうまく行かず。。
①並列処理イベントを作成
②「プレイヤーの画面座標」を取得
③「プレイヤーの画面座標(移動前)」と比較して、変化があればエンカウント判定
→プレイヤーの移動中にエンカウント処理が行われてしまう。
(本当は移動後にエンカウント処理を行って欲しい。ツクール2000の時は出来たのに。プレイヤーの画面座標が移動中に既に移動先のものに置き換わっている?)

試行錯誤2

・ならばと上記処理に、「移動中の場合はループ」するを追加。
・ループの結果、動作が重くなってしまったので、ループの中にウェイトも追加
→移動後にエンカウント処理するようになった。…が、今度は移動直後にNPCに話しかけたりすると、NPCのイベント中にエンカウント処理が割り込んでしまうという不都合が発生。
(頻度は高くないものの、通しプレイ中にかなり気になってしまったのでNG。「まあそんな事もあります」で流せそうにはなかった)

試行錯誤3

・検索して調べた結果、「画面座標ではなく歩数で判定すると良い」という旨の情報を発見
→結果変わらず。
(私のイベントの組み方が悪いだけかも)

上記のような「並列処理で、プレイヤーの位置の変化を検知して、エンカウント判定」みたいな方式は諦めることにしました…。

試行錯誤4

・では逆に「プレイヤーが移動した後に実行されるイベント」とは何かと考える
→場所移動イベントのように、プレイヤー接触で開始されるエンカウントイベントを床に敷き詰めれば行けそう。しかし全ての床にエンカウントイベントを敷き詰めるのは現実的ではない。。

そのとき、ウディタのエンカウントイベントの作り方を思い出しました。
ウディタはイベントの接触範囲を1x1マスから広げることができます。
ツクールMZのプラグインでそのようなことが出来るものがあれば。。
wp20210924j

その結果見つけたのが下記のプラグイン&実装方法です。

 

【結論】「KMS_AreaEvent.js」を使う

【配布先】
Kamesoft
http://ytomy.sakura.ne.jp/

「KMS_AreaEvent.js」はイベント範囲拡張プラグインです。
イベントページ先頭の注釈に「<AreaEvent:WxH>」と入れておくと、このWxHまでイベントの範囲を拡張できます。

ウディタと違い、接触範囲は右下方向に広がっていきますが(ウディタはイベントを中心に拡張)、大きな問題ではありません。

試行錯誤5

wp20210924m
①「KMS_AreaEvent.js」を導入。
②フィールドマップ左上にエンカウント用のイベントを配置。
③トリガーを「プレイヤーから接触」に指定。
④イベントページ先頭の注釈に「<AreaEvent:WxH>」を記載。
⑤実行内容にエンカウント判定の処理を記載。
→プレイヤーの移動完了後にエンカウント処理をしてくれた!!

 

おわりに

ということで、「KMS_AreaEvent.js」によって、期待していた動作が実現できました。

・移動に応じて昼夜が変わる
・移動時に足音を鳴らす
といった処理も上記を使えば実現できます。
(まあ、これらはそれ専用のプラグインがありそうですが。というか後者は「FootstepSound.js」ですね)

もしかすると私が知らないだけで、世の中には「プレイヤーが1歩移動するごとに特定のイベントを呼び出すプラグイン」のようなものがすでにあるのかも知れません。

今回、このエンカウント処理に困って検索しても良い感じの情報が出てこなくて更に困って…という感じでしたので、同じようなことで困っている人用にここにメモとしてまとめておきます。

-ツクールMZ