【解決】NUUN_Resultのパッチプラグインを作りたい

#ツクルーム フォーラム RPGツクールMZ (RPG Maker MZ) 【解決】NUUN_Resultのパッチプラグインを作りたい

  • このトピックには6件の返信、3人の参加者があり、最後にDarkPlasmaにより7ヶ月、 3週前に更新されました。
7件の投稿を表示中 - 1 - 7件目 (全7件中)
  • 投稿者
    投稿
  • #626 返信
    munokura
    参加者

    # 使用環境
    RPGツクールMZ 1.9.0

    github.com/nuun888/MZ/blob/master/NUUN_Base.js
    version 1.7.11

    github.com/nuun888/MZ/blob/master/NUUN_Result.js
    version 2.4.6

    # やりたいこと
    NUUN_Result で顔画像が表示される箇所に歩行キャラに変更表示したい

    # やってみたこと
    パッチプラグインを作成しました。

    “`JavaScript
    (() => {
    “use strict”;

    Window_ResultActorExp.prototype.drawActorFace = function (data, actor, x, y, height) {
    const w = 144;
    const h = 144;
    const x2 = Math.floor(x + w / 2);
    const y2 = y + Math.floor(h * 2.2 / 4);
    this.drawActorCharacter(actor, x2, y2);
    };

    Window_ResultActorStatus.prototype.drawActorFace = function (data, actor, x, y) {
    const rect = this.itemRect(0);
    const w = 144;
    const h = 144;
    const x2 = Math.floor(x + w / 2);
    const y2 = y + Math.floor(h * 2.2 / 4);
    this.drawActorCharacter(actor, x2, y2);
    };

    })();
    “`
    Window_ResultActorExp.prototype.drawActorFace
    の記述だけであれば動作しました。
    しかしレベルアップ時に表示されるのに使用される
    Window_ResultActorStatus.prototype.drawActorFace
    の記述を追加するとテスト起動でエラーになります。

    # 困っていること
    テストプレイ起動時にエラーが出て進めない
    “`
    MNKR_NUUN_Result_patch.js:43 Uncaught ReferenceError: Window_ResultActorStatus is not defined
    at MNKR_NUUN_Result_patch.js:43:5
    at MNKR_NUUN_Result_patch.js:62:3
    “`

    # 疑問点
    パッチプラグインの有効な範囲は下記と解釈しています。
    1. デフォルトコアと同じ関数を上書きするプラグイン
    2. プラグイン独自の関数がグローバル化している

    Window_ResultActorExp.prototype.drawActorFace は動作する。
    Window_ResultActorStatus.prototype.drawActorFace が動作しない。
    この違いが理解できません。

    なお、NUUN_Resultを直接編集したところ、想定通りの動作になりました。
    よって、本当に知りたいのはパッチプラグインにする方法です。

    • このトピックはハリズミが7ヶ月、 1週前に変更しました。
    #627 返信
    ツクールAI君
    メンバー

    ## RPGツクールMZ パッチプラグイン作成時のエラーについて

    – **実現したいこと:**
    – NUUN_Resultプラグインで、リザルト画面の顔画像表示を歩行キャラ表示に変更。

    – **試したこと:**
    – パッチプラグインを作成し、`Window_ResultActorExp.prototype.drawActorFace` と `Window_ResultActorStatus.prototype.drawActorFace` を上書き。
    – `Window_ResultActorExp` のみの上書きは動作するが、`Window_ResultActorStatus` の上書きを追加するとエラー発生。
    – NUUN_Resultプラグインを直接編集した場合は想定通り動作。

    – **試用プラグイン:**
    – NUUN_Base: github.com/nuun888/MZ/blob/master/NUUN_Base.js (version 1.7.11)
    – NUUN_Result: github.com/nuun888/MZ/blob/master/NUUN_Result.js (version 2.4.6)

    – **問題点:**
    – `Window_ResultActorStatus is not defined` エラー発生。パッチプラグインで `Window_ResultActorStatus` が参照できない原因不明。

    – **不明点:**
    – なぜ `Window_ResultActorExp` はパッチプラグインで上書きできるのに、`Window_ResultActorStatus` はできないのか?
    – パッチプラグインの適用範囲、特に独自クラスの扱いについて。

    投稿者様、こちらの要約は意図通りでしょうか?不明点が補足・追記いただけると回答が得やすくなると思われます。

    ### 回答

    `Window_ResultActorStatus` はNUUN_Resultプラグイン内で定義されている内部クラスであり、グローバルスコープに公開されていません。そのため、パッチプラグインから直接アクセスすることができません。これがエラーの原因です。

    `Window_ResultActorExp` はコアスクリプトで定義されているため、グローバルスコープに存在し、パッチプラグインからアクセス可能です。

    解決策としては、`Window_ResultActorStatus` の定義がNUUN_Resultプラグインのロード後に実行されるようにパッチプラグインの読み込み順を調整するか、NUUN_Resultプラグイン自体を修正する必要があります。

    **パッチプラグインの読み込み順調整 (推奨)**

    プラグイン管理画面で、作成したパッチプラグインをNUUN_Resultより下に配置することで、NUUN_Resultの読み込み後にパッチが適用されるようにします。これにより、`Window_ResultActorStatus` が定義された後にパッチが適用され、エラーが解消されます。

    **NUUN_Resultプラグインの修正 (非推奨)**

    NUUN_Resultプラグイン内で `Window_ResultActorStatus` をグローバルスコープに公開するように修正することも可能です。しかし、これはプラグインの更新時に再度修正が必要になるため、推奨されません。

    **修正済みパッチプラグインの例 (読み込み順調整を前提)**

    “`javascript
    (() => {
    “use strict”;

    Window_ResultActorExp.prototype.drawActorFace = function (data, actor, x, y, height) {
    const w = 144;
    const h = 144;
    const x2 = Math.floor(x + w / 2);
    const y2 = y + Math.floor(h * 2.2 / 4);
    this.drawActorCharacter(actor, x2, y2);
    };

    Window_ResultActorStatus.prototype.drawActorFace = function (data, actor, x, y) {
    const rect = this.itemRect(0);
    const w = 144;
    const h = 144;
    const x2 = Math.floor(x + w / 2);
    const y2 = y + Math.floor(h * 2.2 / 4);
    this.drawActorCharacter(actor, x2, y2);
    };
    })();

    “`

    ※閲覧者の皆様、私の回答に問題がありましたら、ご指摘いただけると助かります。
    また、解決できた場合、トピックを編集し「トピックを解決済みにする」にチェックを入れてください。

    #628 返信
    munokura
    参加者

    * @target MZ
    * @base NUUN_Result
    * @orderAfter NUUN_Result
    を入れたところも書くべきでしたね。

    プラグイン管理の下側にパッチプラグインを配置しましたが、エラーになったので相談しました。
    どうやら、直接書き換えるほかなさそうですね。

    #633 返信
    DarkPlasma
    参加者

    Window_ResultActorStatus はNUUN_Resultプラグイン内で定義されている内部クラスであり、グローバルスコープに公開されていません。そのため、パッチプラグインから直接アクセスすることができません。これがエラーの原因です。

     

    これは真ですが

     

    Window_ResultActorExp はコアスクリプトで定義されているため、グローバルスコープに存在し、パッチプラグインからアクセス可能です。

     

    これは嘘です。どちらのクラスもコアスクリプトには存在しません。

    NUUN_Result.jsでは、 Window_ResultActorExp クラスを明示的にグローバルスコープに公開しています。

     

    window.Window_ResultActorExp = Window_ResultActorExp;

     

    一方、 Window_ResultActorStatus ではこれをしていません。

     

    どうやら、直接書き換えるほかなさそうですね。

     

    実はパッチプラグインで対処する方法がないわけではありません。
    Windowクラスが直接グローバルスコープに展開されていなくとも、そのクラスのインスタンスはScene_Battleが保持しています。

    
    (() => {
    'use strict';
    const _createResultActorStatusWindow = Scene_Battle.prototype.createResultActorStatusWindow;
    Scene_Battle.prototype.createResultActorStatusWindow = function() {
    _createResultActorStatusWindow.call(this);
    this._resultActorStatusWindow.drawActorFace = function (data, actor, x, y) {
    const w = ImageManager.faceWidth;
    const h = ImageManager.faceHeight;
    const x2 = Math.floor(x + w / 2);
    const y2 = y + Math.floor(h * 2.2 / 4);
    this.drawActorCharacter(actor, x2, y2);
    };
    }
    })();
    

     

    インスタンス生成時に行われる処理には気をつける必要がありますし、このクラスの別のインスタンスが作られたりする場合は厄介ですが、今回は問題ないように思います。

    • この返信は7ヶ月、 3週前にDarkPlasmaが編集しました。理由: markdownのコードブロックが正常に機能していなさそう
    #635 返信
    DarkPlasma
    参加者

    Window_ResultActorStatus はNUUN_Resultプラグイン内で定義されている内部クラスであり、グローバルスコープに公開されていません。そのため、パッチプラグインから直接アクセスすることができません。これがエラーの原因です。

     

    これは真ですが

     

    Window_ResultActorExp はコアスクリプトで定義されているため、グローバルスコープに存在し、パッチプラグインからアクセス可能です。

     

    これは嘘です。どちらのクラスもコアスクリプトには存在しません。

     

    NUUN_Result.jsでは、 Window_ResultActorExp クラスを明示的にグローバルスコープに公開しています。

     

    window.Window_ResultActorExp = Window_ResultActorExp;

     

    一方、 Window_ResultActorStatus ではこれをしていません。

     

    どうやら、直接書き換えるほかなさそうですね。

     

    実はパッチプラグインで対処する方法がないわけではありません。

    Windowクラスが直接グローバルスコープに展開されていなくとも、そのクラスのインスタンスはScene_Battleが保持しています。

     

    https://gist.github.com/elleonard/ecf55fe854e812c1cc34cb6d7b24dcbb

     

    インスタンス生成時に行われる処理には気をつける必要がありますし、このクラスの別のインスタンスが作られたりする場合は厄介ですが、今回は問題ないように思います。

     

    余談:

    掲示板の実装にバグがありそうです。

    – コードブロック中の半角大なり小なりもエスケープされる

    – Markdownの複数行コードブロックがサポートされていない

    – 編集を確定すると書き込みが消滅する

    #637 返信
    munokura
    参加者

    いつもありがとうございます。
    いただいたコードで、上手く動作しました。
    しかし、理解が及びません。

    > NUUN_Result.jsでは、 Window_ResultActorExp クラスを明示的にグローバルスコープに公開しています。
    ”’
    window.Window_ResultActorExp = Window_ResultActorExp;
    ”’
    これでグローバルスコープになる理由が分かりません。
    どこかに資料になるページ等がありましたら、ご教示ください。

    > Windowクラスが直接グローバルスコープに展開されていなくとも、そのクラスのインスタンスはScene_Battleが保持しています。
    更に理解を越えています…
    継承の範囲の話だと予想していますが、私のツクールコアへの理解が浅すぎるのでしょうね。
    特に、Scene,Window,Sprite等の関係性が明確に理解出来ていません。
    ベースがSceneで他はその上に乗っているのだろう…くらいのイメージしかありません。

    余談:
    > コードブロック中の半角大なり小なりもエスケープされる
    この辺り、調査中です。

    > Markdownの複数行コードブロックがサポートされていない
    > 編集を確定すると書き込みが消滅する
    このあたりは、スパム判定が厳しすぎるようで、弾かれている可能性が高そうと考えています。
    対策を検討中です。

    先の投稿は、管理者にスパムを解除してもらいました。
    コードブロックが上手く表示されないのは、表示させる処理に問題が残っている?

    まだ、色々と課題がある掲示板ですが、今後ともよろしくお願いいたします。

    #638 返信
    DarkPlasma
    参加者

    jsにおけるwindowは、グローバルスコープに展開されているオブジェクトです。

    https://developer.mozilla.org/ja/docs/Web/API/Window

     

    最近はコンテキストによらず使えるglobalThisの使用が推奨されています。

    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/globalThis

     

    Windowクラスが直接グローバルスコープに展開されていなくとも、そのクラスのインスタンスはScene_Battleが保持しています。

     

    NUUN_Result.jsのコードを参照してください。

    Scene_Battle.prototype.createResultActorStatusWindowの中でWindow_ResultActorStatusクラスのインスタンスを生成し、_resultActorStatusWindow変数に代入しています。

    Scene_Battleはコアスクリプトに定義されていてグローバルスコープに公開されていますから、その中で作られた変数も他プラグインから参照はできます。

7件の投稿を表示中 - 1 - 7件目 (全7件中)
返信先: 【解決】NUUN_Resultのパッチプラグインを作りたい
あなたの情報:




ゲスト