查看: 4861|回复: 1

[原创发布] [新手教程]文字自动换行

  [复制链接]
梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
回帖
638
发表于 2011-2-19 10:07:32 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
[教程]文字自动换行
    新手请进 高手勿笑

# 有一句打错了位子了 抱歉 #

当然看这篇教程之前,自己要会写点脚本

本教程是针对游戏中窗口显示文字自动换行的思路及脚本.
比如写个帮助窗口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行
在末尾真正地加上"下一个字符串"
当然,如果是最后一行,直接写上去
先拆后组
好,完整代码如下:(就几行,我废话太多了...)

[pre lang="ruby" line="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[/pre]

当然要测试测试:

[pre lang="ruby" line="1"]class Scene_Temp
  def main
    Window_Help2.new.set_text("六6RPG 半角RP,全角G,只是测试而已! "*10)
    Graphics.transition
    loop do
      Graphics.update
    end
  end
end[/pre]

地图调用
$scene = Scene_Temp.new 就可以了,当然,以上代码需插在Main前

好了,差不多了,第1次写教程,别骂我就行(貌似没有教什么东东)....

点评

Scene_Temp是什么  发表于 2011-2-19 11:52
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
梦石
0
星屑
1094
在线时间
170 小时
注册时间
2008-10-29
回帖
399
发表于 2011-2-19 13:59:00 | 显示全部楼层
本帖最后由 clap_pl 于 2011-2-19 13:59 编辑

嗯 受教了 学到东西了 非常感谢
废话不多
写教程一定要把看教程的人当成什么都不懂的傻瓜(我不介意)
娓娓道来
再次感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部