【解決】Window_Message でテキストの幅を取得したい

返信する
アバター
WTR
記事: 625
登録日時: 2015年12月22日(火) 19:14

【解決】Window_Message でテキストの幅を取得したい

投稿記事 by WTR »

可変サイズの Window_Message を作成しようと試みていて、文字列の幅を取得したいのですが
Window_Message 内で textSizeEx を実行すると制御文字がデコード・実行されて
入力待ちやウェイトの制御文字が余計に実行されてしまうらしいことがわかりました。
トレースをみると

コード: 全て選択

Window_Message.processEscapeCharacter	@	rmmz_windows.js:5154
Window_Base.processControlCharacter	@	rmmz_windows.js:336
Window_Message.processControlCharacter	@	rmmz_windows.js:5091
Window_Base.processCharacter	@	rmmz_windows.js:324
Window_Base.processAllText	@	rmmz_windows.js:261
Window_Base.textSizeEx	@	rmmz_windows.js:236
となっていて

コード: 全て選択

Window_Message.processEscapeCharacter
が表示タイミング関連の制御文字を扱っているようなので
これを使わずに

コード: 全て選択

Window_Base.processEscapeCharacter
が実行されるようにすればよさそうな気がするのですが
関数がどの関数から呼ばれたかで処理分けはできないらしいのでどうしたものか…

どこをどう修正するのがよさそうかアドバイスを頂けないでしょうか。


以下、困ってることの再現手順

コード: 全て選択

(() => {
	"use strict";
	const _Window_Message_startMessage = Window_Message.prototype.startMessage;
	Window_Message.prototype.startMessage = function() {
		_Window_Message_startMessage.call(this);
		console.log(this.textSizeEx(this._textState.text));
	};
})();
↾のプラグインをいれて

コード: 全て選択

◆文章:なし, なし, ウィンドウ, 下
:  :あああ\{あああ\}\!
:  :いいいい
を実行すると

コード: 全て選択

{width: 192, height: 48}
が得られて、これは期待通りなものの
\! があることによっていきなり入力待ちから始まり、空ウィンドウが表示されてしまいます。
最後に編集したユーザー WTR [ 2021年11月10日(水) 00:17 ], 累計 1 回
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
くろうど
記事: 318
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡する:

Re: Window_Message でテキストの幅を取得したい

投稿記事 by くろうど »

こんばんは。

メッセージ文字列の幅という事であれば、
Window_Base にある convertEscapeCharacters で制御文字を除去したテキストを、
同じく、Window_Base にある textWidth を使って幅を取得できないですかね?
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
chro
記事: 107
登録日時: 2021年2月14日(日) 11:26

Re: Window_Message でテキストの幅を取得したい

投稿記事 by chro »

フキダシウィンドウプラグイン
https://raw.githubusercontent.com/triac ... owPopup.js

参考になると思います。

Window_Message.prototype.createVirtualTextState
内の
virtual.drawing = false;
で関数経由を判定して処理分けしています。
アバター
WTR
記事: 625
登録日時: 2015年12月22日(火) 19:14

Re: Window_Message でテキストの幅を取得したい

投稿記事 by WTR »

くろうどさん chro さん

返信ありがとうございます。
MV で作ってた時は textWidth でどうにかしようとしていた気がします。
せっかく制御文字込みの状態がわかる関数が追加されたのでうまく活用したいと思って質問させていただきました。

描画しないときは Window_Base の処理を呼ぶことにすればいいんですね。

コード: 全て選択

(() => {
	"use strict";
	const _Window_Message_processEscapeCharacter = Window_Message.prototype.processEscapeCharacter;
	Window_Message.prototype.processEscapeCharacter = function(code, textState) {
		if (textState.drawing) {
			_Window_Message_processEscapeCharacter.apply(this, arguments);
		} else {
			Window_Base.prototype.processEscapeCharacter.apply(this, arguments);
		}
	};
})();
textSizeEx ってそもそもこうあるべきものではないかという気がしますが…
コアスクリプトでは Window_Message 内で使ってないからいいということなのか。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
返信する

“MZ:質問”に戻る