ページ 11

【解決済み】マップイベントにオブジェクトを持たせ、他のイベントからアクセスしたい

Posted: 2023年9月22日(金) 17:50
by みよき
セルフ変数プラグインを自分で作ろうとしているのですが詰まってしまったためご助言をお願いしたいです。

コード: 全て選択

(function () {
    var _Game_Interpreter_prototype_clear = Game_Interpreter.prototype.clear;
    Game_Interpreter.prototype.clear = function () {
        _Game_Interpreter_prototype_clear.call(this);
        this.selfVariable = {};
    };
})();
このプラグインを導入しマップイベント内のスクリプトで

コード: 全て選択

this.selfVariable.x = 0 ;
のように書くことでプロパティを追加できる……という所までは分かったのですが。
マップイベントから呼び出したコモンイベント内で同じことができないのと、他のマップイベントからアクセスする方法が分かりません。

コモンイベントは呼び出し元からイベントIDを貰っているようなのでイベントIDの情報から対象のオブジェクトに触れれば解決できると思うのですがマップイベント内スクリプトのthisが何を指しているのかもいまいち分かっていない有様なのでどうすればいいか分からず……。

よろしくお願いします。

Re: マップイベントにオブジェクトを持たせ、他のイベントからアクセスしたい

Posted: 2023年9月22日(金) 18:50
by くろうど
RPGMZ_MapEvent.png
簡単な図を描いてみました。

おそらく、「やりたいこと」は上図の「ここにセルフ変数を追加する?」部分だと思います。

ですが、現在のコードでは Game_Interpreter の中に追加しています。
オブジェクト指向プログラミング的に考えて、
「マップイベントにオブジェクトを持たせる」を素直に考えた方が良いかなと思います。

Game_Event には $gameMap.event(eventId) でアクセスできますので、
$gameMap.event(eventId).セルフ変数 で作成したセルフ変数にアクセスできるかと思います。

尚、この例の場合は別マップに移動するとデータが破棄されるかな……と思いますので、それが困る場合は、通常のセルフスイッチのような作りにする方が良いかもしれません。

補足:MZのコアスクリプトを見て書きましたので、MVと異なる点があるかもしれません。

Re: マップイベントにオブジェクトを持たせ、他のイベントからアクセスしたい

Posted: 2023年9月22日(金) 19:11
by みよき
迅速な返信ありがとうございます。

あ!これです!
なんでインタプリタなんだ?と思いつつもthis.eventIdでイベントIDを取得できるので同じ場所に追加するものかと思ってました。
そもそも追加する場所が間違っていたんですね……。

コード: 全て選択

$gameMap.event(this._eventId).hoge = 'fuga';
alert($gameMap.event(this._eventId).hoge); 
このスクリプトで'fuga'が表示されるのを確認しました、なんとかなりそうです。

通常のセルフスイッチのような作りというのもよく分かりませんがどういうものなのか伺ってもよろしいですか?
MVやMZにデフォルトで実装されているA~Dのやつと同じ場所に変数を追加するということでしょうか。

Re: マップイベントにオブジェクトを持たせ、他のイベントからアクセスしたい

Posted: 2023年9月22日(金) 19:35
by くろうど
「通常のセルフスイッチのような作り」と言ったのは、
グローバル変数として、
マップID、イベント番号などをキーにした
連想配列を作る……という意味ですね。

この場合、
実装としては、Game_System に持たせるのが楽かと思います。
(ツクールやJavaScriptの作法的なことは不明)

Re: マップイベントにオブジェクトを持たせ、他のイベントからアクセスしたい

Posted: 2023年9月22日(金) 19:44
by みよき
ああなるほど、イベントそのものに持たせるわけではなく自前で対応する配列を用意する形ですね。
マップ間での持ち越しが必要になったら必要分だけこの形で実装することにします。

どうやってセルフ変数を持たせるかで3日ぐらい悩んでたので本当に助かりました。ありがとうございます。