【解決済み】YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

アバター
utako
記事: 26
登録日時: 2018年5月10日(木) 02:18

【解決済み】YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

投稿記事by utako » 2019年5月10日(金) 07:33

YEP_MessageCore.jsのnameBoxについて、
スクリプトの$gameMessage.add()で2つ以上のテキストを渡すと、後から渡したnameBoxの情報で前のテキストが上書きされてしまいます。
例えば次のようにテキストa,bを$gameMessage.add()した時、テキストaの時点でbのnameBoxが表示されてしまいます。
textab.png

今回はプラグイン側からnameBoxが上書きされないように文章を表示させる方法を探しています。
どうかお知恵をお貸しください。


なぜnameBoxが上書きされてしまうかについて、
$gameMessage.add()でテキストをWindow_Messageに渡した場合、
Window_Message.prototype.convertEscapeCharacters
(Window_Message.prototype.convertNameBox)
に全てのテキストを一度に渡してしまうためと思われます。


スクリプトコマンド側でnameBox付き文章を表示させる場合は、this.setWaitMode('message')を加えた上で、
scriptab.png

とコマンドを切って書くことでテキストaとテキストbが分割して渡されるため、正常に表示することができます。
ですが今回はメッセージ表示をプラグイン側で行っているため、エディタを使わずなんとかしたいです。
エディタを介さないのであれば、プラグイン側に記述するでも、YEP_MessageCore.jsを改造するでも、Window_Messageを書き換えるでも。方法は問いません。

OS:Windows10
MV本体:1.6.2
YEP_MessageCore.js:1.19
最後に編集したユーザー utako on 2019年5月11日(土) 14:15 [ 編集 1 回目 ]

--------------------------------------------------------------------------

ゲーム作りました
https://freegame-mugen.jp/roleplaying/game_7109.html

MVプラグインも作りました
https://github.com/asakayu/Mihil_RPGMakerMV_plugins
コードレビュー歓迎します
Please feel free to throw me Masakari!
アバター
剣崎 宗二
記事: 681
登録日時: 2016年11月12日(土) 20:36
連絡を取る:

Re: YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

投稿記事by 剣崎 宗二 » 2019年5月10日(金) 13:10

お疲れ様です。

ざっくりとした考え方にはなりますが、別の制御文字を入れ、startMessageでconvertEscapeCharacterが行われる前にその制御文字でallMessageを切り分けて別のフィールドに入れておき、_textStateに(onEndOfText等で)1部分ずつ押し込むのがよろしいのではないかと考えます。
最後に編集したユーザー 剣崎 宗二 on 2019年5月10日(金) 15:31 [ 編集 1 回目 ]
----
-出先に居る場合回答が未テスト状態である事が多い為、テストは重々にお願いいたします。
-基本自分や友人の問題解決は自分で1からプラグインを書いているので、「こういうプラグインはありますか」に対しては助けになれません。ご了承ください。
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

投稿記事by 奏ねこま » 2019年5月10日(金) 14:19

きちんと対応するならconverEscapeCharactersではなくprocessEscapeCharacterで処理されるように改修するのが良いでしょうね。
制御文字の方式が標準とは異なるのでobtainEscapeCodeやobtainEscapeParamのカスタムも必要になります。
ご自身で改修されるなら「¥C[n]」の実装が参考になると思いますのでそちらをご覧ください。
アバター
utako
記事: 26
登録日時: 2018年5月10日(木) 02:18

Re: YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

投稿記事by utako » 2019年5月10日(金) 14:55

お二方共、ありがとうございます!
文字列側の処理にフックして分割させるというやり方ですね。
制御文字を利用するという方法は思いつかなかったので、いただいた情報を元にちょっと試行錯誤してみます。
最後に編集したユーザー utako on 2019年5月11日(土) 15:02 [ 編集 1 回目 ]
アバター
utako
記事: 26
登録日時: 2018年5月10日(木) 02:18

Re: YEP_MessageCore.jsでnameBoxテキストが上書きされてしまう

投稿記事by utako » 2019年5月11日(土) 14:13

おかげさまで、プラグイン側から正常にnameBoxを表示させることができるようになりました。

コード: 全て選択

// YEP_MessageCore.jsの
// Window_Message.prototype.convertEscapeCharactersの
// text = this.convertNameBox(text);
// をコメントアウト

const _Window_Message_processEscapeCharacter = Window_Message.prototype.processEscapeCharacter
Window_Message.prototype.processEscapeCharacter = function(code, textState) {
    switch (code) {
        case 'N':
            this.convertEscapeNameBox(textState)
            break;
        case 'NC':
            this.convertEscapeNameBox(textState, 3)
            break;
        case 'NR':
            this.convertEscapeNameBox(textState, 5)
            break;
        default:
            _Window_Message_processEscapeCharacter.apply(this, arguments)
            break;
    }
}

Window_Message.prototype.convertEscapeNameBox = function(textState, num) {
    let text = /\<(.*?)\>/.exec( textState.text.slice(textState.index) )[0]

    if (text) {
        textState.index += text.length;
        text = text.replace(/\<(.*?)\>/gi, function() {
            return Yanfly.nameWindow.refresh(arguments[1], num);
        }, this);
    }
};


ab.png
ab.png (40.88 KiB) 閲覧数: 2955 回


お二方ともアプローチの仕方が違って、大変勉強になりました。
ありがとうございました!
--------------------------------------------------------------------------

ゲーム作りました
https://freegame-mugen.jp/roleplaying/game_7109.html

MVプラグインも作りました
https://github.com/asakayu/Mihil_RPGMakerMV_plugins
コードレビュー歓迎します
Please feel free to throw me Masakari!

“MV:質問” へ戻る