プラグインでよく使うものを自作関数として定義したい

返信する
akira57
記事: 36
登録日時: 2020年1月10日(金) 22:38

プラグインでよく使うものを自作関数として定義したい

投稿記事 by akira57 »

スクリプト内でコモンイベント呼び出しを記述することが多いのですが、毎回
 this.setupChild($dataCommonEvents[●].list, this._eventId);
の形の文を書くと長くてわずらわしく感じます。
 そこで、自作関数CEvent(●, this._eventId)の形をプラグインで定義しておくことでスムーズなスクリプトになると思い、以下↓のようにプラグインに定義してみたのですが、エラーとなってしまいます。
 function CEvent(m,n) {
  this.setupChild($dataCommonEvents[m].list, n);
 }

良い方法があれば教えていただけませんでしょうか。よろしくお願いいたします。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: プラグインでよく使うものを自作関数として定義したい

投稿記事 by Plasma Dark »

スクリプトからのコモンイベント呼び出しはなぜ必要なのでしょう。
コアスクリプトを読まずにおまじないのように書いてしまっていては、今回のケースのように応用が効きませんし、エラーが起きたときに解決のための情報を分析できないのであればやめておいたほうが良いと私は考えます。

ツクマテにはコードを読みやすく記述するためのタグがありますので、コードを貼り付ける場合はそれを用いると良いと思います。

エラーになる原因は、 this が何者であるかを理解しないまま書いているからです。
イベントコマンドのスクリプトに記述するコードは Game_Interpreter インスタンスのメソッド内で eval されます。
ここでの this は Game_Interpreter インスタンスそのものです。
以下のように記述した場合、 Game_Interpreter インスタンスの setupChild メソッドを呼び出している、というわけです。

コード: 全て選択

const commonEvent = $dataCommonEvents[1];
const eventId = this.isOnCurrentMap() ? this._eventId : 0;
this.setupChild(commonEvent.list, eventId);
コモンイベント呼び出しのイベントコマンドは Game_Interpreter.ptototype.command117 に記述されていますので、理解の補助になるかと思います。

どうしてもスクリプトからのコモンイベント呼び出しを行いたく、コモンイベントIDと親イベントIDのみを指定したい場合、 Game_Interpreter クラスにメソッドを定義してしまう方法はありますが、本当にそれをすべきかは要件次第です。
それこそ、スクリプトに書いていた内容を全てプラグインに移してしまう方法も考えられます。
akira57
記事: 36
登録日時: 2020年1月10日(金) 22:38

Re: プラグインでよく使うものを自作関数として定義したい

投稿記事 by akira57 »

アドバイスありがとうございます。私はJavaの知識がなくスクリプトも使用し始めたばかりで、使用するのも簡易的なものに限ります。コアスクリプトについては目を通しはしたもののほぼ理解できない状態ですし、アドバイス頂いたように、無理にスクリプトではなくコモンイベントは通常通り使用すればよいのも言われてみるとその通りだなと改めて感じました。スクリプトにしたかった理由は、●の箇所を定数定義してスクリプト記述しておくことで数え切れないほどのコモンイベントのidをあとで変更する場合があれば●だけを変更すれば済むからでした。
これから少しずつ自分もこれらの記述について学んでいきたいなと思います。
ありがとうございました。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: プラグインでよく使うものを自作関数として定義したい

投稿記事 by Plasma Dark »

似ているので混同されがちですが、RPGツクールMV,MZで使用されている言語はJavaではなくJavaScriptです。
●の箇所を定数定義してスクリプト記述しておくことで数え切れないほどのコモンイベントのidをあとで変更する場合があれば●だけを変更すれば済むからでした。
この発想自体はとても良いと思います。コードを書かずに使おうとすると、IDの変更はやりにくいですからね。
名前を指定してコモンイベントを呼び出すようなプラグインコマンドを定義してしまうのも一つの手です。

コード: 全て選択

(function () {
  'use strict';

  const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    /**
     * プラグインコマンド
     * callCommonEventByName コモンイベント名
     * 指定した名前に一致する最も若いIDのコモンイベントを実行する
     */
    if (command === 'callCommonEventByName') {
      const targetCommonEvent = $dataCommonEvents.find(commonEvent => commonEvent.name === String(args[0]));
      if (targetCommonEvent) {
        this.setupChild(targetCommonEvent.list, this.isOnCurrentMap() ? this._eventId : 0);
      }
    }
  }
})();
akira57
記事: 36
登録日時: 2020年1月10日(金) 22:38

Re: プラグインでよく使うものを自作関数として定義したい

投稿記事 by akira57 »

 返信が遅くなり申し訳ありません。
コモンイベントをNo.でなく言葉による区別することもできるのですね。勉強になりました。正直、教えて頂いたスクリプトを理解するのはまだまだ先の話になりそうですが…
ツクールで一通り作り終えたところでしたが、その後は作成済のイベントなどを変更修正の可能性も考えるといかに効率的・統一化を図るかがカギになるかと思います。
その中で最近、スクリプトの書き方に興味関心を持ったところです。
 プラグインで自作関数を定義するところまでは今回いけませんでしたが、よく使用する
定数を定義してプラグイン化することには成功しました。今後もいろいろと教えて頂けると幸いです。ありがとうございます。
返信する

“MV:質問”に戻る