【解決】HIME_PartySwitchingSceneでのエラー

アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

【解決】HIME_PartySwitchingSceneでのエラー

投稿記事by ムノクラ » 2019年9月15日(日) 11:36

HIME_PartySwitchingScene.js
の動作確認をしたところ、エラーが出ました。

状況
コアスクリプト 1.6.2
HIME_PartyManager.js 1.11
http://himeworks.com/2016/02/party-manager-mv/
https://fungamemake.com/archives/3695

HIME_PartySwitchingScene.js 1.2
http://himeworks.com/2016/03/party-switching-scene/

HIME_PartyManager.js で最大パーティメンバーを3に設定。
HIME_PartySwitchingScene.js で交代シーンを呼び、4人目を追加しようと操作するとブザーが鳴るはずが、エラーが出てしまいます。
使用したスクリプトは下記です。

コード: 全て選択

var party = $gameSystem.reserveParty()
party.addActor(2)
party.addActor(3)
party.addActor(4)
party.addActor(5)

SceneManager.push(Scene_PartySwitch)


最大人数設定を変更する前(-1:多分無制限)は動いていたので、使用方法が間違っている可能性は低いと考えます。
スクリプトの修正が必要と予想しますが、HimeWorks様は休止されているようです。
修正箇所がお分かりの方はご指導下さい。

エラーは下記です。

コード: 全て選択

rpg_managers.js:1949 TypeError: Cannot read property 'isAppeared' of null
    at rpg_objects.js:4802
    at Array.filter (<anonymous>)
    at Game_Party.battleMembers (rpg_objects.js:4801)
    at Game_Party.leader (rpg_objects.js:4811)
    at Game_Player.refresh (rpg_objects.js:7437)
    at Game_Party.swapOrder (rpg_objects.js:5109)
    at Scene_PartySwitch.swapMembers (HIME_PartySwitchingScene.js:501)
    at Scene_PartySwitch.onActorOk (HIME_PartySwitchingScene.js:475)
    at Window_PartySwitchAvailable.Window_Selectable.callHandler (rpg_windows.js:902)
    at Window_PartySwitchAvailable.Window_Selectable.callOkHandler (rpg_windows.js:1171)

SS01.png

SS02.png
SS02.png (37.26 KiB) 閲覧数: 2473 回
最後に編集したユーザー ムノクラ on 2019年10月24日(木) 22:36 [ 編集 2 回目 ]

---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
ecf5DTTzl6h6lJj02
記事: 455
登録日時: 2018年12月23日(日) 13:55

Re: HIME_PartySwitchingSceneでのエラー

投稿記事by ecf5DTTzl6h6lJj02 » 2019年9月15日(日) 15:19

ムノクラ さんが書きました:HIME_PartySwitchingScene.js
の動作確認をしたところ、エラーが出ました。

状況
コアスクリプト 1.6.2
HIME_PartyManager.js 1.11
http://himeworks.com/2016/02/party-manager-mv/
https://munokura.tk/archives/3695

HIME_PartySwitchingScene.js 1.2
http://himeworks.com/2016/03/party-switching-scene/

HIME_PartyManager.js で最大パーティメンバーを3に設定。
HIME_PartySwitchingScene.js で交代シーンを呼び、4人目を追加しようと操作するとブザーが鳴るはずが、エラーが出てしまいます。
使用したスクリプトは下記です。

コード: 全て選択

var party = $gameSystem.reserveParty()
party.addActor(2)
party.addActor(3)
party.addActor(4)
party.addActor(5)

SceneManager.push(Scene_PartySwitch)


最大人数設定を変更する前(-1:多分無制限)は動いていたので、使用方法が間違っている可能性は低いと考えます。
スクリプトの修正が必要と予想しますが、HimeWorks様は休止されているようです。
修正箇所がお分かりの方はご指導下さい。

エラーは下記です。

コード: 全て選択

