問題をひとつずつ解決していきましょう。
windowWidth の処理書き換えについては、特定のスイッチがONだった場合にウィンドウ幅を細くするという前提で書いてみます。
コード: 全て選択
const _windowWidth = Window_Message.prototype.windowWidth;
Window_Message.prototype.windowWidth = function () {
return $gameSwitches.value(スイッチID) ? 細くなった後の幅 : _windowWidth.call(this);
};
_windowWidth に元々の処理を退避しておいて、スイッチがONの場合のみ細くなった後の値を、
OFFの場合に元々の処理で返していた値を返すようにしています。
前にも述べた通り、これだけではスイッチをONにしてもメニューを開くなどして別シーンに遷移しなければ
メッセージウィンドウ幅は変わりません。
書き換えるべき updatePlacement の処理自体はあっていますが、どうしてそうすると解決するのかを簡単に説明します。
rpg_windows.js の関係する箇所を雰囲気で読みながら、プラグインで書く処理を想像してみてください。
Window_Message.prototype.initialize が、メッセージウィンドウを生成する際に呼び出される関数です。
ツクールMVのウィンドウ生成では、基本的にウィンドウ左上のX,Y座標、ウィンドウの幅、高さを設定し、
Window_Base.prototype.initialize に渡します。
ここで作られた値には、 Window_Message クラスのメソッドからは this.x, this.y, this.width, this.height でアクセスすることができます。
幅については、 this.windowWidth() で得た値を渡していることが読み取れるかと思います。
実はこれらの値が、ウィンドウの座標とサイズを表すものになっているため、幅を調整するのであればこのwidthを変更してあげる必要があります。
メッセージの開始時に Window_Message.prototype.updatePlacement が呼び出され、そこでウィンドウの表示位置を変える処理が行われているため、幅の調整もここでやってしまおう、というのが私の提案です。
this.windowWidth() で得た値と実際の幅であるところの this.width の値を比較して、違っているようなら this.width を更新してあげる、というわけです。
(this.windowWidth() で得られる値は、先程書き換えたので指定のスイッチがONになっていると元々の幅よりも小さい値になっているはずです)
コード: 全て選択
const _updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function () {
if (this.windowWidth() !== this.width) {
this.width = this.windowWidth();
}
_updatePlacement.call(this);
};
実はこれだけでもメッセージウィンドウの幅は変わりますが、挙動が微妙になるかと思います。
スイッチをONにしてからメッセージを表示しようとすると、幅は細くなるものの、ウィンドウの位置が左端に寄っています。
そこから更にメニューを開くなどしてから戻って、もう一度メッセージを表示すると、ウィンドウの位置が真ん中に寄ります。
これは、メッセージウィンドウの生成時にX座標を、生成時点の幅をもとにして中央寄せになるよう計算しているからです。
今回はどうしたいかわかりませんが、ひとまず中央寄せで統一するということにして処理を書くと以下のようになります。
コード: 全て選択
const _updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function () {
if (this.windowWidth() !== this.width) {
this.width = this.windowWidth();
this.x = (Graphics.boxWidth - this.width) / 2;
}
_updatePlacement.call(this);
};
x, widthを調整するというのはこういうことです。
createContents についてはもう少し複雑な説明が必要なのと、必ずしも必要ではないので次の書き込みにいきます。