GameMaker 日本語掲示板

draw_text_ext()のワードラップを日本語に対応させたい!

5 コメント
views
16 フォロー

draw_text_ext()でテキストエリア幅を指定するとその幅で自動的にワードラップしてくれますが、これは欧米のスペースを含む文章に限られています。日本語などの言語では文章にスペースを含まないので適切にワードラップされません。

そのことをフォーラムでちょっと話したところ、YoYoGamesのRussell氏が、欲しい機能の要望を出してくれれば機能追加を検討すると言ってくれました。

そこでですが、みなさん日本語のワードラップ機能をリクエストするとしたらどんな機能にしてほしいですか?

  • テキストエリア幅を指定する
  • 行の長さがテキストエリア幅に達したら単語の途中でも改行する

これで本当に最低限の日本語のワードラップにはなります。
でもできれば禁則処理をして欲しいです。

  • 行頭禁則文字を指定できる
    」』)}】>≫]
    ぁぃぅぇぉっゃゅょァィゥェォッャュョ
    、。,.
    
  • 分離禁止文字を指定できる
    1,000
    43/100
    today
    
  • 行末禁則文字を指定できる
    「『({【<≪[
    
  • 行末をどう処理するか指定できる
    ぶら下がり、追い込み、追い出し
    

ここまで要望できれば理想的ですが、本格的すぎてYoYoとしては「そこまではちょっと」となりそうです……
正直、ちゃんとした禁則処理を説明することも自分には難しいです。

皆さんとしてはどんな機能にしてほしいですか?
「最低限これは実装して欲しい」というものがあったら教えて下さい。
YoYoが「それくらいだったら実装してやるよ!」と言いそうなものをまとめたいと思っています。

どんな要望を出せば、日本語ユーザーみんなに便利なものになるのか知りたいです。
なんでもご意見をください。

asa
作成: 2022/09/29 (木) 23:36:46
通報 ...
1

私が欲しい機能をまとめて要望を出しました。
聞いてもらえるといいなあ。
日本語テキストをちゃんと扱えるようになれば、日本語ユーザーも増えると思う。

2
生高橋 2022/10/06 (木) 08:45:32

違うバージョンのGameMakerをインストールできるようにしてほすぃ

3

これはほんとにそう思う!
お金持ちならPCを複数台持って…そんなの無理!

4
yOichi 2022/10/22 (土) 13:41:43

行頭、行末文字までやりだすとわかりにくく、他の言語の同様のルールに対応しなくちゃならないので大変かと思いますし、draw_text_ext() を日本語に対応させるだけでそこそこ大変な気がするので、まずはそこで十分な気が。
プロの現場とかでも、行頭、行末に関しては手入力というのがほとんどでしたし(機能がない場合と、よみやすさにこだわると手動改行になってしまう場合の二種類)。

5

公式が用意してくれるなら不要かもですが、昔作った自動改行(正確には文字列分割して、for文で draw_text() する想定) のスクリプトを添付しておきますね。

分割文字 (sep) が見つかればそれで改行 (分割) できますし、warpに文字の幅を指定すれば string_width() で文字幅を計算して改行するようにできます。

/// @description 文字列分割 (自動折返し).
/// @param str 分割する文字列
/// @param sep 分割文字
/// @param wrap 分割する幅
/// @return 分割された文字列 (array 1d)
function string_split2(argument0, argument1, argument2) {

	var str  = argument0; // source string.
	var sep  = argument1; // seperate string.
	var wrap = argument2; // wrap width.

	// 戻り値.
	var ret = [];
	var s = ""; // 切り出し中の文字列.
	var idx = 0; // 文字の位置.
	while(true) {
		var s2 = string_char_at(str, 1);
		if(s2 == sep) {
			// 分割文字.
			ret[idx] = s;
			idx++;
			s = "";
		}
		else if(string_width(s + s2) > wrap) {
			// 自動折返し.
			ret[idx] = s;
			idx++;
			s = s2;
		}
		else {
			s += s2;
		}
		str = string_copy(str, 2, 65535);
		if(string_length(str) <= 0) {
			// 終わり.
			if(string_length(s) > 0) {
				// 空文字でないので追加
				ret[idx] = s;
			}
			break;
		}
	}
	
	// 返却する.
	return ret;
}