【解決済み】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

【解決済み】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年2月17日(金) 22:38

「ツクマテ」の皆様、お世話になっております。今回も、どうぞよろしくお願いいたします。

アクターの名前や顔グラを、IDではなく以下の様な条件で表示する際の記述を教えていただきたいです。

 【解決!】① var boss = 防具 n番 を装備しているアクターの名前;

 【解決!】② var reader = ステート n番 を付与されているアクターの名前;

 【解決!】③トリアコンタン様の「ゲーム内用語辞典プラグイン」で以下のような条件分岐を
       使用したいと思っています。

       if (隠しアイテムA と同じ名前のアクターがいる場合) {
        選択中の隠しアイテムA と同じ名前のアクターの顔グラを表示;
       } else {
        return null;(※同じ名前が無い、改名などで無くなった場合の処理です)
        }

一応、Window_Glossary.prototype.drawPicture 内に this.drawActorFace($gameActors.actor(1), x, y);
で顔グラの表示が可能であることは確認しているのですが、今は指定した ID のアクターに固定されて
いる有様です(苦笑)。
どうぞよろしくお願いいたします。

※トリアコンタン様の「ゲーム内用語辞典プラグイン」はこちら!
 https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/SceneGlossary.js
最後に編集したユーザー 蓮賀まさとき on 2023年3月12日(日) 21:24 [ 編集 5 回目 ]

・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
剣崎 宗二
記事: 681
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 剣崎 宗二 » 2023年2月20日(月) 16:50

装備品の仕様の関係で結構複雑になるかと考えます。
一度これで通るかご確認ください。
(なお、万一にも条件を満たす者が複数人いた場合、並び順で前の人が優先されます。また、パーティ内のみ(パーティーを離脱しているユニットは計算しない)調べとなっております)

① var boss = $gameParty.members().find(e => e.armors().some(x => x.id == n)).name;
② var reader = $gameParty.members().find(e => e.isStateAffected(n)).name;

③はゲーム内用語辞典プラグインを詳細に調べて改造方法を考える必要があるので、今すぐはちょっと時間が無くて出せません。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年2月20日(月) 22:15

剣崎 宗二様

はじめまして。ご回答ありがとうございます! 早速試してみましたところ・・・
fanction(){ return this._name; } と表示されてしまいましたが、name の後に () を付けることで、
狙い通りのアクター名が表示されました!
装備品の仕様で結構複雑・・・とのことで、お手数をお掛けしました。感謝です!!

ただ、①に関しては「パーティー内のメンバー」ではなく「アクター全体」を対象としたいのですが、
これは難しいでしょうか?
 (トリアコンタン様の「並列パーティープラグイン」を使用していること、
  プレイヤーさんが選択した勢力以外の boss も表示する必要があるため)

②に関しては、ステートがパーティー内のメンバーで重複しないよう、離脱の際は必ず解除するか、
解除してからでないと離脱できないようするなど、気を付けて使いたいと思います。

③こちらもお手数をお掛けしているようで申し訳なく思います。詳細に調べる必要があるとのことで
少々補足をさせていただきます。

 ・this.drawActorFace($gameActors.actor(1), x, y); の記述箇所は、Window_Glossary.prototype.
  drawPicture 内の一番最後です。

 ・顔グラを表示するためには、アイテムのメモ欄にピクチャの表示を設定する必要があります。
  (例)<SGピクチャ:〇〇〇>
     <SGピクチャ位置:top>
     <SGピクチャ優先度:bottom>
     <SGピクチャ揃え:center>  ※位置、優先度、揃えは無くても表示されるようです。

今回のご回答、とても嬉しい限りで引き続きお願いしたいですが、どうぞご無理のない範囲でお願い
いたします。

まずは、ここまでありがとうございました!
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
剣崎 宗二
記事: 681
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 剣崎 宗二 » 2023年2月22日(水) 23:05

ただ、①に関しては「パーティー内のメンバー」ではなく「アクター全体」を対象としたいのですが、
これは難しいでしょうか?


ややごり押し感はありますが、こちらで通りますでしょうかね。

コード: 全て選択

$gameActors._data.find(e => e && e.armors().some(x => x.id == n)).name();


③はどうしても面倒くさいことになり今処理できないのですが、ヒントだけ。

