【解決済み】バトル中に動的に配列windowを生成したい

maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

【解決済み】バトル中に動的に配列windowを生成したい

投稿記事by maker-b » 2020年10月16日(金) 00:45

お世話になります。
いつも、皆様のコードを参考にさせて頂いております。
大変感謝いたします。

タイトルが抽象的になってしまいましたが、
端的に質問をまとめると

バトルシーンで、参加しているアクターの分だけ動的にwindowを作りたいと思っております。

コード: 全て選択

this._autoBattleWindowGambit = new Window_AutoBattleGambit();
        this.addWindow(this._autoBattleWindowGambit);


こんな感じで、1つのwindowは生成することができましたが、
同じWindow_AutoBattleGambit()を使って、バトルに参加しているアクターの分だけ動的にwindowを
作成したいです。

コード: 全て選択

Scene_Battle.prototype.createAutoBattleWindowGambit = function(){

for(let i = 0; i < $gameParty.members().length; i ++){
 ここに、windowをアクター分生成するコードを入れたい
}
    };


こんなイメージですが、どなたかお知恵をいただけないでしょうか?
最後に編集したユーザー maker-b on 2020年10月16日(金) 19:23 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: バトル中に動的に配列windowを生成したい

投稿記事by Plasma Dark » 2020年10月16日(金) 02:31

動的に作るよりも、戦闘開始時に必要数分だけ揃えてしまうほうが自然な気がします。

適当にコード例を示します。

コード: 全て選択

Scene_Battle.prototype.createAutoBattleGambitWindow = function() {
  $gameParty.battleMembers()
    .map((_, index) => new Window_AutoBattleGambit(this.gambitWindowRect(index), index))
    .forEach(window => this.addWindow(window));
};


配列操作関数を使用すれば、for文よりスッキリ書けるケースが多いので、ここでは .map を使用しています。

ガンビットウィンドウの詳細は知りませんが、メンバー数分表示し、メンバーに応じた内容を表示するものであれば、 Scene_Battle.prototype.gambitWindowRect などのメソッドを定義して対象ウィンドウの位置と大きさを返すようにすると他と統一できてわかりやすいでしょう。
ただし、メンバーによって表示位置が変わるので、indexを渡しています。

ウィンドウごとの表示内容はアクターを参照するものでしょうから、アクターを特定するためにウィンドウにもindexを渡しています。(場合によってはアクターそのものを渡す書き方も考えられますが、その場合は戦闘中の隊列変更を考慮する必要があります)
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: バトル中に動的に配列windowを生成したい

投稿記事by maker-b » 2020年10月16日(金) 11:00

Plasma Dark 様

いつもレスいただきありがとうございます!
以下構文、拝読しました!
ご指摘の通り、バトル開始時に、実装すべきと理解しております。
よって、

コード: 全て選択

var _MKB_gambit_createAllWindows = Scene_Battle.prototype.createAllWindows;
    Scene_Battle.prototype.createAllWindows = function(){
        _MKB_gambit_createAllWindows.call(this);
        this.createAutoBattleWindowGambit();
    };

この部分に実装しました。

いくつか質問をさせていただけないでしょうか。

コード: 全て選択

Scene_Battle.prototype.createAutoBattleGambitWindow = function() {
  $gameParty.battleMembers()
    .map((_, index) => new Window_AutoBattleGambit(this.gambitWindowRect(index), index))
    .forEach(window => this.addWindow(window));
};


この構文は、
1  $gameParty.battleMembers().map で、現状のバトルメンバー配列から、新しい配列を生み出している?
2 forEach(window => this.addWindow(window)); で、1の配列の一つづづにadd windowしている

いただいた構文を実装しましたが、思ったようにwindow配列が出来ず、苦慮しております。
具体的には、console.log(this)でみても、何も生成されていないように見えます・・・
ちなみに、gambitWindowRect(index)のメソッドを追加して、アクター毎にRECT位置を変えるようにしております。

お忙しい中、大変申し訳ございません・・・
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: バトル中に動的に配列windowを生成したい

投稿記事by maker-b » 2020年10月16日(金) 11:06

ちなみに、私の理解が悪いので、古いfor文で記載すると

コード: 全て選択

Scene_Battle.prototype.createAutoBattleGambitWindow = function() {
for(let i = 0; i < $gameParty.battleMembers().length; i ++;){
const tempWindow = new Window_AutoBattleGambit(this.gambitWindowRect(i), i));
this.addWindow(tempWindow);
}
};


当然ですが、上記で試しても駄目でした。addWindow部分が配列化されていないので、単一のwindowができるだけですよね・・・・
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: バトル中に動的に配列windowを生成したい

投稿記事by Plasma Dark » 2020年10月16日(金) 11:32

1  $gameParty.battleMembers().map で、現状のバトルメンバー配列から、新しい配列を生み出している?
2 forEach(window => this.addWindow(window)); で、1の配列の一つづづにadd windowしている


1, 2 ともに正しいご理解です。
今回は戦闘メンバーそれぞれに対応するウィンドウであるということで、こういう書き方をしています。

いただいた構文を実装しましたが、思ったようにwindow配列が出来ず、苦慮しております。
具体的には、console.log(this)でみても、何も生成されていないように見えます・・・
ちなみに、gambitWindowRect(index)のメソッドを追加して、アクター毎にRECT位置を変えるようにしております。


私の提示したコードではwindowの配列を生成しても後から操作できないですね。
Scene_Battle内でconsole.logしても見えないわけです。
しっかりScene_Battleのメンバとして追加してあげる必要があります。

コード: 全て選択

Scene_Battle.prototype.createAutoBattleGambitWindow = function() {
  this._gambitWindows = $gameParty.battleMembers()
    .map((_, index) => new Window_AutoBattleGambit(this.gambitWindowRect(index), index));
  this._gambitWindows.forEach(window => this.addWindow(window));
};


これで、Scene_Battle内で this._gambitWindows が戦闘メンバーのガンビットウィンドウの配列になります。
maker-b
記事: 112
登録日時: 2016年3月27日(日) 22:03
連絡を取る:

Re: バトル中に動的に配列windowを生成したい

投稿記事by maker-b » 2020年10月16日(金) 19:22

ご連絡ありがとうございます!

とってもうまくいきました!

コード: 全て選択

    Scene_Battle.prototype.createAutoBattleWindowGambit = function(){
        this._gambitWindows = $gameParty.battleMembers().map((_, index) => new Window_AutoBattleGambitChange(this.WindowRectX(index), index));
        this._gambitWindows.forEach(window => this.addWindow(window));
    };


こんな感じで書きました!
rectで好きな場所へwindowが出せるのは良いのですが、どこに表示するかは思案中です!
とりいそぎ解決できたので、感謝いたします!
本当にいつもありがとうございます!
いい感じのガンビットシステムができてきました!
添付ファイル
Honeyview_スクリーンショット 2020-10-16 191837.png
Honeyview_スクリーンショット 2020-10-16 191837.png (413.14 KiB) 閲覧数: 2727 回

“MZ:質問” へ戻る