赞 1
VIP 246
好人卡 87
积分 1
经验 34142
最后登录 2015-1-15
在线时间 323 小时
Lv1.梦旅人
梦石 0
星屑 55
在线时间 323 小时
注册时间 2010-8-21
帖子 666
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
[教程]文字自动换行
新手请进 高手勿笑
# 有一句打错了位子了 抱歉 #
当然看这篇教程之前,自己要会写点脚本
本教程是针对游戏中窗口显示文字自动换行的思路及脚本.
比如写个帮助窗口1行显示不完,比较郁闷...
写之前当然要知道字符串有半角符号(比如数学书上的句号.),
和全角符号(比如语文书上的句号。)。半角符号占1字节,
全角符号(及中文符号)占3字节(UTF-8 文字编码,杯具的3字节,
一直以为是2字节)
RMXP默认字体大小为22号,也就是说一个汉字占22像素,一个半角英文
字符占11像素....
不过这都是废话...
好,废话再说点...文字自动换行思路是把一段长字符串拆成数组(Array),再靠小循环写上去,怎么拆?
比如
text = "66RPG"
有个String的方法 scan(re) (自己F1)
使用正则表达式 re 反复对字符串进行匹配操作,并以数组的形式返回匹配成功的子字符串。
正则表达式什么的在这不会涉及...只要符合正则表达式它会自动写到数组,很方便的说...
代表所有字符的是 /./
text = "66RPG"
print text.scan(/./) => ["6","6","R","P","G"]
嘿嘿,好邪恶...
把一段长字符串按1行能排多少拆写上去,怎么办
Bitmap类有个方法 text_size(text).width 返回字符串text的像素长度
这个后面说...知道这个就好了
好,正式开工!
在脚本栏找到Window_Help后,复制,再更名为Window_Help2:
7(行) class Window_Help2 < Window_Base
为方便测试,窗口大小改为640*480:
12 super(0, 0, 640, 480)
再把定义的 set_text 清空(21..31行删完)
理论上一行能排 640 - 32 - 4 * 2 字符长度(单位:像素)
640是窗口长度(self.width),32是窗口擦去的( Bitmap.new(width - 32, height - 32) )
4*2是左右各保留4像素(美观...?)
所以,在 set_text 下写到
line_width = self.width - 32 - 4 * 2
没忘记浏览(scan....)吧?
text_array = text.scan(/./)
有数组我就喜欢用for让 i 周游列国
不过先再建个空字符,及行数
temp_text= ""
lines = 0
for i in 0...text_array.size
if self.contents.text_size(temp_str+text_array).width > line_width
self.contents.draw_text(4, line*32, line_width , 32, temp_str)
temp_str = ""
line += 1
end
if i == text_array.size - 1
self.contents.draw_text(4, line*32, line_width , 32, temp_str+text_array)
end
temp_str += text_array # 竟然打错了,不知道误导了谁没,这句应该在这
end
大功告成!本教程结束...
那是不可能的,还没解释...
for i in 0...text_array.size
让 i 从0开始 到 text_array数组组数(不包括) 周游一下
if self.contents.text_size(temp_str+text_array ).width > line_width
当一排放不下时刻画字符串时...
self.contents.draw_text(4, line*32, line_width , 32, temp_str)
刻画字符串, y值是行数,1行32像素...
temp_str = ""
line += 1
清空待用字符串及行数+1,不用详细解释
temp_str += text_array ,追加字符串
为什么最后追加?
如果已经判定 > line_width 时,为时已晚,你懂的
if i == text_array.size - 1
当 i 已经周游完毕时再刻画(最后的)字符串
当然,有个小问题,当同时满足这2个条件时会出现bug,
但是理论上应该不会同时满足,这个bug不存在
但在写其他脚本的时候注意这一点,多用next
总结一下
用temp_str代表这行准备写的字符串
看看temp_str加上下一个字符串(但是没有真正加到temp_str上)是否超出长度
超出就把temp_str写下来,清空,行数+1准备写下1行
在末尾真正地加上"下一个字符串"
当然,如果是最后一行,直接写上去
先拆后组
好,完整代码如下:(就几行,我废话太多了...)
#==============================================================================
# ■ Window_Help2
#==============================================================================
class Window_Help2 < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super ( 0 , 0 , 640 , 480 )
self .contents = Bitmap.new ( width - 32 , height - 32 )
end
#--------------------------------------------------------------------------
# ● 设置文本
# text : 窗口显示的字符串
#--------------------------------------------------------------------------
def set_text( text)
line_width = self .width - 32 - 4 * 2
text_array = text.scan ( /./)
temp_str = ""
line = 0
for i in 0 ...text_array .size
if self .contents .text_size ( temp_str+text_array) .width > line_width
self .contents .draw_text ( 4 , line*32 , line_width , 32 , temp_str)
temp_str = ""
line += 1
end
if i == text_array.size - 1
self .contents .draw_text ( 4 , line*32 , line_width , 32 , temp_str+text_array)
end
temp_str += text_array # 竟然打错了,不知道误导了谁没,这句应该在这
end
end
end
#==============================================================================
# ■ Window_Help2
#==============================================================================
class Window_Help2 < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize
super ( 0 , 0 , 640 , 480 )
self .contents = Bitmap.new ( width - 32 , height - 32 )
end
#--------------------------------------------------------------------------
# ● 设置文本
# text : 窗口显示的字符串
#--------------------------------------------------------------------------
def set_text( text)
line_width = self .width - 32 - 4 * 2
text_array = text.scan ( /./)
temp_str = ""
line = 0
for i in 0 ...text_array .size
if self .contents .text_size ( temp_str+text_array) .width > line_width
self .contents .draw_text ( 4 , line*32 , line_width , 32 , temp_str)
temp_str = ""
line += 1
end
if i == text_array.size - 1
self .contents .draw_text ( 4 , line*32 , line_width , 32 , temp_str+text_array)
end
temp_str += text_array # 竟然打错了,不知道误导了谁没,这句应该在这
end
end
end
当然要测试测试:
class Scene_Temp
def main
Window_Help2.new .set_text ( "六6RPG 半角RP,全角G,只是测试而已! " *10 )
Graphics.transition
loop do
Graphics.update
end
end
end
class Scene_Temp
def main
Window_Help2.new .set_text ( "六6RPG 半角RP,全角G,只是测试而已! " *10 )
Graphics.transition
loop do
Graphics.update
end
end
end
地图调用
$scene = Scene_Temp.new 就可以了,当然,以上代码需插在Main前
好了,差不多了,第1次写教程,别骂我就行(貌似没有教什么东东)....