1. this._itemData.nameによりWindow_Glossary内にて選ばれたアイテム名を取得できます。
2.①同様の方式でname()を==させ、今度はname()ではなく本体をdrawActorFaceの対応カ所に入れると宜しいかと思います。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年2月23日(木) 11:50

剣崎 宗二様

ご返信、ありがとうございます! 遅くなってすみません(汗)。
剣崎 宗二 さんが書きました:
ややごり押し感はありますが、こちらで通りますでしょうかね。

コード: 全て選択

$gameActors._data.find(e => e && e.armors().some(x => x.id == n)).name();


検証結果は以下の通りです。指定のアイテムを装備したアクターを A とした場合・・・

 ・ロードしたファイル等で、A が初めからいる場合は正常に表示される。
  その後、イベントで A を外した場合でも、A の名前は問題なく表示される。

 ・新規スタートで、A がパーティー内にいない場合、名前を表示するウィンドウ
  ( Scene_Menu 内)を表示させようとするとエラーになる。
  ※エラーはこちらの確認不足が原因だったため、画像は削除しました。
   大変失礼をいたしました m(_ _)m

 ・スタート時にはいなくても、イベントで A をパーティーに加えると正常に表示される。

こんな感じになりましたが・・・解消は可能でしょうか?

③につきましては、私のレベルではとても難しそう(汗)ですが、頂いたヒントを基に色々と
試してみようと思います。

剣崎様、手間のかかる案件にお時間を割いていただき、誠にありがとうございました!
①の件だけ、もう少々お時間をいただけましたら幸いです。

どうぞよろしくお願い致します。
最後に編集したユーザー 蓮賀まさとき on 2023年2月23日(木) 22:10 [ 編集 1 回目 ]
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年2月23日(木) 18:25

剣崎 宗二様

大変申し訳ありません。その後もさらに検証を続けました結果、エラーは私の不備が原因である
ことが判明いたしました!

プレイヤーさんが選択した勢力に限らず、一度イベント内で対象となるアクター全てに対して
「メンバーの入れ替え」→「加える」を ”配置” しておく必要があったようです。

まだ基本部分の動作テスト中で一部のアクターを加えるイベントしか配置しておらず、検証が
不十分だったことを痛感する次第です。重ねてお詫びいたします。

すみませんでした m(_ _)m

と言うワケで、本件は【一部 解決!】とし、残る③を試した結果などを投稿しつつ、
解決を目指したいと思います。

剣崎 宗二様、ご教授ありがとうございました!
最後に編集したユーザー 蓮賀まさとき on 2023年2月24日(金) 22:14 [ 編集 1 回目 ]
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
剣崎 宗二
記事: 681
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: 【一部 解決!】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 剣崎 宗二 » 2023年2月23日(木) 19:52

①②に関しては私の方の非存在チェックミスの部分もありますので、以下に修正します。
それぞれ2行になります。(1行にすることは可能ですが可読性が低下し大幅に長くなり処理2倍もあるので弊が利を上回ると考えます)
何れも「該当者なし」の場合は空白となります。


コード: 全て選択

var tempboss = $gameActors._data.find(e => e && e.armors().some(x => x.id == n));
var boss = tempboss ? tempboss.name() : "";



コード: 全て選択

var tempreader = $gameParty.members().find(e => e.isStateAffected(n));
var reader = tempreader ? tempreader.name() : "";


③に関してはツイッターの方で提案をDMいたしますのでそちらをご確認ください。
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: 【一部 解決!】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年2月23日(木) 22:08

剣崎 宗二様

お忙しい中恐れ入ります。該当者がいない時の処置までご配慮いただき、ありがとうございます!
Twitter DM の件は、先ほど返信させていただきましたのでご確認ください。

色々とお気遣いくださってありがとうございました!
また何かの機会がございましたら、その折はよろしくお願いいたします。
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
蓮賀まさとき
記事: 26
登録日時: 2020年8月30日(日) 15:00

Re: 【経過報告!】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by 蓮賀まさとき » 2023年3月08日(水) 23:16

皆さま、お世話になっております。今回は、剣崎様に頂いたヒントを基に、あれこれ試した結果を
ご報告いたします。まずは顔グラ表示の記述に ①の条件を当てはめてみましたところ・・・