rpg_managers.js:1949 TypeError: Cannot read property 'isAppeared' of null
    at rpg_objects.js:4802
    at Array.filter (<anonymous>)
    at Game_Party.battleMembers (rpg_objects.js:4801)
    at Game_Party.leader (rpg_objects.js:4811)
    at Game_Player.refresh (rpg_objects.js:7437)
    at Game_Party.swapOrder (rpg_objects.js:5109)
    at Scene_PartySwitch.swapMembers (HIME_PartySwitchingScene.js:501)
    at Scene_PartySwitch.onActorOk (HIME_PartySwitchingScene.js:475)
    at Window_PartySwitchAvailable.Window_Selectable.callHandler (rpg_windows.js:902)
    at Window_PartySwitchAvailable.Window_Selectable.callOkHandler (rpg_windows.js:1171)

SS01.png

SS02.png

HIME_PartySwitchingScene.js が、パーティーの追加/入れ替えの際に、
パーティーメンバーの最大数をチェックしておらず、最大数を超えて、メンバーを追加しようとするため
エラーが発生するようです。(入れ替えの際も、パーティーにアクターを追加してから、インデックスを入れ替えて、該当メンバーを削除という処理をしてます。)

まず、パーティーメンバーの最大数を超えて、メンバー追加することが可能ので、追加できないように変更します。 HIME_PartySwitchngScene.js の278行目あたりから始まるScene_PartySwitch.prototype.onPartyOk 関数を次のように変更します。

コード: 全て選択

  Scene_PartySwitch.prototype.onPartyOk = function() {
      if(this._listWindow._data._maxPartyMembers <= this._listWindow.index()){
         SoundManager.playBuzzer();
         this._listWindow.activate();
      }
      else{
       this._helpWindow.setText($.selectText);
       this._listWindow.deactivate();
       this._availableWindow.activate();
       this._availableWindow.select(0);
    }
  };

つづいて、入れ替えの際に、パーティーがいっぱいだったら、一時的に、パーティーの最大数を拡張するように変更します。311行目あたりから始まる
Scene_PartySwitch.prototype.swapMembers関数を次のように変更します。

コード: 全て選択

  Scene_PartySwitch.prototype.swapMembers = function() {
    var sIdx = this._listWindow.index()
    var tIdx = this._availableWindow.index();
   
    var party = this._listWindow._data
    var otherParty = this._availableWindow._data;
   
    var oldActor = party.members()[sIdx];
    var newActor = otherParty.members()[tIdx];
    var isFull = Party.isPartyFull(1);
    if (newActor) {
         if(isFull){
            Party.setMaxPartyMembers(1, party._maxPartyMembers + 1);
         }
         party.addActor(newActor.actorId())
         party.swapOrder(newActor.index(), sIdx);
         otherParty.removeActor(newActor.actorId());
         if (isFull){
            Party.setMaxPartyMembers(1, party._maxPartyMembers - 1);
         }
    }
    if (oldActor) {     
      otherParty.addActor(oldActor.actorId());
      otherParty.swapOrder(otherParty.members().indexOf(oldActor), tIdx);
      party.removeActor(oldActor.actorId());
    }
   
    this._listWindow.refresh();
    this._availableWindow.refresh();
  };

これで、おそらく、動作するはずですが、きちんとチェックしてないので、不具合がでたらごめんなさい。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: HIME_PartySwitchingSceneでのエラー

投稿記事by ムノクラ » 2019年9月15日(日) 20:29

ご指導いただいたコードに入れ替えたところ、想定通りに動作いたしました。

ありがとうございました!
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。
ecf5DTTzl6h6lJj02
記事: 455
登録日時: 2018年12月23日(日) 13:55

Re: HIME_PartySwitchingSceneでのエラー

投稿記事by ecf5DTTzl6h6lJj02 » 2019年9月16日(月) 12:44

ムノクラ さんが書きました:ご指導いただいたコードに入れ替えたところ、想定通りに動作いたしました。

