Project1

标题: 请问如何让Window_Help中的文字分行 [打印本页]

作者: 风清翔    时间: 2015-7-13 00:44
标题: 请问如何让Window_Help中的文字分行

如图,我把Window_Help的大小变了一下,从640,64变成了160,480.希望能借此扩宽它的文字范围。
但是问题马上来了,文字仍然只有刚开始一行,这导致稍长一点的文字就只能显示前面一小部分,而不会分到下一行。
求问如何让Window_Help中的文字每六个字就分一行,急求各位大师解决。
作者: wolves    时间: 2015-7-13 01:53
首先我们换行习惯用/n
所以在处理字符串换行的时候要用到split
把一个字符串分割成多个字符串的数组,每个元素都是一行的文字。
  1. def set_text(text, align = 0)
  2.     # 如果文本和对齐方式的至少一方与上次的不同
  3.     if text != @text or align != @align
  4.       # 再描绘文本
  5.       self.contents.clear
  6.       self.contents.font.color = normal_color
  7.       self.contents.draw_text(4, 0, self.width - 40, 32, text, align)
  8.       @text = text
  9.       @align = align
  10.       @actor = nil
  11.     end
  12.     self.visible = true
  13.   end
复制代码
这是help里的显示文字部分

我们在帮助里查找到draw_text相关的如下资料:
  1. draw_text(x, y, width, height, str[, align])
  2. draw_text(rect, str[, align])
  3. 在该位图的矩形(x,y,width,height)或 rect(Rect)中描绘字符串 str。

  4. 如果文本的长度超过矩形的宽度的话,则自动缩放为 60% 再描绘。

  5. 水平方向默认为左对齐,但是当 align 指定为 1 时为居中对齐,指定为 2 时为右对齐。垂直方向则总为居中对齐。

  6. 这个处理需要花费时间,尽量不要在每 1 帧中重描绘字符串。

复制代码
也就是说我们不能直接通过一个draw_text来实现多行文本。
所以我们要进行分割后循环
  1. def set_text(text, align = 0)
  2.     # 如果文本和对齐方式的至少一方与上次的不同
  3.     if text != @text or align != @align
  4.       # 再描绘文本
  5.       a=text.split("/n")
  6.       self.contents.clear
  7.       self.contents.font.color = normal_color
  8.       b=0#记录行数
  9.       a.each do |i|#循环输出
  10.         self.contents.draw_text(4, 32*b, self.width - 40, 32, i, align)
  11.         b+=1
  12.       end
  13.       @text = text
  14.       @align = align
  15.       @actor = nil
  16.     end
  17.     self.visible = true
  18.   end
复制代码
电脑没有电了,没进行测试- -
作者: kuerlulu    时间: 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text
作者: 风清翔    时间: 2015-7-13 18:09
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text


这个有问题……
作者: 风清翔    时间: 2015-7-13 18:16
wolves 发表于 2015-7-13 01:53
首先我们换行习惯用/n
所以在处理字符串换行的时候要用到split
把一个字符串分割成多个字符串的数组,每个 ...

经测试无效……不知道为什么
作者: 风清翔    时间: 2015-7-13 18:22
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text


哪里复制错了吗?
作者: 风清翔    时间: 2015-7-13 18:30
kuerlulu 发表于 2015-7-13 14:07
https://rpg.blue/thread-330587-1-1.html
无脑的识别换行符draw_text

前两个冒号去了还是没用,仍然报错,我把三个冒号都去了试试,不报错了,但是没有分行效果

作者: 风清翔    时间: 2015-7-13 20:58

好吧各位,我自己解决了……
用的是3L给的https://rpg.blue/thread-330587-1-1.html
但是似乎因为这脚本不适合我的1。03的XP,或者说不适合帮助窗口,所以需要一定程度的修改。
首先,第二行的第三个冒号一定要去掉,不然必定报错。
然后这时候测试的话,虽然不报错了,但是\n的换行效果却没有

我偶然想到会不会是split("\n")这里出了问题,于是,我在Window_Help的draw_text前加上了这样一行:
p text.split("\n")
然后我看到了这个:

我注意到一个细节:似乎因为某种原因,在帮助栏里的“\n”变成了“\\n”
然后我试了试 p text.split("\\n")

……
我立刻明白了:在数据库的介绍栏里所打的文字,其中的“\n”不知因为何种原因被替换成了“\\n”,导致\n无法分行
受到这个启发,我立刻把换行脚本里的“\n”全部替换成了“\\n”

于是……就成功了……
总之感谢各位的帮助,一波三折之下终于结束了这脑浆炸裂的旅程,也算可喜可贺吧233
作者: 风清翔    时间: 2015-7-13 21:00
  1. class Bitmap
  2.   alias :draw_text2 :draw_text unless defined? draw_text2
  3.   def draw_text(*args)
  4.     case  args.size
  5.     when 2
  6.       rect = args[0]
  7.       text = args[1].split("\\n")
  8.       align = 0
  9.     when 3
  10.       rect = args[0]
  11.       text = args[1].split("\\n")
  12.       align = args[2]%3
  13.     when 5
  14.       rect = Rect.new(*(args[0,4]))
  15.       text = args[4].split("\\n")
  16.       align = 0
  17.     when 6
  18.       rect = Rect.new(*(args[0,4]))
  19.       text = args[4].split("\\n")
  20.       align = args[5]%3
  21.     else
  22.       raise ArgumentError,"错误的参数个数(#{args.size} to 2,3,5,6)."
  23.     end
  24.     return if text.empty?
  25.     wmax = [text.map{|t| self.text_size(t).width}.max,rect.width].min
  26.     h = self.text_size(text[0]).height
  27.     hmax = [h*text.size,rect.height].min
  28.     y = rect.y+(rect.height-hmax)/2
  29.     x = align==0 ? rect.x : align==2 ? rect.x+rect.width-wmax : rect.x+(rect.width-wmax)/2
  30.     text.each_with_index{|t,i|
  31.       draw_text2(x,y+i*h,wmax,h,t,align)
  32.     }
  33.     self
  34.   end
  35. end
复制代码
顺便附送修改后的脚本,希望能帮上后来者一点小忙。
作者: RyanBern    时间: 2015-7-14 09:01
风清翔 发表于 2015-7-13 21:00
顺便附送修改后的脚本,希望能帮上后来者一点小忙。

首先自己解决问题了可喜可贺,接下来我们就说说'\n'的问题。
'\n'原本是一个字符,表示的是换行符,很多语言里面都有这个约定。但是,在RMXP的物品“说明”一栏中,是不支持这种转义符的书写的,如果你在“说明”的框里面写'\n'的话,它会被拆成两个字符'\'和'n',而不是作为'\n'的一个整体看待。因此,你将数据库中物品说明载入到脚本中时,'\'在脚本中的表示方法是'\\',后面再跟一个'n',连起来就是你看到的'\\n'。所以,如果把split中的参数改为"\\n"的话,脚本就变成了识别"\n"的draw_text,而不是识别换行符'\n'(在这里注意二者的区别)的draw_text。原有脚本没有考虑到数据库不支持'\n'的表示方法,因此需要做改动。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1