コード: 全て選択

this.drawActorFace($gameActors._data.find(e => e && e.armors().some(x => x.id == n)), x, y);

防具 n番を装備しているアクターの顔グラが表示されました! そこで今度は、armors を actors に、id を name() に、n を this._itemData.name() に置き換えて実行してみました。

コード: 全て選択

this.drawActorFace($gameActors._data.find(e => e && e.actors().some(x => x.name() == this._itemData.name())), x, y);

残念ながら・・・
 Uncaught TypeError: e.actors is not a function
  at drawActorFace.$gameActors._data.find.e (SceneGlossary.js:2825)
  at Array.find (<anonymous>)
  at Window_Glossary.drawPicture (SceneGlossary.js:2825)
  at Window_Glossary.drawItemSub (SceneGlossary.js:2632)
  at Bitmap._callLoadListeners (rpg_core.js:1681)
  at Bitmap.decode (rpg_core.js:1655)
  at Bitmap._onLoad (rpg_core.js:1628)

・・・になってしまいました。not a function と言うことで、Window_Glossary.prototype.drawPicture = function の ( ) 内に e.actors を書き足したところ・・・用語辞典が起動しなくなってしまいました。
試しに e && を外してみましたら・・・

コード: 全て選択

this.drawActorFace($gameActors._data.find(e => e.actors().some(x => x.name() == this._itemData.name())), x, y);

今度は・・・
 Uncaught TypeError: Cannot read property 'actors' of null
  at drawActorFace.$gameActors._data.find.e (SceneGlossary.js:2826)
  at Array.find (<anonymous>)
  at Window_Glossary.drawPicture (SceneGlossary.js:2826)
  at Window_Glossary.drawItemSub (SceneGlossary.js:2632)
  at Bitmap._callLoadListeners (rpg_core.js:1681)
  at Bitmap.decode (rpg_core.js:1655)
  at Bitmap._onLoad (rpg_core.js:1628)

・・・に変化しました。近づいているのか遠のいているのかも良く分かりません(苦笑)が、
このエラーを解消するには、どのように記述すれば良いのでしょうか??
もしかして e.armors の e って、装備を表す Equip のことっだったりしますか?

どなたかお詳しい方、ご教授いただければ幸いです。よろしくお願いいたします。
最後に編集したユーザー 蓮賀まさとき on 2023年3月09日(木) 23:58 [ 編集 2 回目 ]
・ツクールは、「触ってる歴」だけはムダに長いです(^^;
・スクリプトは「XP」で興味を持ち、「VX」「MV」でもレイアウトを変更したり、
 画像やテキスト、新たなウィンドウを追加するなど、デフォルトの簡単な応用で
 カスタマイズを楽しんでいます。
アバター
WTR
記事: 559
登録日時: 2015年12月22日(火) 19:14

Re: 【経過報告!】アクターの名前や顔グラを、IDではなく条件で表示する際の記述を教えていただきたく・・・

投稿記事by WTR » 2023年3月09日(木) 01:32

環境を揃えるのが簡単ではないので検証は何もしてないですが
$gameActors._data から this._itemData.name() に一致する名前のアクターを検索したいのであれば

コード: 全て選択

$gameActors._data.find(e => e && e.name() === this._itemData.name());

でいいのではないかと思います。

ちゃんと動いたとされるコードは、アクターの装備をチェックしているので
複数ある装備スロットのいずれかに指定の装備があるか、という条件チェックに some を使っていますが
名前を条件にするなら some は不要です。

find で使われている e とか、some で使われている x はなんでもいいです。
配列を検索する find で e と書いているのはおそらく
配列の要素 (= element) という意味で e にしてるのかなと思いましたが、べつに1文字である必要もなく
わかりやすい名前をつけていいです。
アクターを検索しているのだから actor にするとかもアリです。

補足追記
e && e.name() の e && はとっちゃダメです。
$gameActors._data というアクターの配列を検索しています。
配列の全要素に対して name() が、this._itemData.name() に一致するかどうかチェックしますが
$gameActors._data という配列は、空要素を含みます。アクターID 0 が存在しないからです。
undefined な要素に name() を実行しようとするとエラーになるので、e && で存在チェックしています。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/

“MV:質問” へ戻る