ページ 11

[解決済]「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月01日(木) 20:04
by souma
お世話になります。

表題の通りなんですが、通常は画面一杯の横幅で表示されるアイテム選択の処理ウィンドウを、
状況毎に切り替えて横幅のサイズを変更したいと思っています。

試行として、「rpg_windows.js」から関係のありそうな記述を自分用のプラグインにコピペして

コード: 全て選択

Window_EventItem.prototype.initialize = function(messageWindow) {
    this._messageWindow = messageWindow;
if($gameSwitches.value(1)){
    var width = Graphics.boxWidth/2;
} else {
    var width = Graphics.boxWidth;
};
    var height = this.windowHeight();
    Window_ItemList.prototype.initialize.call(this, 0, 0, width, height);
    this.openness = 0;
    this.deactivate();
    this.setHandler('ok',     this.onOk.bind(this));
    this.setHandler('cancel', this.onCancel.bind(this));
};
と変更を加えてみました。
これで、スイッチ1がオンの時は半分のサイズの横幅になり、オフの時は通常時のサイズの横幅になる…、と
思ったのですが…。

これですと、スイッチをオンにしても、「場所移動(というかマップのリフレッシュ?)」をしてからで無いと
サイズの変更が反映されませんでした。

スイッチの切り替えで即時に反映させるにはどうすれば良いのでしょうか?
ご教授頂けると幸いです。

Re: 「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月01日(木) 20:24
by Arkroyal
souma さんが書きました:お世話になります。

表題の通りなんですが、通常は画面一杯の横幅で表示されるアイテム選択の処理ウィンドウを、
状況毎に切り替えて横幅のサイズを変更したいと思っています。

試行として、「rpg_windows.js」から関係のありそうな記述を自分用のプラグインにコピペして

コード: 全て選択

Window_EventItem.prototype.initialize = function(messageWindow) {
    this._messageWindow = messageWindow;
if($gameSwitches.value(1)){
    var width = Graphics.boxWidth/2;
} else {
    var width = Graphics.boxWidth;
};
    var height = this.windowHeight();
    Window_ItemList.prototype.initialize.call(this, 0, 0, width, height);
    this.openness = 0;
    this.deactivate();
    this.setHandler('ok',     this.onOk.bind(this));
    this.setHandler('cancel', this.onCancel.bind(this));
};
と変更を加えてみました。
これで、スイッチ1がオンの時は半分のサイズの横幅になり、オフの時は通常時のサイズの横幅になる…、と
思ったのですが…。

これですと、スイッチをオンにしても、「場所移動(というかマップのリフレッシュ?)」をしてからで無いと
サイズの変更が反映されませんでした。

スイッチの切り替えで即時に反映させるにはどうすれば良いのでしょうか?
ご教授頂けると幸いです。



スイッチをイベントなどで操作するとき、$gameMap.requestRefresh() スクリプトを入れてみるのはいかがでしょうか?

変化を起こしても何らかのきっかけで(soumaさんがしたように場所移動をするなど)更新されないとその変化が反映されないので、直接更新を要請する必要があるみたいです。

Re: 「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月02日(金) 02:43
by Plasma Dark
イベントアイテム選択ウィンドウのサイズを動的に変更するプラグインのサンプルを書きました。参考にどうぞ。

https://gist.github.com/elleonard/b6144 ... 50a69be661

イベントアイテム選択ウィンドウは、入力開始時に start メソッドを呼びます。
start メソッドで createContents を呼ぶ前に横幅を設定してあげることで、スイッチによって動的にサイズ変更を行っています。

MVにおいて、イベントアイテム選択ウィンドウはメッセージウィンドウのサブウィンドウであり、マップロード時に生成されます。
initialize メソッドはインスタンスの生成時に実行されるようになっているので、最初に提示されたコードでは、マップのロード(マップ切り替え)を挟まないと意図したサイズ変更が反映されないのです。
スイッチをイベントなどで操作するとき、$gameMap.requestRefresh() スクリプトを入れてみるのはいかがでしょうか?
これは Game_Map クラスインスタンスの持つイベント情報のリフレッシュであり、 Scene_Map の持つメッセージウィンドウやそのサブウィンドウには関与しません。

