ツクールでは、プレイヤーやイベントが移動したとき、1ドットでも次のマスに入ればその移動後の座標が与えられる。
この仕様のせいで困ることはそうそうない。しかし、たまに気になる。
たとえば、自律移動しているイベントが指定位置に来たら特定のスイッチをONに切り替えるギミックを使うとき。イベントコマンドの[移動ルートの設定]であれば[完了までウェイト]を使えるが、自律移動だとそうはいかない。
イベントの移動速度を遅くして見てみるとはっきりわかるが、対象のイベントが指定位置に移動しきっていないのにスイッチがONになってしまう。移動し始めてすぐ、移動後のマスの座標を取得してしまうからだ。
そこで今回は、イベントの移動が完全に終わってから座標を取得する方法を紹介する。
イベント全体図
例として、ID1のイベントの座標を取得するイベントを組んでみる。
トリガー:並列処理
◆条件分岐:スクリプト:$gameMap.event(1).isStopping() ◆変数の操作:#0001 x = EV001のマップX ◆変数の操作:#0002 y = EV001のマップY ◆ :分岐終了
イベント詳細
イベントの座標を監視するには、並列処理でイベントのマップXとマップYを変数に代入していけばいい。
[変数の操作]のオペランドから[ゲームデータ]を選び、イベントID1のマップXとマップYを変数1と変数2にそれぞれ代入しよう。
◆変数の操作:#0001 x = EV001のマップX ◆変数の操作:#0002 y = EV001のマップY
これだけだと、通常の座標監視だ。イベントが移動し始めた瞬間に座標の取得が行われてしまう。そこで以下のスクリプトを使う。
$gameMap.event(イベントID).isStopping()
$gameMap.event(イベントID).isStopping()は、対象のイベントが止まっているかどうかを判別できるスクリプトだ。イベントIDで指定したイベントが停止中ならtrue、移動中ならfalseが返ってくる。
ちなみに、プレイヤーの動きを判別したい場合は、
$gamePlayer.isStopping()
となる。
今回の監視対象イベントはIDが1なので、$gameMap.event(1).isStopping()と入力しよう。
このスクリプトを条件分岐に組み込むと、イベントが止まったとき、すなわちイベントの移動が完了したあとに座標の取得が行われるようになる。
◆条件分岐:スクリプト:$gameMap.event(1).isStopping() ◆変数の操作:#0001 x = EV001のマップX ◆変数の操作:#0002 y = EV001のマップY ◆ :分岐終了
連続で移動していたら止まる瞬間なんてないのでは? と思うかもしれない。実のところ、イベントは1マスごとに移動と停止を繰り返している。1マス移動するたび、ほんの一瞬だけ停止しているのだ。
注意点
イベントの実行内容に[ウェイト]を1フレームでも入れると、イベント停止の瞬間が見過ごされてしまい、$gameMap.event(イベントID).isStopping()の条件を満たさなくなる。座標監視イベントには[ウェイト]を入れず、必ず毎フレーム実行させよう。
また、座標を監視するイベントのIDは、監視対象イベントのIDよりも大きいことが望ましい。イベントはIDの小さい順に実行されるからだ。
イベントが指定座標に来たらそのイベントの移動を止めたい場合、座標監視イベントのIDのほうが小さいと、すぐに止まってくれない。余計に1歩進んでから停止する。
以上。よいツクールライフを!
コメント