フォーラムへの返信
-
投稿者投稿
-
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のコードブロックが正常に機能していなさそう
-
この返信は9ヶ月、 3週前に
-
投稿者投稿