入門者向けの「自動実行と並列処理」についての記事は下記にあります。
自動実行と並列処理の違いまとめ
この記事は、複数の自動実行、並列処理、ループ、ラベルジャンプを実行すると、どのように動作するのか仕様を調査したものです。
目次
フリーズ判定
RPGツクールMZ・MVでは「Game_Interpreter.prototype.checkFreeze」で10万回イベントが繰り返すとフリーズしたと判定する処理があります。
下記のファイル内に記述があります。
- rpg_objects.js
- rmmz_objects.js
全体を通して、注意点まとめ
- 自動実行は1つずつ動作が完了する前提で作りましょう。
- 並列処理はウェイトを入れることで、より精細な制御が可能です。
- ループ(及びラベルによる繰り返し)は必ず『ループの中断』や『ラベルジャンプ』と一緒に使いましょう。
ループが完全に完了しないと、フリーズします(フリーズ前に、ツクールの上記 「Game_Interpreter.prototype.checkFreeze」 で、異常に重くなったまま落ちません)。 - 自動実行と並列処理のイベントでは、明確な停止処理がされるまでイベント全体が繰り返し実行されます。
このため、この中で「ループ」「ラベルジャンプ」を使用した繰り返し処理を入れる必要性が低く、使い方を間違えるとバグが発生しやすいため、注意が必要です。
自動実行と並列処理の複数の処理
自動実行と並列処理を2つずつ作成しました。
イベント名の番号はイベントIDです。
より厳密に動作順序を確認するため、「スクリプト」の「console.log」を使用して、動作順序を確認しました。
実行順
イベント内容の実行順序は「自動実行」が先に行われ、「並列処理」がその後に行われます。
また、同じトリガー同士であれば、イベントIDの順で実行されているようです。
自動実行1の処理が全て終わってから、自動実行3の処理がされ、その後に並列処理が行われています。
- 自動実行1-1
- 自動実行1-2
- 自動実行3-1
- 自動実行3-2
- 並行処理2-1
- 並行処理2-2
- 並行処理4-1
- 並行処理4-2
- 最初に戻る…
なお、自動実行中でも、イベントの「自律移動」は動作します。
(ランダムのみ確認)
ウェイトを入れた場合
2000では、並列処理の実行順がYADOTで解説されています。
yado.tk/2k/01_shoshin/008_jidou_heiretu/
イベントの間に「ウェイト:1フレーム」を入れると、実行順序が変わります。
- 自動実行3が実行されません。
- ウェイトがあるタイミングで、別の並列処理がされています。
実行順
- 自動実行1-1
- ウェイト
- 並行処理2-1
- ウェイト
- 並行処理4-1
- ウェイト
- 自動実行1-2
- 自動実行1-1
- ウェイト
- 並行処理2-2
- 並行処理4-2
- 自動実行1-2
- 最初に戻る…
なお、自動実行中でも、イベントの「自律移動」は動作します。
注意点
これらから、考えられる注意点は下記になります。
- 自動実行を複数同時に動作させると、想定外の事が起こりやすい。
- 並列処理は、ウェイトのタイミングで次の並列処理が実行され、一周すると続きを実行する。
コマンド(ループ、ラベル)
自動実行や並列処理と似たように繰り返し処理ができるイベントコマンドです。
基本的な使用方法については公式の初心者講座に書いてあります。
tkool.jp/mv/guide/006_008c.html
ここでは、イベントで繰り返し処理を行った時に、他の自動実行や並列処理への影響を確認します。
ループ(ウェイトなし)
ループ中は並列処理が動いていません。
また、ゲーム画面が急激に重くなり、ウィンドウを閉じるだけでも時間がかかります。
ループ(ウェイトあり)
ウェイトを入れると、動作が軽くなり、動作内容は下記になりました。
- プレイヤーの操作ができない。
(イベント実行中はプレイヤーが操作できないのは全体的な仕様です。) - ウェイトのタイミングで並列処理に動作が移っている。
ループを止める方法
ループを止めるには、いくつかの方法があります。
- 「ループの中断」コマンドを使用する。
- 「イベント処理の中断」コマンドを使用する。
- ラベル(後述)でループの外へ出る。
下記では、一見止まりそうな気がしますが、ループが完了せずに、例外的な動作をします。
これは無限ループのバグが発生します。
- ループ内で「イベントの一時消去」コマンドを使用する。
- ループ内で、スイッチ操作等で、出現条件を変更し別ページに切り替える。
画面上ではイベントが消え、ループが終わったかのように見えますが、ループの処理が続いたままで、自動実行イベントも動作が始まります。
この状態になると、動作が異常に重くなります。
必ずループ外に出すか、中断する処理をしましょう。
ラベル・ラベルジャンプ
RPGツクール2000の仕様は下記にあります。
yado.tk/2k/03_ibekoma/810_label/
yado.tk/2k/03_ibekoma/820_label_tobu/
MZで異なるのは、番号ではなく自由な文字列を指定できることです。
また、おそらく数の上限もありません。
(100個以上使える利点は感じませんが…)
MZでも2000同様に、別イベントのラベルにジャンプすることは出来ないようです。
(複数のコモンイベントでのジャンプは未調査)
ラベルを使用すると、イベントの途中で下記のようなことが可能です。
- 途中処理を飛ばす
- イベントの前の処理に戻る
こちらを覚えると、「ループ」コマンドの必要性は感じないかも知れません。
ループをラベルと比較した場合、ループはラベル名の管理が要らない事が利点と考えられます。
ラベルジャンプによる繰り返し処理は、ループと同じ仕様と考えて良さそうです。
注意点も同じです。
繰り返し中にウェイトを入れると、
- プレイヤーの操作ができない。
(イベント実行中はプレイヤーが操作できないのは全体的な仕様です。) - ウェイトのタイミングで別の並列処理に動作が移る。
繰り返しを終える時には、必ず繰り返しから外れる処理を行いましょう。
下記では繰り返しを完了できないので注意しましょう。
- 繰り返し内で「イベントの一時消去」コマンドを使用する。
- 繰り返し内で、スイッチ操作等で、出現条件を変更し別ページに切り替える。

コメントを投稿するにはログインしてください。