设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

请问如何让Window_Help中的文字分行

查看数: 2458 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2015-7-13 00:44

正文摘要:

如图,我把Window_Help的大小变了一下,从640,64变成了160,480.希望能借此扩宽它的文字范围。 但是问题马上来了,文字仍然只有刚开始一行,这导致稍长一点的文字就只能显示前面一小部分,而不会分到下一行。 求问 ...

回复

RyanBern 发表于 2015-7-14 09:01:54
风清翔 发表于 2015-7-13 21:00
顺便附送修改后的脚本,希望能帮上后来者一点小忙。

首先自己解决问题了可喜可贺,接下来我们就说说'\n'的问题。
'\n'原本是一个字符,表示的是换行符,很多语言里面都有这个约定。但是,在RMXP的物品“说明”一栏中,是不支持这种转义符的书写的,如果你在“说明”的框里面写'\n'的话,它会被拆成两个字符'\'和'n',而不是作为'\n'的一个整体看待。因此,你将数据库中物品说明载入到脚本中时,'\'在脚本中的表示方法是'\\',后面再跟一个'n',连起来就是你看到的'\\n'。所以,如果把split中的参数改为"\\n"的话,脚本就变成了识别"\n"的draw_text,而不是识别换行符'\n'(在这里注意二者的区别)的draw_text。原有脚本没有考虑到数据库不支持'\n'的表示方法,因此需要做改动。
风清翔 发表于 2015-7-13 21:00:49
  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
复制代码
顺便附送修改后的脚本,希望能帮上后来者一点小忙。
风清翔 发表于 2015-7-13 18:16:57
wolves 发表于 2015-7-13 01:53
首先我们换行习惯用/n
所以在处理字符串换行的时候要用到split
把一个字符串分割成多个字符串的数组,每个 ...

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

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 认可答案

查看全部评分

wolves 发表于 2015-7-13 01:53:58
首先我们换行习惯用/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
复制代码
电脑没有电了,没进行测试- -

点评

无论是\n还是/n都无效……  发表于 2015-7-13 19:30
显示文章的时候总有人喜欢这么用,所以我就这么设定了,严格来讲是应该用\n  发表于 2015-7-13 19:25
没测试也不至于把 \n 打成 /n 吧……  发表于 2015-7-13 13:31

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 塞糖

查看全部评分

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 02:42

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表