其实中文富文本大家可以直接用scribble插件的,我因为情况特殊(使用了自制bdf文件,因为一直需要加漏掉的字所以也没法安装到系统里来让scribble使用,于是插件没法使用我的字体),所以需要自己解决别人不会碰到的问题
目前的方案是直接在字符串里加入换行符,draw_text可以直接处理换行符,减少draw的性能消耗
function fullwidth_text(_string,_width) //函数的参数为需要处理的字符串和期望绘制的宽度
draw_set_font(xx)//设定为期望的字体,不然字符串宽度无法正常处理
var out=""//储存最终输出的带换行符的字符串用的变量
var line=""//用于处理每行字符串的变量
var lineWidth=0//储存当前这行宽度用的变量
var i=1//gamemaker的string_char_at非常贴心的让第一个字符的序号是1,老是会搞混
var length=string_length(_string)//字符串字符数
while(i<=length)
{
var c=string_char_at(_string,i)//第i个字符
i+=1
// 处理显式换行,如果字符串里自己有换行符,则识别其并换行
//注意换行符\n视作一个单独的字符
//如果使用csv等文件导入字符串,他会将\n视作文本,而转化成\\n,此时需要用string_replace_all(_str, "\\n", "\n")处理
if (c == "\n") {
out += line + "\n";
line = "";
lineWidth = 0;
continue;
}
//如果加上当前处理的字符的宽度不超过宽度,则在文本上加上字符,宽度上加上字符宽度,continue处理下一个字符
var characterWidth=string_width(c)
if (lineWidth+ characterWidth<= _width) {
line += c;
lineWidth+=characterWidth;
continue;
}
//如果超过宽度,则输出当前行并开始新一行
out += line + "\n";//给当前的行加上换行符,加入最后输出的字符串
//把正在处理的字符串加入下一行
line = c;
lineWidth=characterWidth;
}
out+=line//加上最后的部分
return out//输出加了换行符的字符串
之后应该加上逗号句号等不应该出现在句首的字符的判断,不过我还没搞好


暂无关于此日志的评论。