Re: 「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月02日(金) 11:52
by Arkroyal
Plasma Dark さんが書きました:イベントアイテム選択ウィンドウのサイズを動的に変更するプラグインのサンプルを書きました。参考にどうぞ。

https://gist.github.com/elleonard/b6144 ... 50a69be661

イベントアイテム選択ウィンドウは、入力開始時に start メソッドを呼びます。
start メソッドで createContents を呼ぶ前に横幅を設定してあげることで、スイッチによって動的にサイズ変更を行っています。

MVにおいて、イベントアイテム選択ウィンドウはメッセージウィンドウのサブウィンドウであり、マップロード時に生成されます。
initialize メソッドはインスタンスの生成時に実行されるようになっているので、最初に提示されたコードでは、マップのロード(マップ切り替え)を挟まないと意図したサイズ変更が反映されないのです。
スイッチをイベントなどで操作するとき、$gameMap.requestRefresh() スクリプトを入れてみるのはいかがでしょうか?
これは Game_Map クラスインスタンスの持つイベント情報のリフレッシュであり、 Scene_Map の持つメッセージウィンドウやそのサブウィンドウには関与しません。




なるほど…教えてくださってありがとうございます。

Soumaさんの状況がわからないためわたしはフィールドマップの情報ウインドウで色々試してみました。

Scene_Mapのupdateでは変化が反映されず、scene. createDisplayObjectsをやってみたら更新ができました。
(sceneがSceneManager. _sceneであることを定義する必要がありますが)

しかしこの方法では一瞬ちらつきがあるのでおすすめはできませんね…。

Re: 「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月02日(金) 14:16
by Plasma Dark
Scene_Mapのupdateでは変化が反映されず、scene. createDisplayObjectsをやってみたら更新ができました。
(sceneがSceneManager. _sceneであることを定義する必要がありますが)

しかしこの方法では一瞬ちらつきがあるのでおすすめはできませんね…。
表示対象のオブジェクトを全て再生成すれば確かにウィンドウクラスのインスタンスも作られるので、変更は反映されると思います。
ただし、 spriteset も再生成する上、 Scene_Map インスタンスの子が実行ごとに増殖していく悪夢のような事態に陥るので、やめておいたほうが良いでしょう。

シーンクラスは updateChildren メソッドにより、全ての子要素(spritesetやウィンドウ)の update メソッドを呼びます。
createDisplayObjects メソッドで新たに子を追加したとして、既存の子を削除するような処理はしていないので、単純に一度実行するだけで updateChildren メソッドの処理が倍になります。

シーンクラスの update メソッドは平均して 1/60 秒に一度くらいの頻度で実行されるようになっている(詳細は SceneManager.updateMain を参照)ので、そこの処理が無駄に2倍、3倍になっていくと考えると、ゲームのパフォーマンスが心配になります。

Re: 「アイテム選択の処理」ウィンドウの幅サイズを切り替えて使いたいのですが…

Posted: 2021年4月02日(金) 19:46
by souma
Arkroyal様、Plasma Dark様、ご返信、誠に有難う御座います。

Plasma Dark様に張って頂いたプラグインを利用する事で、
スイッチの切り替えによる即時反映を無事行う事が出来ました。
感謝しています!

あと、お二人のやり取りでオブジェクトの再生成を行う上での落とし穴にも
気付くことができました。
(書き込み時点では最悪の場合、チラ付き覚悟でArkroyal様にご提示頂いた方法も検討していました…)

以降は、参考のプラグインと解説を読み取り、内容が理解できるように学習していきたいと思います。

これにて本トピックは解決済にさせて頂きます。
有難う御座いました!