【解決済み!】装備品を表示するスクリプトでNullエラー

アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

【解決済み!】装備品を表示するスクリプトでNullエラー

投稿記事by ピータンパン » 2020年4月21日(火) 21:15

お世話サマです!

以下の質問ページで
viewtopic.php?t=1362
装備品名を変数にいれて表示する以下のスクリプトが
掲載されていて、

コード: 全て選択

var base = 101; // 装備名を連続代入する変数の先頭インデックス
var equips = $gameActors.actor(アクターID).equips();
for (var i = 0; i < equips.length; i++) {
    $gameVariables.setValue(base + i, equips[i].name);
}


実際に表示はされたのですが、
いずれかの装備が外れていた場合、以下のぬるぽが発生します!

Cannot read property 'name' of null

装備スロットが空きになってるので装備品名を取得できないよって言われてるのは分かってるので
Nullだった場合、空欄を代入するようにしたいですが、
その書き方がわかりません!

どなたか回避できそうな案がありましたら
お願いします!!
最後に編集したユーザー ピータンパン on 2020年4月21日(火) 23:09 [ 編集 1 回目 ]

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

Re: 装備品を表示するスクリプトでNullエラー

投稿記事by Plasma Dark » 2020年4月21日(火) 22:07

装備スロットが空きになってるので装備品名を取得できないよって言われてるのは分かってるので
Nullだった場合、空欄を代入するようにしたいですが、
その書き方がわかりません!


単純に、 equips[i] が null であるかどうか判定して分岐するだけです。

コード: 全て選択

const base = 101; // 装備名を連続代入する変数の先頭インデックス
const equips = $gameActors.actor(アクターID).equips();
equips.forEach((equip, index) => $gameVariables.setValue(base + index, equip ? equip.name : ''));
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 装備品を表示するスクリプトでNullエラー

投稿記事by ピータンパン » 2020年4月21日(火) 23:07

Plasma Dark 様!

おお~っ!素晴らしいですっ!
バッチリでした!

''だと0が代入されたので、' 'にしてみたら
みごと、空欄が割り当てられました!

しかもリファクタリングまでされてて
ありがとござます!

For文の代わりに、forEach()で配列をループさせてるから
短くなってるんですね!
const で定数にしてるワケを調べたんですが、難しくてよくわからなかったです!
たぶん理由があるんですね!

=>は演算子かと思ったら、アロー関数式とかいうやつなんですね!
実際の条件演算子は ? で、Falseだったら''を返すということだけ理解できました!

たった一行なのにすごいノウハウが詰め込まれていて尊敬します!
ありがとござます!
またよろしくどうぞ!
アバター
Plasma Dark
記事: 676
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決済み!】装備品を表示するスクリプトでNullエラー

投稿記事by Plasma Dark » 2020年4月21日(火) 23:21

''だと0が代入されたので、' 'にしてみたら
みごと、空欄が割り当てられました!


大変失礼しました。そういえば、ゲーム変数に対して値をセットする際は、基本的に数値型を想定されているのでした。
文字列をセットしたりすることもできるにはできるのですが、半ばバグを利用しているような形なので、こういうイレギュラーが起こったりします。
お行儀よくするなら、名前ではなく装備のIDをセットするのが良いかもしれませんが、それはそれで二刀流に対する条件分岐が絡んで複雑なので、別に今のままでも大丈夫だと思います。

For文の代わりに、forEach()で配列をループさせてるから
短くなってるんですね!


今のjsでは、もう配列を操作する際にfor文を使うことのほうが珍しいくらいです。
(そもそも、生jsを書くことすら珍しいという話は置いといて……)

const で定数にしてるワケを調べたんですが、難しくてよくわからなかったです!


const で定義されたシンボルには、再代入ができなくなります。
再代入という行為自体がプログラムにバグを仕込んだり、可読性を損なう可能性があるものなので、とにかく const で定義する癖がついている、という感じです。
(この規模のコード片であれば、 var でも let でも好きなものを使えば良いと思います)

=>は演算子かと思ったら、アロー関数式とかいうやつなんですね!
実際の条件演算子は ? で、Falseだったら''を返すということだけ理解できました!


アロー関数はRPGツクール1.5系では使用できないため注意が必要ですが、forEach等の配列操作関数に対していちいち function (element) {...} などと関数を定義させられるよりよほどスッキリします。

? X : Y は三項演算子です。 ? の前の条件が真であればX、偽であればYと評価されます。
null は偽と評価されるので、その場合だけ結果がY('')になるというわけです。
アバター
ピータンパン
記事: 76
登録日時: 2020年1月15日(水) 22:40

Re: 【解決済み!】装備品を表示するスクリプトでNullエラー

投稿記事by ピータンパン » 2020年4月22日(水) 01:05

Plasma Dark 様!

詳しいご説明ありがとござます!!

たしかにツクールの変数に文字列を入れるのは好ましくないって
聞いたことあります!
基本、数値のみなのは
文字列や日付などの型をスタンダードな仕様に組み込むと
ややこしくなるからなんでしょうかね~

Plasma Dark さんが書きました:const で定義されたシンボルには、再代入ができなくなります。
再代入という行為自体がプログラムにバグを仕込んだり、可読性を損なう可能性があるものなので、とにかく const で定義する癖がついている、という感じです。
(この規模のコード片であれば、 var でも let でも好きなものを使えば良いと思います)


そういう理由でしたか!
この情報は特にありがたいですね~
だって教科書に書いてない経験則でのご意見ですからね( ;∀;)

Plasma Dark さんが書きました:アロー関数はRPGツクール1.5系では使用できないため注意が必要ですが、forEach等の配列操作関数に対していちいち function (element) {...} などと関数を定義させられるよりよほどスッキリします。

? X : Y は三項演算子です。 ? の前の条件が真であればX、偽であればYと評価されます。
null は偽と評価されるので、その場合だけ結果がY('')になるというわけです。


1.5で使えないとはびっくりです!
そうそう!アロー関数はfunction式の代替版と書いていました
代替というより進化に近い気がしますね!

三項演算子と条件演算子は同義だと思っていましたが違うのですね!
以下のサイト様を参考にしたのですが、
何も知らないペーペーには難しい内容だったみたいです!

https://developer.mozilla.org/ja/docs/W ... _Operators

とにかく色々と教えていただき、ありがとござます!!
また何かありましたらお助けくだせえ!

“MV:質問” へ戻る