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