こんばんは。
サンシロ様のSAN_EntireEscapeCharacterというプラグインで一定条件のときに
デバッグ画面で不具合が発生することが判明しました。
プラグインは以下からダウンロードできます。
https://drive.google.com/drive/folders/ ... 2o1ZzhuTGs
こちらのプラグインの中身を覗いてみましたが私の知識では原因がわからなかったので
ご質問させていただきます。
因みにツクールのバージョンは最新のMac版を使用しています。
一定条件というのはスイッチの最大数が201を超える時にデバッグ画面(変数値やスイッチの値の表示)
で下にスクロールしてスイッチの201以降を表示しようとするとエラー画面が表示されるというものです。
逆に言えば200以内のスイッチ数ならエラーは出ませんが
201以上のスイッチが作れないので困ります。
スクリプトに詳しい方、原因がわかりましたら教えていただきたく思います。
万一、うちの環境だとエラー出ないよって場合も教えていただけると嬉しいです。
よろしくお願いいたします。
【解決済み】SAN_EntireEscapeCharacterにて不具合が発生しました
【解決済み】SAN_EntireEscapeCharacterにて不具合が発生しました
最後に編集したユーザー にゃたま [ 2018年10月31日(水) 12:39 ], 累計 1 回
Re: SAN_EntireEscapeCharacterにて不具合が発生しました
こんにちは。
コードを拝見しました。
問題はdrawTextに渡されるtextがtoStringメソッドを呼べない場合が存在することにあります。今回はundefinedが渡されているようです。
なので解決方法としては、対象プラグインのdrawTextを以下のように変更するとよいかと思います。
注*toStringメソッドを利用できないundefindedかnull以外の値を渡すと依然としてエラーが発生するかと思いますが、多分そんな値をdrawTextに渡すことはないだろうという判断です。
なお、なぜundefinedが渡されるかと言えば、Window_DebugEdit内においてスイッチ名が存在しないものを描画する場合があるからのようです(maxItemsが10個と決め打ちされているのと関係しているかも。ちょっとこの辺よく読んでません)。
例えば201個のスイッチを設定した場合、Window_DebugEditのitemNameメソッド内において201個目まではSystem.jsonから作成するスイッチの名前データが初期化されるため、文字列として処理できます。
ですが、残り9個のスイッチについては未定義のデータが返されてしまっているようです。
この未定義データが対象プラグインのdrawTextに渡されてしまうのでエラーが発生していました。
したがって「200以内なら発生しない」という条件は正しくなく、例えば181という数値でも発生するかと思います。
以上、何か参考になりましたら幸いです。
コードを拝見しました。
問題はdrawTextに渡されるtextがtoStringメソッドを呼べない場合が存在することにあります。今回はundefinedが渡されているようです。
なので解決方法としては、対象プラグインのdrawTextを以下のように変更するとよいかと思います。
注*toStringメソッドを利用できないundefindedかnull以外の値を渡すと依然としてエラーが発生するかと思いますが、多分そんな値をdrawTextに渡すことはないだろうという判断です。
コード: 全て選択
Sanshiro.EntireEscapeCharacter.Window_Base_drawText = Window_Base.prototype.drawText;
Window_Base.prototype.drawText = function(text, x, y, maxWidth, align) {
var regex = /(\\[VNPCI](\[\d+\]))|(\\[G{}\\|$.|!><^])/g;
const canToString = (text !== undefined) && (text !== null);
if (canToString && regex.test(text.toString())) {
if (!Sanshiro.EntireEscapeCharacter.dontApplyWindowList.contains(this.constructor.name)) {
this.drawTextEx(text.toString(), x, y);
return;
} else {
text = text.replace(regex, '');
}
}
Sanshiro.EntireEscapeCharacter.Window_Base_drawText.call(this, text, x, y, maxWidth, align);
};
なお、なぜundefinedが渡されるかと言えば、Window_DebugEdit内においてスイッチ名が存在しないものを描画する場合があるからのようです(maxItemsが10個と決め打ちされているのと関係しているかも。ちょっとこの辺よく読んでません)。
例えば201個のスイッチを設定した場合、Window_DebugEditのitemNameメソッド内において201個目まではSystem.jsonから作成するスイッチの名前データが初期化されるため、文字列として処理できます。
ですが、残り9個のスイッチについては未定義のデータが返されてしまっているようです。
この未定義データが対象プラグインのdrawTextに渡されてしまうのでエラーが発生していました。
したがって「200以内なら発生しない」という条件は正しくなく、例えば181という数値でも発生するかと思います。
以上、何か参考になりましたら幸いです。
【Twitter】https://twitter.com/TsumioNtGame/
【GitHub】https://github.com/Tsumio/rmmv-plugins
有償の依頼も募集中。
今まで有償で制作したものは実績をご覧ください。
【GitHub】https://github.com/Tsumio/rmmv-plugins
有償の依頼も募集中。
今まで有償で制作したものは実績をご覧ください。
Re: SAN_EntireEscapeCharacterにて不具合が発生しました
ツミオ様
ご返信いただきありがとうございます。
わざわざ詳細な発生の原因まで教えていただきありがとうございました。
コードを書き換えたところエラーなく無事動作できました。
やはり私には理解の範疇を超えるというか難しすぎたようです。
200以内でも発生したのですね。私の環境では201以上でしかエラーしませんでした。
理由はよくわかりませんでしたが無事解決できてよかったです。
本当にありがとうございました。
ご返信いただきありがとうございます。
わざわざ詳細な発生の原因まで教えていただきありがとうございました。
コードを書き換えたところエラーなく無事動作できました。
やはり私には理解の範疇を超えるというか難しすぎたようです。
200以内でも発生したのですね。私の環境では201以上でしかエラーしませんでした。
理由はよくわかりませんでしたが無事解決できてよかったです。
本当にありがとうございました。