DarkPlasma

フォーラムへの返信

3件の投稿を表示中 - 1 - 3件目 (全3件中)
  • 投稿者
    投稿
  • 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はコアスクリプトに定義されていてグローバルスコープに公開されていますから、その中で作られた変数も他プラグインから参照はできます。

    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の複数行コードブロックがサポートされていない

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

    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);
    };
    }
    })();
    

     

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

    • この返信は9ヶ月、 3週前にDarkPlasmaが編集しました。理由: markdownのコードブロックが正常に機能していなさそう
3件の投稿を表示中 - 1 - 3件目 (全3件中)