【解決済】一度だけ発生するイベントの作成方法

anman
記事: 9
登録日時: 2022年8月21日(日) 15:23

【解決済】一度だけ発生するイベントの作成方法

投稿記事by anman » 2022年9月13日(火) 00:36

お世話になります。

条件が達成された状態で1日経過すればイベントが一つだけ発生するという処理をしようとしています。
日数の経過はコモンイベントにて行っており、現在そこに無理やりイベント処理を詰め込んでいる状態です。
ただ、あまりにも一つのコモンイベントに処理や条件式を詰め込みすぎて管理が難しくなっていき、また動作が重くなったりもしないか心配になって参りました。
実際、今のままでも理想通りの処理はできているのですが、もっとスマートな方法があればご教示願いたく思います。

以下、備考です。
・条件が複数達成されていても、1日1イベントのみ発生します。
・一度発生したイベントは再び発生しません。
・画像の様な処理をイベント1、イベント2、イベント3と延々続けます。

よろしくお願いいたします。
添付ファイル
event1.png
event2.png
最後に編集したユーザー anman on 2022年9月16日(金) 07:29 [ 編集 1 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 一度だけ発生するイベントの作成方法

投稿記事by 名無し蛙 » 2022年9月14日(水) 00:15

こんな感じですかね。
用意するもの・・・起動フラグ格納変数1つ、起動済フラグ格納変数1つ

①起動フラグ、及び起動済みフラグを初期化する
-②③よりも先に一度だけ実行するならどこでも良いです
-また②③含めてstartVarId・endVarIdに任意の変数IDを指定してください

コード: 全て選択

const startVarId = 1, endVarId = 2;
$gameVariables.setValue(startVarId, {});
$gameVariables.setValue(endVarId, {});

②コモンイベントの起動条件を満たした時に起動フラグを立てる
-この時同時にいくつでも立てて良い

コード: 全て選択

const startVarId = 1;
$gameVariables.value(startVarId)[1] = true; // コモンイベント1を起動予約
$gameVariables.value(startVarId)[15] = true; // コモンイベント15を起動予約

③予約したイベントを一つだけ起動する
-一度起動したものは自動的に起動済みフラグが立ち、以降起動しません
-イベントIDが小さい方から順に実行されます

コード: 全て選択

const startVarId = 1, endVarId = 2;
const startHash = $gameVariables.value(startVarId);
const endHash = $gameVariables.value(endVarId);
const hitId = Object.keys(startHash).find(s => !endHash[s]);
if (hitId) {
    endHash[hitId] = true;
    const commonEvent = $dataCommonEvents[hitId];
    this.setupChild(commonEvent.list, this._eventId);
}

処理の流れ自体は似たような感じなんですけど
最大の利点は個別イベント×2必要なスイッチを削減出来る事ですかね。
また呼び出し先イベントの方に余計なコマンドを書く必要がないのでケアレスミスが減ります。
anman
記事: 9
登録日時: 2022年8月21日(日) 15:23

Re: 一度だけ発生するイベントの作成方法

投稿記事by anman » 2022年9月15日(木) 22:34

名無し蛙様

ご回答くださり誠にありがとうございます。
ウォッチリストに入れるのを失念しており、気づくのが遅れました申し訳ございません。

以前もお助け頂きましたが、今回もスクリプトをご提示頂きまして大変助かります。
早速、試して見たのですが、コモンイベントの先に条件を満たしたIDが大きい方を発生させた後、のちに条件を満たした小さいIDのイベントが発生しない状態となりました。
こちらが正しい動作なのかがわからない次第でございます。
お教え願えますと幸いです。

以上、よろしくお願い致します。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 一度だけ発生するイベントの作成方法

投稿記事by 名無し蛙 » 2022年9月16日(金) 00:16

anman さんが書きました:早速、試して見たのですが、コモンイベントの先に条件を満たしたIDが大きい方を発生させた後、のちに条件を満たした小さいIDのイベントが発生しない状態となりました。
こちらが正しい動作なのかがわからない次第でございます。

こちらで再現出来ませんね。正しくないと思います。
起動しない理由は起動フラグが立っていないか、起動済みフラグが立っているのどちらかだと思います。
試しにコード内にconsole.logを挿し込んでフラグの遷移を映したSSを撮ってもらっていいですか。
特に想定外の状況が起こっているものを。
情報コンソールはテストプレイ中にはF8で開きます。

コード: 全て選択

const startVarId = 1, endVarId = 2;
const startHash = $gameVariables.value(startVarId);
const endHash = $gameVariables.value(endVarId);
const hitId = Object.keys(startHash).find(s => !endHash[s]);
console.log($gameVariables.value(startVarId));
console.log($gameVariables.value(endVarId));
if (hitId) {
    console.log(`起動成功:${hitId}`);
    endHash[hitId] = true;
    const commonEvent = $dataCommonEvents[hitId];
    this.setupChild(commonEvent.list, this._eventId);
}

ツクマテチェック3.png

※情報量を増やす為に少し修正
anman
記事: 9
登録日時: 2022年8月21日(日) 15:23

Re: 一度だけ発生するイベントの作成方法

投稿記事by anman » 2022年9月16日(金) 00:57

名無し蛙様

ご返信ありがとうございます。
console.logのSSやその他添付致します。
[22][21][20]の順番で条件を満たしたのですが、[22]の条件のみを満たした状態でも[20]や[21]が真判定をしているように見受けられます。
こちらで何かわかりますでしょうか?
お手数をお掛けいたします。
添付ファイル
script2.png
script1.png
if.png
console.png
console.png (22.11 KiB) 閲覧数: 880 回
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: 一度だけ発生するイベントの作成方法

投稿記事by 名無し蛙 » 2022年9月16日(金) 01:39

anman さんが書きました:[22][21][20]の順番で条件を満たしたのですが、[22]の条件のみを満たした状態でも[20]や[21]が真判定をしているように見受けられます。

SSを見る限り20,21,22の起動予約フラグを立てて(script2.png)
20を実行し、21を実行し、22を実行して打ち止めになっているように見えます。(console.png)
つまりこちらの想定内の動作です。
22の起動フラグだけ立てた状態なのに20,21の起動フラグも連動して立ってしまう、
という記録を見せてもらって良いですか?

また呼び出し先イベントの仮数値という条件分岐が少し気になります。(if.png)
今回のギミックに関係ない処理はテスト時は極力削除してもらって良いですか?
anman
記事: 9
登録日時: 2022年8月21日(日) 15:23

Re: 一度だけ発生するイベントの作成方法

投稿記事by anman » 2022年9月16日(金) 07:23

名無し蛙様

申し訳ございません。起動条件を満たす=条件式を満たす事と勘違いしておりました。
少し考えればわかる事だっただけにお恥ずかしいです。
頂きましたスクリプトで完全に想定通りの動作する事を確認できました。
お陰様でかなりスッキリとしたイベントページになり、管理がとても楽になりそうです。

この度はご丁寧に対応いただきありがとうございました。

“MV:質問” へ戻る