すいません、改めてコードを見返したら、色々やらかしていることに気づきました。
このコードだと、人数制限をかけてないパーティの追加/入れ替えの際や、
パーティーをスイッチして1番以外のパーティーを動かしているときに正しく動作しませんでした。
次のコードに再修正してください。

Scene_PartySwitch.prototype.onPartyOk 関数の変更

コード: 全て選択

  Scene_PartySwitch.prototype.onPartyOk = function() {
      if(this._listWindow._data._maxPartyMembers != -1 && this._listWindow._data._maxPartyMembers <= this._listWindow.index()){
         SoundManager.playBuzzer();
         this._listWindow.activate();
      }
      else{
       this._helpWindow.setText($.selectText);
       this._listWindow.deactivate();
       this._availableWindow.activate();
       this._availableWindow.select(0);
    }
  };

Scene_PartySwitch.prototype.onActorOk 関数の変更

コード: 全て選択

  Scene_PartySwitch.prototype.onActorOk = function() {
        if( this._availableWindow._data._maxPartyMembers != -1 &&
           this._availableWindow._data._maxPartyMembers <= this._availableWindow.index()){
            SoundManager.playBuzzer();
            this._availableWindow.activate();
         }
         else{
          this.swapMembers();
          this._helpWindow.setText($.startText);
          this._availableWindow.deselect();
          this._availableWindow.deactivate();
          this._listWindow.activate();
        }
  };

Scene_PartySwitch.prototype.swapMembers 関数の変更

コード: 全て選択

  Scene_PartySwitch.prototype.swapMembers = function() {
    var sIdx = this._listWindow.index()
    var tIdx = this._availableWindow.index();
   
    var party = this._listWindow._data
    var otherParty = this._availableWindow._data;
   
    var oldActor = party.members()[sIdx];
    var newActor = otherParty.members()[tIdx];
    var isFull = Party.isPartyFull(party._id);
    if (newActor) {
         if(isFull){
            Party.setMaxPartyMembers(party._id, party._maxPartyMembers + 1);
         }
         party.addActor(newActor.actorId())
         party.swapOrder(newActor.index(), sIdx);
         otherParty.removeActor(newActor.actorId());
         if (isFull){
            Party.setMaxPartyMembers(party._id, party._maxPartyMembers - 1);
         }
    }
    if (oldActor) {     
      otherParty.addActor(oldActor.actorId());
      otherParty.swapOrder(otherParty.members().indexOf(oldActor), tIdx);
      party.removeActor(oldActor.actorId());
    }
   
    this._listWindow.refresh();
    this._availableWindow.refresh();
  };


お手数おかけして申し訳ありませんが、よろしくお願いします。
アバター
ムノクラ
記事: 2011
登録日時: 2018年2月23日(金) 11:41
連絡を取る:

Re: HIME_PartySwitchingSceneでのエラー

投稿記事by ムノクラ » 2019年9月16日(月) 17:46

ecf5DTTzl6h6lJj02 さんが書きました:すいません、改めてコードを見返したら、色々やらかしていることに気づきました。
このコードだと、人数制限をかけてないパーティの追加/入れ替えの際や、
パーティーをスイッチして1番以外のパーティーを動かしているときに正しく動作しませんでした。
次のコードに再修正してください。


入れ替えて動作確認したところ、問題なく動きました。
ありがとうございます。

参考までに確認したケースを挙げておきます。

1.人数制限を3にした状態
 パーティメンバー追加、離脱
 2番のパーティにスイッチしての同上
2.人数制限を-1にした状態
 パーティメンバー追加、離脱
 2番のパーティにスイッチしての同上
---
JavaScriptの基本を学習せずにツクールのプラグインやスクリプトを使って横着してゲームを作ろうとしている人間です。
そのような者なので、適当な投稿をするかも知れません。
他の方の投稿を信用してください。

“MV:質問” へ戻る