イベントの処理
RPGツクール2000(以下「ツクール」)のイベントの処理手順を、テスト用にイベントを作って検証いたしました。バイナリデータを解析したわけではございませんので、推測が多分に含まれます。どうかご了承ください。
これらの手順は、RPGツクール2003でも恐らく同様だと思います。
なお、以下の処理手順を利用した(依存した)イベントは、修正の難しい欠陥を生む恐れがございますので、乱用は避けられますようお勧めいたします。
※計測・テスト用のイベントは、省略いたしました。
このページで使う用語・略記
- イベントID (ID)
- イベントに連番で割り振られた整数のID。マップイベントでは通常、作成した順番に番号が振られ、エディタで確認可能。コモンイベントは1~5000の任意のIDに割り振ることが可能。
- フレーム (f)
- ツクールの内部ループ単位。1/60秒。ツクールは1fに10000stepまでイベントを処理しようとする。
- step
- ツクールのイベント最小処理単位。実際にかかる時間とは関係がないため、フレームいっぱい処理しようとすると、負荷が大きくなる。
- マップ自動
- マップイベントで、開始条件が「自動的に開始する」のものを略記したもの。
- マップ並列
- マップイベントで、開始条件が「定期的に並列処理する」のものを略記したもの。
- コモン自動
- コモンイベントで、開始条件が「自動的に開始する」のものを略記したもの。
- コモン並列
- コモンイベントで、開始条件が「定期的に並列処理する」のものを略記したもの。
- イベント接触
- 開始条件が「イベントから触れたとき」のものを略記したもの。
- 主人公接触
- 開始条件が「主人公から触れたとき」のものを略記したもの。
- 決定押下
- 開始条件が「決定キーを押したとき」のものを略記したもの。
処理の流れ
1f毎に以下の動作を繰り返します。
- 実行済みのイベントを未実行状態にする。
- 出現条件と開始条件を満たすマップイベントを実行可能にする。
- 10000stepが経過するまで以下を繰り返す。
- 実行するイベントを、ウェイト中でないものの中から、以下の優先順位でひとつ探す。
- 実行中のイベント。
- 実行可能なマップ自動で、もっともIDの小さい かつ 未実行のイベント。※
- 実行可能 かつ 未実行のマップ並列の中で、もっともIDが小さいイベント。※※
- 出現条件を満たすコモン自動で、もっともIDの小さい かつ 未実行のイベント。※
- 出現条件を満たす かつ 未実行のコモン並列の中で、もっともIDの小さいイベント。※※
- 実行可能 かつ 未実行のイベント接触のなかで、もっともIDの小さいイベント。
- 実行可能 かつ 未実行の主人公接触のなかで、もっともIDの小さいイベント。
- 実行可能 かつ 未実行の決定押下のなかで、もっともIDの小さいイベント。
- コマンドをひとつ処理する。
- 実行中のイベントのコマンドをすべて処理したら、そのイベントは実行済みとする。
- 実行するイベントを、ウェイト中でないものの中から、以下の優先順位でひとつ探す。
フレーム単位の処理
ツクールでは、1/60秒毎にイベントなどが処理されます。これは、多くのゲームプログラムと共通で、以下のような理由があると思われます。
- ディスプレイ画面の描画と、描画する画像データの転送のタイミングをあわせる。
- 1f毎の時間を一定にする事で、正確で均一な時間制御を行う。
- そのままでは無駄に繰り返される(出力されることのない)処理を、1f毎までに間引きすることで、負荷を抑える。
1回の処理単位は、一般にフレームと呼ばれ、この文書でもそれに倣っております。
自動開始, 並列処理のように、条件さえ満たせば延々と実行されるイベントの合間に1/60秒の間が発生するのは、恐らくこのためです。わざわざイベントのあとにウェイトが実行されているのではなく、実行プログラムの処理の結果起こったことであると推測します。
イベントが実行可能になるタイミング
出現条件と開始条件を満たしたイベントは実行可能状態になります。 しかし、マップイベントとコモンイベントではそのタイミングが異なります。
マップイベントは、次のフレームになるまで実行可能にはなりません。 これに対して、コモンイベントは同一フレーム内で実行可能になります。
このため、上記のリストでは、マップベントとコモンイベントの選択条件の表記を、区別いたしました。
1フレームのstep数
用語でも説明いたしましたように、1f毎に、最大10000stepのイベントが処理されます。
しかし、step数は実際の処理にかかる時間とは関係がないため、1step = 1/10000f = 1/600000秒とはなりません。 そのため、1fの処理にかかる時間が1/60秒を超えたとき(概算)、処理落ちが発生します。
また、それでも経過したフレームだけのstep数のコマンドを処理させようとするため、動きがぎこちないものになってしまいます。 変数の操作などの負荷が小さいコマンドでも、10000step/fの処理には耐えられません。 画像の表示のような負荷の大きいコマンドでは、フリーズ同然になってしまいます。
ウェイト
ウェイトは、実行中のイベントを停止させ、指定した時間が経過した後、そのイベントを再開させます。
ウェイト0.0秒を処理すると、そのイベントを一時停止します。 次のフレームでは、すでに0秒経過しているので、イベントを再開します。 そのため、ウェイト0.0秒は 1f = 1/60秒 の一時停止となります。
イベントID
同一条件のイベントは、IDの小さいものから昇順に実行されます。 このため、実行中のイベントよりもIDの小さいイベントが実行可能になっても、次のフレームまで実行されないことになります。
自動開始イベントの実行条件
同一のフレーム中に複数の自動開始イベントが同時に実行可能になっても、マップ/コモンイベントのなかでそれぞれ、もっともIDの小さいものしか実行されません。
また、次のフレームではもう一度IDの小さいものから評価されるため、そのイベントが実行可能でありつづける限り、次にIDの小さいイベントが実行されないということになります。
ただし、そのイベントが出現条件を満たさなくなったときにほかの実行可能な自動イベントが存在した場合、そのまま同一のフレームで次の実行可能なイベントが実行されます。
並列処理イベントの実行条件
自動開始イベントと違い、並列処理イベントは実行可能なイベントすべてを実行しようとします。
この場合も自動開始イベントと同様に、IDの小さいものから順にひとつずつ処理されます。
Copyright
Copyright © aeris 2001/2008, Some rights reserved.
このサイトの全ての内容は、日本の著作権法、及び国際条約に保護されています。
Copyleft -- aeris 2001/2010, All rights reversed.
管理者が作成したもののうち特に明記されていないものについては、
- GNU
- CCPL-jp by-sa
のいずれかのCopyleftライセンスの元で公開されます。