$gametemp.reserveCommonEvent(ID)
に付いて質問です。
上記のようなイベントを作りました。
コモンイベント100には「2」を表示するイベントが入っており、想定では
1
2
3
とメッセージが順に表示されるかと思ったのですが、実行してみると
1
3
2
となってしまいます。
こちらおそらくスクリプトのコマンドがげんいんだとおもうのですが何が原因かわかりますでしょうか。
また、コモンイベント100をスクリプトで呼び出したい場合それが可能なスクリプト等ございますでしょうか。
(100というのは固定ではなく実際には計算しているためスクリプトで呼び出したいです。)
スクリプト「$gametemp.reserveCommonEvent(ID)」について
- Plasma Dark
- 記事: 731
- 登録日時: 2020年2月08日(土) 02:29
- 連絡する:
Re: スクリプト「$gametemp.reserveCommonEvent(ID)」について
$gameTemp.reserveCommonEvent は、引数として渡したIDのコモンイベントを予約するための関数です。
コモンイベントを即座に実行するわけではありません。
コモンイベントを開始できる条件は状況次第ではありますが、マップ上の場合はマップが持つインタプリタ(イベント)が実行中だと開始できません。
rmmz_objects.js にある Game_Interpreter.prototype.command117 が、イベントコマンドのコモンイベント呼び出しの処理に該当します。
この関数を参考にして、変数なりでコモンイベントIDを指定できるようなプラグインコマンドを作るのが手っ取り早いし、流石にこのくらい誰か作っているだろうと思いましたが、そうでもないんですね。
とりあえずさっと書いてみました。
https://github.com/elleonard/DarkPlasma ... onEvent.js
コモンイベントを即座に実行するわけではありません。
コモンイベントを開始できる条件は状況次第ではありますが、マップ上の場合はマップが持つインタプリタ(イベント)が実行中だと開始できません。
rmmz_objects.js にある Game_Interpreter.prototype.command117 が、イベントコマンドのコモンイベント呼び出しの処理に該当します。
この関数を参考にして、変数なりでコモンイベントIDを指定できるようなプラグインコマンドを作るのが手っ取り早いし、流石にこのくらい誰か作っているだろうと思いましたが、そうでもないんですね。
とりあえずさっと書いてみました。
https://github.com/elleonard/DarkPlasma ... onEvent.js
Re: スクリプト「$gametemp.reserveCommonEvent(ID)」について
まず「イベント」というものはインタプリタ(解釈器)を通して実行されます。
インタプリタとイベントは原則的に2つで1つであり、
イベントがインタプリタを占有している間は他のイベントを実行する事が出来ません。
イベントリストが楽譜、インタプリタは演奏者みたいな関係だと思ってください。
普段、何気なく利用しているイベントは$gameMapが持つインタプリタを使用しており
そのインタプリタはマップイベント34を実行中の為、使用不可能状態になっています。
reserve(予約)とはメインインタプリタが使用可能状態になり次第起動する、という意味です。
その為、マップイベント34の実行完了後にコモンイベント100が起動した、という流れになります。
デフォルトでの$gameTemp.reserveCommonEventの使用例は
アイテム/スキルの使用効果「コモンイベント」に限られる、
つまりイベント内では実行しないので基本的にこの影響を受けませんが
例えばイベントコマンド「メニュー画面を開く」でメニューを開き
コモンイベントが設定されたアイテム/スキルを実行すると間接的に同様の現象を確認する事が出来ます。
それを踏まえた上でイベントコマンド「コモンイベント」では
起動中のインタプリタの中にコモンイベント実行用の子インタプリタを新たに作成しています。
こうする事で「2つで1つ」の原則を守りつつ割り込み処理に移行する事を可能にしています。
コードにするならこんな感じですね。
このコード内に出てくるeventIdとは「セルフスイッチの操作」等
一部のイベントコマンドの為に起動マップイベントIDを記憶しているだけなので気にしないで良いです。
インタプリタとイベントは原則的に2つで1つであり、
イベントがインタプリタを占有している間は他のイベントを実行する事が出来ません。
イベントリストが楽譜、インタプリタは演奏者みたいな関係だと思ってください。
普段、何気なく利用しているイベントは$gameMapが持つインタプリタを使用しており
そのインタプリタはマップイベント34を実行中の為、使用不可能状態になっています。
reserve(予約)とはメインインタプリタが使用可能状態になり次第起動する、という意味です。
その為、マップイベント34の実行完了後にコモンイベント100が起動した、という流れになります。
デフォルトでの$gameTemp.reserveCommonEventの使用例は
アイテム/スキルの使用効果「コモンイベント」に限られる、
つまりイベント内では実行しないので基本的にこの影響を受けませんが
例えばイベントコマンド「メニュー画面を開く」でメニューを開き
コモンイベントが設定されたアイテム/スキルを実行すると間接的に同様の現象を確認する事が出来ます。
それを踏まえた上でイベントコマンド「コモンイベント」では
起動中のインタプリタの中にコモンイベント実行用の子インタプリタを新たに作成しています。
こうする事で「2つで1つ」の原則を守りつつ割り込み処理に移行する事を可能にしています。
コードにするならこんな感じですね。
コード: 全て選択
// コモンイベント100番を取得
const commonEvent = $dataCommonEvents[100];
const eventId = this.isOnCurrentMap() ? this._eventId : 0;
// 取得したコモンイベントのリストを基に子インタプリタのセットアップ
this.setupChild(commonEvent.list, eventId);
一部のイベントコマンドの為に起動マップイベントIDを記憶しているだけなので気にしないで良いです。
Re: スクリプト「$gametemp.reserveCommonEvent(ID)」について
お二方、ありがとうございます。
お、思ったより複雑でした……
違うスクリプトですぐ完了するものかと思ったのですが結構根が深い問題だったのですね!
お二方からいただきました方法を使って対応しようと思います、ありがとうございます!
お、思ったより複雑でした……
違うスクリプトですぐ完了するものかと思ったのですが結構根が深い問題だったのですね!
お二方からいただきました方法を使って対応しようと思います、ありがとうございます!