【解決済み】カスタムメニュー作成プラグインで装備の表示を行う際のエラーの回避方法について

天音 衣月
記事: 10
登録日時: 2022年8月24日(水) 22:05

【解決済み】カスタムメニュー作成プラグインで装備の表示を行う際のエラーの回避方法について

投稿記事by 天音 衣月 » 2023年2月06日(月) 20:44

いつもお世話になります。

表題の通り、トリアコンタン様のカスタムメニュー作成プラグインにて、
アクターの装備を表示しようと思い、以下の設定をしておりました。

一覧取得スクリプト:this._actor.equips(); // メインメニューで選択したアクターの装備品
項目描画スクリプト:this.drawTextEx(`${item.name}`, r.x, r.y, r.width); // 任意のテキスト描画(制御文字変換あり)

ひとまずこれで装備しているスロット全ての名前の取得ができているのですが、
装備を外した際に、外したスロットでエラーになってしまう為、(console.log(item.name)で確認)
下記のトピックを参考に、
viewtopic.php?t=9240

コード: 全て選択

item.name!=0 ? this.drawTextEx(`${item.name}`, r.x, r.y, r.width):"装備なし"
item.name!='' ? this.drawTextEx(`${item.name}`, r.x, r.y, r.width):"装備なし"
item.name!=undefined ? this.drawTextEx(`${item.name}`, r.x, r.y, r.width):"装備なし"
item.name!=null ? this.drawTextEx(`${item.name}`, r.x, r.y, r.width):"装備なし"

こんな形で値の取得が出来ない場合は「装備なし」という文字列にしようと4パターン試してみましたが、
「TypeError: Cannot read property 'Text' of null」のエラーがずっと回避できず…。

フィルタスクリプトに「!!item; // null, undefined, 0, 空文字以外」というものはありましたが、
console.log(item.name)で取得状況を見ている限り、
フィルタ無しだと上から順に装備がないスロットまで名前が取得出来ているのに対して、
フィルタ有りの場合は、itemを取得した瞬間にエラーが出ていました。
これはまた別の扱いですかね…。

最悪「$dataWeapons~」等でひとつずつアクターIDを埋める形で表示する事も考えましたが、
あと一歩という所まで来ているので、何とかこの方法で取得できないものかと考えています。

お力添え頂けると幸いです。
最後に編集したユーザー 天音 衣月 on 2023年2月07日(火) 19:03 [ 編集 1 回目 ]

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

Re: カスタムメニュー作成プラグインで装備の表示を行う際のエラーの回避方法について

投稿記事by Plasma Dark » 2023年2月07日(火) 02:33

カスタムメニュー作成プラグインは設定が多く、状況の再現が面倒です。
エラーをスタックトレースも含めて示していただくほうが、解決は早いことと思います。

itemがfalsyな値(アクターの装備の場合はnull)である場合に装備なしとしたいのであれば、描画スクリプトは

コード: 全て選択

this.drawTextEx(`${item ? item.name : "装備なし"}`, r.x, r.y, r.width);


が適当であるように思われます。

TypeError: Cannot read property 'Text' of null


このエラーが出る場合、値が null であるようなシンボルに対して Text メンバを参照しようとしています。
***.Text とか ****[Text] のような記述をしていない限りこのような出力にはならないものですが、エラーメッセージは間違いないでしょうか。
ecf5DTTzl6h6lJj02
記事: 455
登録日時: 2018年12月23日(日) 13:55

Re: カスタムメニュー作成プラグインで装備の表示を行う際のエラーの回避方法について

投稿記事by ecf5DTTzl6h6lJj02 » 2023年2月07日(火) 13:07

こんにちは。
天音 衣月 さんが書きました:「TypeError: Cannot read property 'Text' of null」のエラーがずっと回避できず…。

カスタムメニュー作成プラグイン側の不具合だと思われます。

viewtopic.php?f=23&t=13339#p49095
のトピックでちょっと書いたのですが、

カスタムメニュー作成プラグイン内の Window_CustomMenuDataList クラスのメソッド、

コード: 全て選択

isCommandItem(item) {
    return item.Text;
}

で、item オブジェクトが空だった場合に Text プロパティが取得できずエラーが発生することを確認しています。

また、Window_CutomMenuCommand クラスのメソッド

コード: 全て選択

playOkSound() {
    const item = this.getItem();
    if (item.OkSound) {
        AudioManager.playSe(item.OkSound);
    } else {
        super.playOkSound();
    }
}

でも同様に、 item が空だった場合にOkSound が取得できずエラーが発生するようです。

この2つのメソッドが item オブジェクトが空だった時のチェックをしていないことがエラーの原因になっているようなので、
isCommandItem を

コード: 全て選択

isCommandItem(item) {
    return item ? item.Text : undefined;
}

playOkSound を

コード: 全て選択

playOkSound() {
    const item = this.getItem();
    if (item && item.OkSound) {
        AudioManager.playSe(item.OkSound);
    } else {
        super.playOkSound();
    }
}

に書き換えることで、エラー回避できると思います。
天音 衣月
記事: 10
登録日時: 2022年8月24日(水) 22:05

Re:カスタムメニュー作成プラグインで装備の表示を行う際のエラーの回避方法について

投稿記事by 天音 衣月 » 2023年2月07日(火) 19:03

>>Plasma Dark

ご回答ありがとうございます。

itemがfalsyな値(アクターの装備の場合はnull)である場合に装備なしとしたいのであれば、描画スクリプトは

コード: 全て選択

this.drawTextEx(`${item ? item.name : "装備なし"}`, r.x, r.y, r.width);

が適当であるように思われます。


表示する内容を${}内に書いているなら、
条件式も当然そこで書くべきでした…ご指摘有り難うございます。

ecf5DTTzl6h6lJj02様からご指摘のあった「プラグインの不具合」の修正と合わせる事で
目的を達成する事が出来ました。

また、エラーの出る質問に対してスタックトレースを示していないのは私の落ち度でした。
以後気を付けます。


>>ecf5DTTzl6h6lJj02

ご回答ありがとうございます。

カスタムメニュー作成プラグイン側の不具合だと思われます。

似た状況のトピックがあった事に気付かなかったようですね…すいません。
引用ありがとうございます。
ご指摘の修正をする事でエラーを回避する事が出来ました。
また、引用のトピックで本件とは別に参考になる内容もあり、合わせて助かりました。

本件は解決済みとさせて頂きます。
お二人共ありがとうございました。

“MV:質問” へ戻る